Skip to content

Commit

Permalink
HTML report improved : chart of relations
Browse files Browse the repository at this point in the history
  • Loading branch information
Halleck45 committed Sep 1, 2014
1 parent 4e49da9 commit e1cb9b9
Show file tree
Hide file tree
Showing 6 changed files with 531 additions and 97 deletions.
Binary file modified build/phpmetrics.phar
Binary file not shown.
43 changes: 43 additions & 0 deletions src/Hal/Application/Formater/Summary/Html.php
Expand Up @@ -57,17 +57,60 @@ public function terminate(ResultCollection $collection, ResultCollection $groupe
$twig = new \Twig_Environment($loader, array('cache' => false));
$twig->addExtension(new FormatingExtension($this->validator));


$bound = $this->bound->calculate($collection);
return $twig->render('summary/report.html.twig', array(
'keys' => array_keys(current($collection->asArray()))
, 'results' => $collection->asArray()
, 'groupedResults' => $groupedResults
, 'relations' => $this->prepareDataRelations($collection)
, 'ruleSet' => $this->validator->getRuleSet()
, 'bounds' => $bound
, 'withOOP' => null !== $bound->getSum('instability')
));
}

/**
* Build flat array of relations
*
* @param ResultCollection $collection
* @return array
*/
private function prepareDataRelations(ResultCollection $collection) {
$array = array();

// map of classes an relations
foreach($collection as $item) {

// case of oop is disabled
if(!$item->getOOP()) {
continue;
}

foreach($item->getOOP()->getClasses() as $class) {
$array[$class->getName()] = (object) array(
'name' => $class->getName()
, 'size' => 3000
, 'relations' => array_merge(
!is_null($class->getParent()) ? array($class->getParent()) : array()
, $class->getDependencies()
)
);
}
}

// dependency can not be in the parsed sources (for example, native PHP classes)
foreach($array as $class => $infos) {
foreach($infos->relations as $relation) {
if(!isset($array[$relation])) {
$array[$relation] = (object) array('name' => $relation, 'relations' => array(), 'size' => 3000);
}
// array_push($array[$relation]->imports, $class);
}
}
return array_values($array);
}

/**
* @inheritdoc
*/
Expand Down
137 changes: 137 additions & 0 deletions templates/html/assets/bootstrap-tabs.js.twig
@@ -0,0 +1,137 @@
{% autoescape false %}
<script type="text/javascript">
/* ========================================================================
* Bootstrap: tab.js v3.2.0
* http://getbootstrap.com/javascript/#tabs
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// TAB CLASS DEFINITION
// ====================
var Tab = function (element) {
this.element = $(element)
}
Tab.VERSION = '3.2.0'
Tab.TRANSITION_DURATION = 150
Tab.prototype.show = function () {
var $this = this.element
var $ul = $this.closest('ul:not(.dropdown-menu)')
var selector = $this.data('target')
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
}
if ($this.parent('li').hasClass('active')) return
var previous = $ul.find('.active:last a')[0]
var e = $.Event('show.bs.tab', {
relatedTarget: previous
})
$this.trigger(e)
if (e.isDefaultPrevented()) return
var $target = $(selector)
this.activate($this.closest('li'), $ul)
this.activate($target, $target.parent(), function () {
$this.trigger({
type: 'shown.bs.tab',
relatedTarget: previous
})
})
}
Tab.prototype.activate = function (element, container, callback) {
var $active = container.find('> .active')
var transition = callback
&& $.support.transition
&& (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
function next() {
$active
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
element.addClass('active')
if (transition) {
element[0].offsetWidth // reflow for transition
element.addClass('in')
} else {
element.removeClass('fade')
}
if (element.parent('.dropdown-menu')) {
element.closest('li.dropdown').addClass('active')
}
callback && callback()
}
$active.length && transition ?
$active
.one('bsTransitionEnd', next)
.emulateTransitionEnd(Tab.TRANSITION_DURATION) :
next()
$active.removeClass('in')
}
// TAB PLUGIN DEFINITION
// =====================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.tab')
if (!data) $this.data('bs.tab', (data = new Tab(this)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.tab
$.fn.tab = Plugin
$.fn.tab.Constructor = Tab
// TAB NO CONFLICT
// ===============
$.fn.tab.noConflict = function () {
$.fn.tab = old
return this
}
// TAB DATA-API
// ============
$(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
e.preventDefault()
Plugin.call($(this), 'show')
})
}(jQuery);
</script>
{% endautoescape %}
92 changes: 92 additions & 0 deletions templates/html/assets/styles.css.twig
@@ -0,0 +1,92 @@
.validate-critical, .critical {
background-color:#B01E00 !important;
color:#FFF;
}
.validate-warning, .warning {
background-color:#f4b300 !important;
color:#333;
}
.validate-good, .good {
background-color:#78ba00 !important;
color:#FFF;
}
.validate-unknown, .unknown {
}

.table {
font-size:0.8em;
}
.table thead {
font-weight:normal;
}

.mytable td {
width:4%;
text-align:center;
}
.mytable .sep {
border-left:1px solid #CCC;
}


#chart-tableview .critical,
#chart-tableview .warning,
#chart-tableview .good,
#chart-tableview .unknown {
display:block;
text-align: center;
}

#svg-custom,
#svg-maintenability,
#svg-abstractness {
width:300px;
height:300px;
}
.svg-main {
margin: 0 auto;
width:960px;;
}


/* ---- maintenability ---- */
#svg-maintenability svg circle:hover {
fill:steelblue !important;
}

/* ---- relations ---- */
.node {
font: 300 11px "Helvetica Neue", Helvetica, Arial, sans-serif;
fill: #bbb;
}
.node:hover {
fill: #000;
}
.link {
stroke: steelblue;
stroke-opacity: .4;
fill: none;
pointer-events: none;
}
.node:hover,
.node--source,
.node--target {
font-weight: 700;
}
.node--source {
fill: #2ca02c;
}
.node--target {
fill: #d62728;
}
.link--source,
.link--target {
stroke-opacity: 1;
stroke-width: 2px;
}
.link--source {
stroke: #d62728;
}
.link--target {
stroke: #2ca02c;
}

0 comments on commit e1cb9b9

Please sign in to comment.