From 5451294dfc1d201b2cdf4cfadd718518ceb1e027 Mon Sep 17 00:00:00 2001 From: Peter Deltchev Date: Tue, 16 Feb 2016 02:53:28 -0800 Subject: [PATCH] Replaced Pony.fm's profiler with @barryvdh's Laravel Debugbar. --- .../Api/Web/ProfilerController.php | 47 ----- app/Http/Kernel.php | 1 - app/Http/Middleware/Profiler.php | 79 -------- app/Http/routes.php | 4 - app/Library/Assets.php | 1 - app/Models/Genre.php | 2 + app/ProfileRequest.php | 101 ---------- composer.json | 4 +- composer.lock | 169 +++++++++++++++- config/app.php | 1 + config/debugbar.php | 169 ++++++++++++++++ gulpfile.js | 5 - resources/assets/scripts/debug/prettify.js | 28 --- .../assets/scripts/debug/profiler.coffee | 85 -------- resources/assets/styles/prettify.css | 11 -- resources/assets/styles/profiler.less | 187 ------------------ 16 files changed, 342 insertions(+), 552 deletions(-) delete mode 100644 app/Http/Controllers/Api/Web/ProfilerController.php delete mode 100644 app/Http/Middleware/Profiler.php delete mode 100644 app/ProfileRequest.php create mode 100644 config/debugbar.php delete mode 100644 resources/assets/scripts/debug/prettify.js delete mode 100644 resources/assets/scripts/debug/profiler.coffee delete mode 100644 resources/assets/styles/prettify.css delete mode 100644 resources/assets/styles/profiler.less diff --git a/app/Http/Controllers/Api/Web/ProfilerController.php b/app/Http/Controllers/Api/Web/ProfilerController.php deleted file mode 100644 index 1e420549..00000000 --- a/app/Http/Controllers/Api/Web/ProfilerController.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Poniverse\Ponyfm\Http\Controllers\Api\Web; - -use Poniverse\Ponyfm\Http\Controllers\Controller; -use Poniverse\Ponyfm\ProfileRequest; -use Cache; -use Config; -use Response; - -class ProfilerController extends Controller -{ - public function getRequest($id) - { - if (!Config::get('app.debug')) { - return; - } - - $key = 'profiler-request-' . $id; - $request = Cache::get($key); - if (!$request) { - exit(); - } - - Cache::forget($key); - - return Response::json(['request' => ProfileRequest::load($request)->toArray()], 200); - } -} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 2559c0a4..fcb5d192 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -37,7 +37,6 @@ class Kernel extends HttpKernel \Illuminate\View\Middleware\ShareErrorsFromSession::class, \Poniverse\Ponyfm\Http\Middleware\VerifyCsrfToken::class, \Poniverse\Ponyfm\Http\Middleware\DisabledAccountCheck::class, - \Poniverse\Ponyfm\Http\Middleware\Profiler::class, ]; /** diff --git a/app/Http/Middleware/Profiler.php b/app/Http/Middleware/Profiler.php deleted file mode 100644 index c8222b07..00000000 --- a/app/Http/Middleware/Profiler.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace Poniverse\Ponyfm\Http\Middleware; - -use Closure; -use Cache; -use Config; -use DB; -use Log; -use Poniverse\Ponyfm\ProfileRequest; -use Symfony\Component\HttpFoundation\Response; - -class Profiler -{ - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed - */ - public function handle($request, Closure $next) - { - // Profiling magic time! - if (Config::get('app.debug')) { - DB::enableQueryLog(); - $profiler = ProfileRequest::create(); - - try { - $response = $next($request); - } catch (\Exception $e) { - $response = \Response::make([ - 'message' => $e->getMessage(), - 'lineNumber' => $e->getLine(), - 'exception' => $e->getTrace() - ], method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500); - $profiler->log('error', $e->__toString(), []); - } - - $response = $this->processResponse($profiler, $response); - - Log::listen(function($level, $message, $context) use ($profiler, $request) { - $profiler->log($level, $message, $context); - }); - - } else { - // Process the request the usual, boring way. - $response = $next($request); - } - - return $response; - } - - - protected function processResponse(ProfileRequest $profiler, Response $response) { - $profiler->recordQueries(); - - Cache::put('profiler-request-'.$profiler->getId(), $profiler->toString(), 2); - return $response->header('X-Request-Id', $profiler->getId()); - } -} diff --git a/app/Http/routes.php b/app/Http/routes.php index 60242b0c..f232a0f9 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -29,10 +29,6 @@ | */ -if (Config::get('app.debug')) { - Route::get('/api/web/profiler/{id}', 'Api\Web\ProfilerController@getRequest'); -} - Route::get('/dashboard', 'TracksController@getIndex'); Route::get('/tracks', ['as' => 'tracks.discover', 'uses' => 'TracksController@getIndex']); Route::get('/tracks/popular', 'TracksController@getIndex'); diff --git a/app/Library/Assets.php b/app/Library/Assets.php index 626bf55a..3c2dde35 100644 --- a/app/Library/Assets.php +++ b/app/Library/Assets.php @@ -126,7 +126,6 @@ class Assets "styles/base/jquery-ui.css", "styles/base/colorbox.css", "styles/app.less", - "styles/profiler.less" ]; } else { if ($area == 'embed') { diff --git a/app/Models/Genre.php b/app/Models/Genre.php index 967bf7b3..0569e539 100644 --- a/app/Models/Genre.php +++ b/app/Models/Genre.php @@ -40,6 +40,8 @@ use Venturecraft\Revisionable\RevisionableTrait; * @property-read mixed $url * @property-write mixed $title * @property-read \Illuminate\Database\Eloquent\Collection|\Venturecraft\Revisionable\Revision[] $revisionHistory + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at */ class Genre extends Model { diff --git a/app/ProfileRequest.php b/app/ProfileRequest.php deleted file mode 100644 index a134e0dc..00000000 --- a/app/ProfileRequest.php +++ /dev/null @@ -1,101 +0,0 @@ -. - */ - -namespace Poniverse\Ponyfm; - -use DB; - -class ProfileRequest -{ - private $_id = null; - private $_data = null; - - public static function load($data) - { - $req = new ProfileRequest(); - $req->_data = json_decode($data); - - return $req; - } - - /** - * @return ProfileRequest - */ - public static function create() - { - $req = new ProfileRequest(); - $req->_id = uniqid(); - - return $req; - } - - private function __construct() - { - $this->_data = ['log' => []]; - } - - public function toArray() - { - return $this->_data; - } - - public function toString() - { - return json_encode($this->_data); - } - - public function getId() - { - return $this->_id; - } - - public function recordQueries() - { - $this->_data['queries'] = []; - - foreach (DB::getQueryLog() as $query) { - if (starts_with($query['query'], 'select * from `cache` where')) { - continue; - } - - if (starts_with($query['query'], 'delete from `cache` where')) { - continue; - } - - if (starts_with($query['query'], 'insert into `cache`')) { - continue; - } - - $this->_data['queries'][] = $query; - } - } - - /** - * @param string $level - * @param string $message - */ - public function log($level, $message, $context) - { - $this->_data['log'][] = [ - 'level' => $level, - 'message' => $message - ]; - } -} diff --git a/composer.json b/composer.json index bae0215b..3ac3ffbd 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,9 @@ "doctrine/dbal": "^2.5", "venturecraft/revisionable": "^1.23", "pda/pheanstalk": "~3.0", - "cviebrock/laravel-elasticsearch": "^1.0" + "cviebrock/laravel-elasticsearch": "^1.0", + "barryvdh/laravel-debugbar": "^2.1", + "predis/predis": "^1.0" }, "require-dev": { "fzaninotto/faker": "~1.4", diff --git a/composer.lock b/composer.lock index f7ef8573..e4f495c5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,9 +4,63 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "0deb7713636ee82aadee47da3a9217cc", - "content-hash": "9dea148233d815e53eb636413f2bcaed", + "hash": "a12fe5f5687e21aac441868ccc882fa2", + "content-hash": "95039400d11d1851dabe46e4c0456965", "packages": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "974fd16e328ca851a081449100d9509af59cf0ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/974fd16e328ca851a081449100d9509af59cf0ff", + "reference": "974fd16e328ca851a081449100d9509af59cf0ff", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.0.17|5.1.*|5.2.*", + "maximebf/debugbar": "~1.11.0", + "php": ">=5.4.0", + "symfony/finder": "~2.6|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "laravel", + "profiler", + "webprofiler" + ], + "time": "2015-12-22 06:22:38" + }, { "name": "barryvdh/laravel-ide-helper", "version": "v2.1.2", @@ -1543,6 +1597,67 @@ ], "time": "2015-12-19 20:16:43" }, + { + "name": "maximebf/debugbar", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/maximebf/php-debugbar.git", + "reference": "07741d84d39d10f00551c94284cdefcc69703e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/07741d84d39d10f00551c94284cdefcc69703e77", + "reference": "07741d84d39d10f00551c94284cdefcc69703e77", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "^1.0", + "symfony/var-dumper": "^2.6|^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/maximebf/php-debugbar", + "keywords": [ + "debug", + "debugbar" + ], + "time": "2015-12-10 09:50:24" + }, { "name": "monolog/monolog", "version": "1.17.2", @@ -1909,6 +2024,56 @@ ], "time": "2015-02-03 12:10:50" }, + { + "name": "predis/predis", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/nrk/predis.git", + "reference": "84060b9034d756b4d79641667d7f9efe1aeb8e04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nrk/predis/zipball/84060b9034d756b4d79641667d7f9efe1aeb8e04", + "reference": "84060b9034d756b4d79641667d7f9efe1aeb8e04", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "ext-curl": "Allows access to Webdis when paired with phpiredis", + "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + }, + "type": "library", + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniele Alessandri", + "email": "suppakilla@gmail.com", + "homepage": "http://clorophilla.net" + } + ], + "description": "Flexible and feature-complete PHP client library for Redis", + "homepage": "http://github.com/nrk/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "time": "2015-07-30 18:34:15" + }, { "name": "psr/http-message", "version": "1.0", diff --git a/config/app.php b/config/app.php index 119b1bf4..65f0e0f4 100644 --- a/config/app.php +++ b/config/app.php @@ -148,6 +148,7 @@ return [ Intouch\LaravelNewrelic\NewrelicServiceProvider::class, Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, Cviebrock\LaravelElasticsearch\ServiceProvider::class, + Barryvdh\Debugbar\ServiceProvider::class, ], diff --git a/config/debugbar.php b/config/debugbar.php new file mode 100644 index 00000000..4b942c51 --- /dev/null +++ b/config/debugbar.php @@ -0,0 +1,169 @@ + null, + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | DebugBar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Redis and PDO + | can also be used. For PDO, run the package migrations first. + | + */ + 'storage' => array( + 'enabled' => true, + 'driver' => 'redis', // redis, file, pdo + 'path' => storage_path() . '/debugbar', // For file driver + 'connection' => null, // Leave null for default connection (Redis/PDO) + ), + + /* + |-------------------------------------------------------------------------- + | Vendors + |-------------------------------------------------------------------------- + | + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) + | and for js: jquery and and highlight.js + | So if you want syntax highlighting, set it to true. + | jQuery is set to not conflict with existing jQuery scripts. + | + */ + + 'include_vendors' => true, + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + */ + + 'capture_ajax' => true, + + /* + |-------------------------------------------------------------------------- + | Clockwork integration + |-------------------------------------------------------------------------- + | + | The Debugbar can emulate the Clockwork headers, so you can use the Chrome + | Extension, without the server-side code. It uses Debugbar collectors instead. + | + */ + 'clockwork' => false, + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => array( + 'phpinfo' => true, // Php version + 'messages' => true, // Messages + 'time' => true, // Time Datalogger + 'memory' => true, // Memory usage + 'exceptions' => true, // Exception displayer + 'log' => true, // Logs from Monolog (merged in messages if enabled) + 'db' => true, // Show database (PDO) queries and bindings + 'views' => true, // Views with their data + 'route' => true, // Current route information + 'laravel' => false, // Laravel version and environment + 'events' => false, // All events fired + 'default_request' => false, // Regular or special Symfony request logger + 'symfony_request' => true, // Only one can be enabled.. + 'mail' => true, // Catch mail messages + 'logs' => false, // Add the latest log messages + 'files' => false, // Show the included files + 'config' => false, // Display config settings + 'auth' => false, // Display Laravel authentication status + 'gate' => false, // Display Laravel Gate checks + 'session' => true, // Display session data + ), + + /* + |-------------------------------------------------------------------------- + | Extra options + |-------------------------------------------------------------------------- + | + | Configure some DataCollectors + | + */ + + 'options' => array( + 'auth' => array( + 'show_name' => false, // Also show the users name/email in the debugbar + ), + 'db' => array( + 'with_params' => true, // Render SQL with the parameters substituted + 'timeline' => false, // Add the queries to the timeline + 'backtrace' => false, // EXPERIMENTAL: Use a backtrace to find the origin of the query in your files. + 'explain' => array( // EXPERIMENTAL: Show EXPLAIN output on queries + 'enabled' => false, + 'types' => array('SELECT'), // array('SELECT', 'INSERT', 'UPDATE', 'DELETE'); for MySQL 5.6.3+ + ), + 'hints' => true, // Show hints for common mistakes + ), + 'mail' => array( + 'full_log' => false + ), + 'views' => array( + 'data' => false, //Note: Can slow down the application, because the data can be quite large.. + ), + 'route' => array( + 'label' => true // show complete route on bar + ), + 'logs' => array( + 'file' => null + ), + ), + + /* + |-------------------------------------------------------------------------- + | Inject Debugbar in Response + |-------------------------------------------------------------------------- + | + | Usually, the debugbar is added just before , by listening to the + | Response after the App is done. If you disable this, you have to add them + | in your template yourself. See http://phpdebugbar.com/docs/rendering.html + | + */ + + 'inject' => true, + + /* + |-------------------------------------------------------------------------- + | DebugBar route prefix + |-------------------------------------------------------------------------- + | + | Sometimes you want to set route prefix to be used by DebugBar to load + | its resources from. Usually the need comes from misconfigured web server or + | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 + | + */ + 'route_prefix' => '_debugbar', + +); diff --git a/gulpfile.js b/gulpfile.js index 385f804d..02446315 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -55,8 +55,6 @@ gulp.task("scripts-app", function () { ]; if (!argv.production) { - paths.push("resources/assets/scripts/debug/**/*.{coffee,js}"); - // we also want to add the embed stuff, since we're in development mode // we want to watch embed files and re-compile them. However, we want // to leave this path out in production so that embed files are not bloating @@ -132,9 +130,6 @@ gulp.task("styles-app", function () { ]; if (!argv.production) { - includedStyles.push("resources/assets/styles/profiler.less"); - includedStyles.push("resources/assets/styles/prettify.css"); - // we also want to add the embed stuff, since we're in development mode // we want to watch embed files and re-compile them. However, we want // to leave this path out in production so that embed files are not bloating diff --git a/resources/assets/scripts/debug/prettify.js b/resources/assets/scripts/debug/prettify.js deleted file mode 100644 index eef5ad7e..00000000 --- a/resources/assets/scripts/debug/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p. - -$profiler = $("
").appendTo document.body -$toolbar = $('
').appendTo $profiler - -$('') - .click (e) -> - e.preventDefault() - $(document.body).toggleClass 'profiler-open' - .appendTo $toolbar - -$('Clear') - .click (e) -> - e.preventDefault() - $profiler.find('.requests').empty() - .appendTo $toolbar - -$requestItems = $("
    ").appendTo $profiler - -appendRequest = (method, url, req) -> - $requestItem = $("
  • ") - $requestHeader = ($("

    ")).appendTo $requestItem - ($("").text method).appendTo $requestHeader - ($("").text url).appendTo $requestHeader - - $logItems = $("
      ").appendTo $requestItem - - for logItem in req.request.log - $liItem = $("
    • ") - - $("

      ") - .html(logItem.message) - .click () -> - $(this).toggleClass 'open' - .appendTo($liItem) - - $("
      ").appendTo $liItem - $liItem.appendTo $logItems - - for query in req.request.queries - queryText = query.query - for binding in query.bindings - queryText = queryText.replace '?', '"' + binding + '"' - - $liItem = $("
    • ") - ($("").text query.time).appendTo $liItem - - $("

      ") - .html(prettyPrintOne(queryText, 'lang-sql')) - .click () -> - $(this).toggleClass 'open' - .appendTo($liItem) - - $("
      ").appendTo $liItem - $liItem.appendTo $logItems - - $requestItem.appendTo $requestItems - $requestItems.animate {scrollTop: $requestItems[0].scrollHeight}, 300 - -oldOpen = XMLHttpRequest.prototype.open - -XMLHttpRequest.prototype.open = (method, url) -> - intercept = => - return if this.readyState != 4 - return if !this.getResponseHeader('X-Request-Id') - id = this.getResponseHeader('X-Request-Id') - - $.getJSON('/api/web/profiler/' + id).done (res) -> appendRequest method, url, res - - (this.addEventListener "readystatechange", intercept, false) if url.indexOf('/api/web/profiler/') == -1 - oldOpen.apply this, arguments diff --git a/resources/assets/styles/prettify.css b/resources/assets/styles/prettify.css deleted file mode 100644 index 972b74d9..00000000 --- a/resources/assets/styles/prettify.css +++ /dev/null @@ -1,11 +0,0 @@ -.prettyprint .str { color: #65B042; } /* string - green */ -.prettyprint .kwd { color: #E28964; } /* keyword - dark pink */ -.prettyprint .com { color: #AEAEAE; font-style: italic; } /* comment - gray */ -.prettyprint .typ { color: #89bdff; } /* type - light blue */ -.prettyprint .lit { color: #3387CC; } /* literal - blue */ -.prettyprint .pun { color: #fff; } /* punctuation - white */ -.prettyprint .pln { color: #fff; } /* plaintext - white */ -.prettyprint .tag { color: #89bdff; } /* html/xml tag - light blue */ -.prettyprint .atn { color: #bdb76b; } /* html/xml attribute name - khaki */ -.prettyprint .atv { color: #65B042; } /* html/xml attribute value - green */ -.prettyprint .dec { color: #3387CC; } /* decimal - blue */ diff --git a/resources/assets/styles/profiler.less b/resources/assets/styles/profiler.less deleted file mode 100644 index 61ec2532..00000000 --- a/resources/assets/styles/profiler.less +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Pony.fm - A community for pony fan music. - * Copyright (C) 2015 Peter Deltchev - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -html { - .profiler-open { - header, .site-body { - margin-right: 403px; - } - - .profiler { - width: 400px; - height: 100%; - background: rgba(0, 0, 0, .85); - border-left: 3px solid #111; - - .buttons { - padding: 5px; - background: #222; - - .clear-button { - display: block; - } - - .open-button { - font-size: inherit; - padding: 2px 10px; - text-indent: 0px; - - i:before { - content: "\f077"; - } - } - } - - .requests { - display: block; - } - } - } -} - -.profiler { - position: fixed; - top: 0px; - right: 0px; - height: auto; - z-index: 1000; - - font-size: 8pt; - color: #fff; - - .buttons { - overflow: hidden; - - > a { - float: right; - padding: 2px 10px; - background: #e67e22; - color: #fff; - - &:hover { - text-decoration: none; - } - } - - .clear-button { - margin-right: 5px; - display: none; - } - - .open-button { - font-size: 1pt; - padding: 2px; - text-indent: -1000px; - overflow: hidden; - } - } - - ul { - list-style: none; - padding: 0px; - margin: 0px; - - li { - margin: 0px; - padding: 0px; - line-height: normal; - } - } - - .requests { - display: none; - position: absolute; - top: 33px; - bottom: 0px; - left: 0px; - right: 0px; - overflow-y: auto; - - > li { - - h3, h4 { - padding: 5px; - margin: 0px; - line-height: normal; - font-size: 8pt; - font-weight: normal; - } - - h3 { - background: #34495e; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - - .method { - display: block; - float: right; - background: #95a5a6; - padding: 5px; - margin: -5px; - min-width: 50px; - } - } - - h4 { - padding: 5px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - cursor: pointer; - - &.open { - white-space: pre-wrap; - text-overflow: clip; - overflow: visible; - background: #111; - } - - &.log-info { - background: #7f8c8d; - } - - &.log-warning { - background: #d35400; - } - - &.log-error { - background: #c0392b; - } - } - - .time { - float: right; - padding: 5px; - background: #2c3e50; - display: block; - margin-left: 5px; - } - - li { - position: relative; - font-family: 'Consolas'; - - .clear { - clear: both; - } - } - } - } -}