Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
mekras committed Apr 24, 2014
2 parents b42b83e + 64e22a7 commit fad5a7c
Show file tree
Hide file tree
Showing 8 changed files with 93 additions and 44 deletions.
18 changes: 18 additions & 0 deletions .travis.yml
@@ -0,0 +1,18 @@
language: php
php:
- 5.5
- 5.4
- 5.3
- 5.2
- 5.1

install:
- composer install

script:
- mkdir -p build/logs
- phpunit --coverage-clover build/logs/clover.xml

after_script:
- php vendor/bin/coveralls -v

4 changes: 2 additions & 2 deletions NOTICE
@@ -1,5 +1,5 @@
Bedoved PHP library
Copyright 2012 DvaSlona Ltd.
Copyright 2012 Mikhail Krasilnikov

This product includes software developed by
Mikhail Krasilnikov [Михаил Красильников] (mihalych@vsepofigu.ru).
Mikhail Krasilnikov [Михаил Красильников] (m.krasilnikov@yandex.ru).
13 changes: 12 additions & 1 deletion composer.json
@@ -1,12 +1,23 @@
{
"name" : "mekras/bedoved",
"type" : "library",
"description" : "Easy error handling",
"type" : "library",
"license" : "Apache-2.0",
"authors": [
{
"name": "Михаил Красильников",
"email": "m.krasilnikov@yandex.ru"
}
],
"require" :
{
"php": ">=5.1.0"
},
"require-dev":
{
"ext-xdebug": "*",
"satooshi/php-coveralls": "dev-master"
},
"autoload":
{
"classmap": ["src/Bedoved.php"]
Expand Down
3 changes: 2 additions & 1 deletion examples/example01.php
@@ -1,6 +1,7 @@
<?php

require '../src/Bedoved.php';
require __DIR__ .'/../src/Bedoved.php';

$bedoved = new Bedoved();
$bedoved->enableErrorConversion();

Expand Down
4 changes: 2 additions & 2 deletions examples/example02.php
Expand Up @@ -5,11 +5,11 @@
die('Can not run in CLI mode' . PHP_EOL);
}

require '../src/Bedoved.php';
require __DIR__ .'/../src/Bedoved.php';
$bedoved = new Bedoved();
$bedoved->enableFatalErrorHandling();
$bedoved->setFatalErrorHandler(
function (ErrorException $e, $output)
function (ErrorException $e)
{
return 'ERROR: ' . $e->getMessage();
}
Expand Down
4 changes: 2 additions & 2 deletions tests/phpunit.xml → phpunit.xml.dist
Expand Up @@ -2,13 +2,13 @@
<phpunit>
<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php">../src</directory>
<directory suffix=".php">src</directory>
</whitelist>
</filter>

<testsuites>
<testsuite name="All tests">
<directory suffix="Test.php">.</directory>
<directory suffix="Test.php">tests</directory>
</testsuite>
</testsuites>

Expand Down
54 changes: 33 additions & 21 deletions src/Bedoved.php
Expand Up @@ -2,10 +2,10 @@
/**
* Бедовед
*
* @version 1.2.0
* @version 1.2.0
* @copyright Михаил Красильников <m.krasilnikov@yandex.ru>
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @author Михаил Красильников <m.krasilnikov@yandex.ru>
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @author Михаил Красильников <m.krasilnikov@yandex.ru>
*
* Copyright 2012 Mikhail Krasilnikov (Михаил Красильников).
*
Expand All @@ -21,7 +21,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @package Bedoved
* @package Bedoved
*/


Expand All @@ -41,6 +41,7 @@ class Bedoved

/**
* Режим отладки
*
* @var bool
*
* @since 1.2.0
Expand All @@ -56,18 +57,21 @@ class Bedoved

/**
* Состояние перехвата исключительных ситуаций
*
* @var bool
*/
private $exceptionHandlingEnabled = false;

/**
* Состояние перехвата фатальных ошибок
*
* @var bool
*/
private $fatalErrorHandlingEnabled = false;

/**
* Адреса e-mail для отправки извещений об ошибках
*
* @var null|string
*/
private $notify = null;
Expand All @@ -94,10 +98,18 @@ class Bedoved
*/
private $errorMarker;

/**
* Регулярное выражение, соответствующее сообщениям об ошибках
*
* @var string
* @since x.xx
*/
private $errorPattern;

/**
* Инициализирует Бедоведа
*
* @param bool $debug true — включить режим отладки
* @param bool $debug true — включить режим отладки
*/
public function __construct($debug = false)
{
Expand All @@ -109,7 +121,7 @@ public function __construct($debug = false)
*
* По умолчанию $mask включает в себя все ошибки кроме E_STRICT, E_NOTICE и E_USER_NOTICE.
*
* @param int $mask битовая маска, задающая какие ошибки преобразовывать
* @param int $mask битовая маска, задающая какие ошибки преобразовывать
*
* @return $this
*/
Expand Down Expand Up @@ -175,6 +187,10 @@ public function enableFatalErrorHandling()
/* Задаём маркер, чтобы отличать реальные ошибки от текстовых сообщений */
$this->errorMarker = uniqid();
ini_set('error_append_string', '[' . $this->errorMarker . ']');
$this->errorPattern
= '/(Parse|Fatal) error:(.+) in (.+) on line (\d+)\s+(Call Stack.*\s)?\['
. $this->errorMarker . '\]/s';

// Необходимо для правильного определения фатальных ошибок
ini_set('html_errors', 0);

Expand Down Expand Up @@ -204,7 +220,7 @@ public function setNotifyEmails($emails)
*
* Если файл не существует, будет сделано предупреждение E_USER_WARNING.
*
* @param string $filename путь к файлу
* @param string $filename путь к файлу
*
* @return $this
*/
Expand All @@ -229,7 +245,7 @@ public function setMessageFile($filename)
*
* Автоматически вызывает метод {@link enableFatalErrorHandling()}.
*
* @param callable $callback обработчик фатальных ошибок
* @param callable $callback обработчик фатальных ошибок
*
* @return $this
*/
Expand All @@ -253,10 +269,10 @@ public function setFatalErrorHandler($callback)
* Примечание: На самом деле этот метод обрабатывает только E_STRICT, E_NOTICE, E_USER_NOTICE,
* E_WARNING, E_USER_WARNING и E_USER_ERROR.
*
* @param int $errno тип ошибки
* @param string $errstr описание ошибки
* @param string $errfile имя файла, в котором произошла ошибка
* @param int $errline строка, где произошла ошибка
* @param int $errno тип ошибки
* @param string $errstr описание ошибки
* @param string $errfile имя файла, в котором произошла ошибка
* @param int $errline строка, где произошла ошибка
*
* @throws ErrorException
*
Expand Down Expand Up @@ -284,7 +300,7 @@ public function errorHandler($errno, $errstr, $errfile, $errline)
* своей работы буфер в памяти для отлова ошибок переполнения памяти. Эти операции замедляют
* вывод примерно на 1-2%.
*
* @param string $output содержимое буфера вывода
* @param string $output содержимое буфера вывода
*
* @return string|bool
*/
Expand All @@ -302,15 +318,13 @@ public function fatalErrorHandler($output)
* Окончательная проверка. Регулярные выражения будут применены только если переменная
* $errorTokens истинна.
*/
if ($errorTokens &&
preg_match('/(parse|fatal) error:(.+) in (.+) on line (\d+)\s+(Call Stack.*\s)?\['
. $this->errorMarker . '\]/is', $output, $m))
if ($errorTokens && @preg_match($this->errorPattern, $output, $m))
{
$errtype = $m[1];
$errstr = trim($m[2]);
$errfile = trim($m[3]);
$errline = trim($m[4]);
$severity = strcasecmp($errtype, 'parse') == 0 ? E_PARSE : E_ERROR;
$severity = 'Parse' == $errtype ? E_PARSE : E_ERROR;
$e = new ErrorException($errstr, 0, $severity, $errfile, $errline);
if ($this->fatalErrorHandler)
{
Expand All @@ -332,7 +346,7 @@ public function fatalErrorHandler($output)
* Обработчик исключений
*
* @param Exception $e
* @param bool $return true чтобы вернуть сообщение вместо вывода
* @param bool $return true чтобы вернуть сообщение вместо вывода
*
* @return null|string
*/
Expand All @@ -341,7 +355,6 @@ public function handleException(Exception $e, $return = false)
/*
* Сообщение для администратора
*/

$message = sprintf(
"%s\n\n%s in %s at %s\n\nBacktrace:\n%s\n",
$e->getMessage(),
Expand Down Expand Up @@ -406,7 +419,7 @@ private function getUserNotification(Exception $e)
}
else
{
$messageFile = $this->messageFile ?: __DIR__ . '/Resources/FatalError.html';
$messageFile = $this->messageFile ? : __DIR__ . '/Resources/FatalError.html';
if (@file_exists($messageFile) && @is_readable($messageFile))
{
@$message = file_get_contents($messageFile);
Expand All @@ -422,4 +435,3 @@ private function getUserNotification(Exception $e)
return $message;
}
}

37 changes: 22 additions & 15 deletions tests/BedovedTest.php
Expand Up @@ -2,10 +2,9 @@
/**
* Тесты
*
* @version 0.1
* @copyright Михаил Красильников <mihalych@vsepofigu.ru>
* @copyright Михаил Красильников <m.krasilnikov@yandex.ru>
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @author Михаил Красильников <mihalych@vsepofigu.ru>
* @author Михаил Красильников <m.krasilnikov@yandex.ru>
*
* Copyright 2012 Mikhail Krasilnikov (Михаил Красильников).
*
Expand All @@ -26,15 +25,23 @@

require_once __DIR__ . '/../src/Bedoved.php';

/**
* Тесты
*
* @package Bedoved
*/
class BedovedTest extends PHPUnit_Framework_TestCase
{
/**
*
*/
protected function tearDown()
{
restore_error_handler();
}

/**
* @covers Bedoved::enableErrorConversion
*
*/
public function testEnableErrorConversion()
{
Expand All @@ -50,7 +57,7 @@ public function testEnableErrorConversion()
}

/**
* @covers Bedoved::errorHandler
*
*/
public function testErrorHandler()
{
Expand All @@ -72,7 +79,7 @@ public function testErrorHandler()
}

/**
* @covers Bedoved::errorHandler
*
*/
public function testErrorHandlerAtEscaped()
{
Expand All @@ -82,7 +89,7 @@ public function testErrorHandlerAtEscaped()
}

/**
* @covers Bedoved::errorHandler
*
*/
public function testErrorHandlerMasked()
{
Expand All @@ -92,17 +99,18 @@ public function testErrorHandlerMasked()
}

/**
* @covers Bedoved::fatalErrorHandler
*
*/
public function testFatalErrorHandler()
{
$b = new Bedoved();
$b->enableFatalErrorHandling();
$marker = new ReflectionProperty('Bedoved', 'errorMarker');
$marker->setAccessible(true);
$marker->setValue($b, '1234');
$mask = new ReflectionProperty('Bedoved', 'fatalErrorHandler');
$mask->setAccessible(true);
$mask->setValue($b,
$handler = new ReflectionProperty('Bedoved', 'fatalErrorHandler');
$handler->setAccessible(true);
$handler->setValue(
$b,
function (ErrorException $e, $output)
{
return "{$e->getSeverity()}|{$e->getMessage()}|{$e->getFile()}|"
Expand All @@ -112,12 +120,12 @@ function (ErrorException $e, $output)

$this->assertFalse($b->fatalErrorHandler('foo'));

$text = 'Fatal error: Foo in bar.php on line 123 [1234]';
$text = 'Fatal error: Foo in bar.php on line 123 [' . $marker->getValue($b) . ']';
$this->assertEquals('1|Foo|bar.php|123|' . $text, $b->fatalErrorHandler($text));
}

/**
* @covers Bedoved::getUserNotification
*
*/
public function testGetUserNotification()
{
Expand All @@ -128,4 +136,3 @@ public function testGetUserNotification()
$this->assertContains('Fatal error!', $message);
}
}

0 comments on commit fad5a7c

Please sign in to comment.