init
This commit is contained in:
167
vendor/yiisoft/yii2-debug/models/timeline/DataProvider.php
vendored
Normal file
167
vendor/yiisoft/yii2-debug/models/timeline/DataProvider.php
vendored
Normal file
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
/**
|
||||
* @link http://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license http://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\debug\models\timeline;
|
||||
|
||||
use yii\data\ArrayDataProvider;
|
||||
use yii\debug\panels\TimelinePanel;
|
||||
|
||||
/**
|
||||
* DataProvider implements a data provider based on a data array.
|
||||
*
|
||||
* @property array $rulers This property is read-only.
|
||||
*
|
||||
* @author Dmitriy Bashkarev <dmitriy@bashkarev.com>
|
||||
* @since 2.0.8
|
||||
*/
|
||||
class DataProvider extends ArrayDataProvider
|
||||
{
|
||||
/**
|
||||
* @var TimelinePanel
|
||||
*/
|
||||
protected $panel;
|
||||
|
||||
|
||||
/**
|
||||
* DataProvider constructor.
|
||||
* @param TimelinePanel $panel
|
||||
* @param array $config
|
||||
*/
|
||||
public function __construct(TimelinePanel $panel, $config = [])
|
||||
{
|
||||
$this->panel = $panel;
|
||||
parent::__construct($config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
protected function prepareModels()
|
||||
{
|
||||
if (($models = $this->allModels) === null) {
|
||||
return [];
|
||||
}
|
||||
$child = [];
|
||||
foreach ($models as $key => &$model) {
|
||||
$model['timestamp'] *= 1000;
|
||||
$model['duration'] *= 1000;
|
||||
$model['child'] = 0;
|
||||
$model['css']['width'] = $this->getWidth($model);
|
||||
$model['css']['left'] = $this->getLeft($model);
|
||||
$model['css']['color'] = $this->getColor($model);
|
||||
foreach ($child as $id => $timestamp) {
|
||||
if ($timestamp > $model['timestamp']) {
|
||||
++$models[$id]['child'];
|
||||
} else {
|
||||
unset($child[$id]);
|
||||
}
|
||||
}
|
||||
$child[$key] = $model['timestamp'] + $model['duration'];
|
||||
}
|
||||
return $models;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getting HEX color based on model duration
|
||||
* @param array $model
|
||||
* @return string
|
||||
*/
|
||||
public function getColor($model)
|
||||
{
|
||||
$width = isset($model['css']['width']) ? $model['css']['width'] : $this->getWidth($model);
|
||||
foreach ($this->panel->colors as $percent => $color) {
|
||||
if ($width >= $percent) {
|
||||
return $color;
|
||||
}
|
||||
}
|
||||
return '#d6e685';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the offset left item, percentage of the total width
|
||||
* @param array $model
|
||||
* @return float
|
||||
*/
|
||||
public function getLeft($model)
|
||||
{
|
||||
return $this->getTime($model) / ($this->panel->duration / 100);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns item duration, milliseconds
|
||||
* @param array $model
|
||||
* @return float
|
||||
*/
|
||||
public function getTime($model)
|
||||
{
|
||||
return $model['timestamp'] - $this->panel->start;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns item width percent of the total width
|
||||
* @param array $model
|
||||
* @return float
|
||||
*/
|
||||
public function getWidth($model)
|
||||
{
|
||||
return $model['duration'] / ($this->panel->duration / 100);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns item, css class
|
||||
* @param array $model
|
||||
* @return string
|
||||
*/
|
||||
public function getCssClass($model)
|
||||
{
|
||||
$class = 'time';
|
||||
$class .= (($model['css']['left'] > 15) && ($model['css']['left'] + $model['css']['width'] > 50)) ? ' right' : ' left';
|
||||
return $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* ruler items, key milliseconds, value offset left
|
||||
* @param int $line number of columns
|
||||
* @return array
|
||||
*/
|
||||
public function getRulers($line = 10)
|
||||
{
|
||||
if ($line == 0) {
|
||||
return [];
|
||||
}
|
||||
$data = [0];
|
||||
$percent = ($this->panel->duration / 100);
|
||||
$row = $this->panel->duration / $line;
|
||||
$precision = $row > 100 ? -2 : -1;
|
||||
for ($i = 1; $i < $line; $i++) {
|
||||
$ms = round($i * $row, $precision);
|
||||
$data[$ms] = $ms / $percent;
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* ```php
|
||||
* [
|
||||
* 0 => string, memory usage (MB)
|
||||
* 1 => float, Y position (percent)
|
||||
* ]
|
||||
* @param array $model
|
||||
* @return array|null
|
||||
*/
|
||||
public function getMemory($model)
|
||||
{
|
||||
if (empty($model['memory'])) {
|
||||
return null;
|
||||
}
|
||||
return [
|
||||
sprintf('%.2f MB', $model['memory'] / 1048576),
|
||||
$model['memory'] / ($this->panel->memory / 100)
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
84
vendor/yiisoft/yii2-debug/models/timeline/Search.php
vendored
Normal file
84
vendor/yiisoft/yii2-debug/models/timeline/Search.php
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
/**
|
||||
* @link http://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license http://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\debug\models\timeline;
|
||||
|
||||
use yii\debug\components\search\Filter;
|
||||
use yii\debug\components\search\matchers\GreaterThanOrEqual;
|
||||
use yii\debug\models\search\Base;
|
||||
use yii\debug\panels\TimelinePanel;
|
||||
|
||||
/**
|
||||
* Search model for timeline data.
|
||||
*
|
||||
* @author Dmitriy Bashkarev <dmitriy@bashkarev.com>
|
||||
* @since 2.0.8
|
||||
*/
|
||||
class Search extends Base
|
||||
{
|
||||
/**
|
||||
* @var string attribute search
|
||||
*/
|
||||
public $category;
|
||||
/**
|
||||
* @var integer attribute search
|
||||
*/
|
||||
public $duration = 0;
|
||||
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
[['category', 'duration'], 'safe'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function attributeLabels()
|
||||
{
|
||||
return [
|
||||
'duration' => 'Duration ≥'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns data provider with filled models. Filter applied if needed.
|
||||
*
|
||||
* @param array $params $params an array of parameter values indexed by parameter names
|
||||
* @param TimeLinePanel $panel
|
||||
* @return DataProvider
|
||||
*/
|
||||
public function search($params, $panel)
|
||||
{
|
||||
$models = $panel->models;
|
||||
$dataProvider = new DataProvider($panel, [
|
||||
'allModels' => $models,
|
||||
'sort' => [
|
||||
'attributes' => ['category', 'timestamp']
|
||||
],
|
||||
]);
|
||||
|
||||
if (!($this->load($params) && $this->validate())) {
|
||||
return $dataProvider;
|
||||
}
|
||||
|
||||
$filter = new Filter();
|
||||
$this->addCondition($filter, 'category', true);
|
||||
if ($this->duration > 0) {
|
||||
$filter->addMatcher('duration', new GreaterThanOrEqual(['value' => $this->duration / 1000]));
|
||||
}
|
||||
$dataProvider->allModels = $filter->filter($models);
|
||||
|
||||
return $dataProvider;
|
||||
}
|
||||
|
||||
}
|
||||
180
vendor/yiisoft/yii2-debug/models/timeline/Svg.php
vendored
Normal file
180
vendor/yiisoft/yii2-debug/models/timeline/Svg.php
vendored
Normal file
@@ -0,0 +1,180 @@
|
||||
<?php
|
||||
/**
|
||||
* @link http://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license http://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\debug\models\timeline;
|
||||
|
||||
use yii\base\BaseObject;
|
||||
use yii\debug\panels\TimelinePanel;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/**
|
||||
* Svg is used to draw a graph using SVG
|
||||
*
|
||||
* @author Dmitriy Bashkarev <dmitriy@bashkarev.com>
|
||||
* @since 2.0.8
|
||||
*/
|
||||
class Svg extends BaseObject
|
||||
{
|
||||
/**
|
||||
* @var int Max X coordinate
|
||||
*/
|
||||
public $x = 1920;
|
||||
/**
|
||||
* @var int Max Y coordinate
|
||||
*/
|
||||
public $y = 40;
|
||||
/**
|
||||
* @var string Stroke color
|
||||
*/
|
||||
public $stroke = '#1e6823';
|
||||
/**
|
||||
* @var array Listen messages panels
|
||||
*/
|
||||
public $listenMessages = ['log', 'profiling'];
|
||||
/**
|
||||
* @var array Color indicators svg graph.
|
||||
*/
|
||||
public $gradient = [
|
||||
10 => '#d6e685',
|
||||
60 => '#8cc665',
|
||||
90 => '#44a340',
|
||||
100 => '#1e6823'
|
||||
];
|
||||
/**
|
||||
* @var string Svg template
|
||||
*/
|
||||
public $template = '<svg width="{x}" height="{y}" viewBox="0 0 {x} {y}" preserveAspectRatio="none"><defs>{linearGradient}</defs><g><polygon points="{polygon}" fill="url(#gradient)"/><polyline points="{polyline}" fill="none" stroke="{stroke}" stroke-width="1"/></g></svg>';
|
||||
|
||||
/**
|
||||
* ```php
|
||||
* [
|
||||
* [x, y]
|
||||
* ]
|
||||
* ```
|
||||
* @var array Each point is define by a X and a Y coordinate.
|
||||
*/
|
||||
protected $points = [];
|
||||
/**
|
||||
* @var TimelinePanel
|
||||
*/
|
||||
protected $panel;
|
||||
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function __construct(TimelinePanel $panel, $config = [])
|
||||
{
|
||||
parent::__construct($config);
|
||||
$this->panel = $panel;
|
||||
foreach ($this->listenMessages as $panel) {
|
||||
if (isset($this->panel->module->panels[$panel]->data['messages'])) {
|
||||
$this->addPoints($this->panel->module->panels[$panel]->data['messages']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
if ($this->points === []) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return strtr($this->template, [
|
||||
'{x}' => StringHelper::normalizeNumber($this->x),
|
||||
'{y}' => StringHelper::normalizeNumber($this->y),
|
||||
'{stroke}' => $this->stroke,
|
||||
'{polygon}' => $this->polygon(),
|
||||
'{polyline}' => $this->polyline(),
|
||||
'{linearGradient}' => $this->linearGradient()
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool Has points
|
||||
*/
|
||||
public function hasPoints()
|
||||
{
|
||||
return ($this->points !== []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $messages log messages. See [[Logger::messages]] for the structure
|
||||
* @return int added points
|
||||
*/
|
||||
protected function addPoints($messages)
|
||||
{
|
||||
$hasPoints = $this->hasPoints();
|
||||
|
||||
$memory = $this->panel->memory / 100; // 1 percent memory
|
||||
$yOne = $this->y / 100; // 1 percent Y coordinate
|
||||
$xOne = $this->panel->duration / $this->x; // 1 percent X coordinate
|
||||
|
||||
$i = 0;
|
||||
foreach ($messages as $message) {
|
||||
if (empty($message[5])) {
|
||||
break;
|
||||
}
|
||||
++$i;
|
||||
$this->points[] = [
|
||||
($message[3] * 1000 - $this->panel->start) / $xOne,
|
||||
$this->y - ($message[5] / $memory * $yOne),
|
||||
];
|
||||
}
|
||||
|
||||
if ($hasPoints && $i) {
|
||||
usort($this->points, function ($a, $b) {
|
||||
return ($a[0] < $b[0]) ? -1 : 1;
|
||||
});
|
||||
}
|
||||
return $i;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Points attribute for polygon path
|
||||
*/
|
||||
protected function polygon()
|
||||
{
|
||||
$str = "0 $this->y ";
|
||||
foreach ($this->points as $point) {
|
||||
list($x, $y) = $point;
|
||||
$str .= "{$x} {$y} ";
|
||||
}
|
||||
$str .= $this->x - 0.001 . " {$y} {$this->x} {$this->y}";
|
||||
return StringHelper::normalizeNumber($str);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Points attribute for polyline path
|
||||
*/
|
||||
protected function polyline()
|
||||
{
|
||||
$str = "0 $this->y ";
|
||||
foreach ($this->points as $point) {
|
||||
list($x, $y) = $point;
|
||||
$str .= "{$x} {$y} ";
|
||||
}
|
||||
$str .= "$this->x {$y}";
|
||||
return StringHelper::normalizeNumber($str);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
protected function linearGradient()
|
||||
{
|
||||
$gradient = '<linearGradient id="gradient" x1="0" x2="0" y1="1" y2="0">';
|
||||
foreach ($this->gradient as $percent => $color) {
|
||||
$gradient .= '<stop offset="' . StringHelper::normalizeNumber($percent) . '%" stop-color="' . $color . '"></stop>';
|
||||
}
|
||||
return $gradient . '</linearGradient>';
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user