diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7fe8399 --- /dev/null +++ b/.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 + diff --git a/NOTICE b/NOTICE index f1d72eb..ca45153 100644 --- a/NOTICE +++ b/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). diff --git a/composer.json b/composer.json index fc29183..ad1824d 100644 --- a/composer.json +++ b/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"] diff --git a/examples/example01.php b/examples/example01.php index d181196..236f5cb 100644 --- a/examples/example01.php +++ b/examples/example01.php @@ -1,6 +1,7 @@ enableErrorConversion(); diff --git a/examples/example02.php b/examples/example02.php index 00d2e0d..ef615ba 100644 --- a/examples/example02.php +++ b/examples/example02.php @@ -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(); } diff --git a/tests/phpunit.xml b/phpunit.xml.dist similarity index 70% rename from tests/phpunit.xml rename to phpunit.xml.dist index 1d8e730..2527e92 100644 --- a/tests/phpunit.xml +++ b/phpunit.xml.dist @@ -2,13 +2,13 @@ - ../src + src - . + tests diff --git a/src/Bedoved.php b/src/Bedoved.php index c7cc022..8c42168 100644 --- a/src/Bedoved.php +++ b/src/Bedoved.php @@ -2,10 +2,10 @@ /** * Бедовед * - * @version 1.2.0 + * @version 1.2.0 * @copyright Михаил Красильников - * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 - * @author Михаил Красильников + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 + * @author Михаил Красильников * * Copyright 2012 Mikhail Krasilnikov (Михаил Красильников). * @@ -21,7 +21,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * @package Bedoved + * @package Bedoved */ @@ -41,6 +41,7 @@ class Bedoved /** * Режим отладки + * * @var bool * * @since 1.2.0 @@ -56,18 +57,21 @@ class Bedoved /** * Состояние перехвата исключительных ситуаций + * * @var bool */ private $exceptionHandlingEnabled = false; /** * Состояние перехвата фатальных ошибок + * * @var bool */ private $fatalErrorHandlingEnabled = false; /** * Адреса e-mail для отправки извещений об ошибках + * * @var null|string */ private $notify = null; @@ -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) { @@ -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 */ @@ -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); @@ -204,7 +220,7 @@ public function setNotifyEmails($emails) * * Если файл не существует, будет сделано предупреждение E_USER_WARNING. * - * @param string $filename путь к файлу + * @param string $filename путь к файлу * * @return $this */ @@ -229,7 +245,7 @@ public function setMessageFile($filename) * * Автоматически вызывает метод {@link enableFatalErrorHandling()}. * - * @param callable $callback обработчик фатальных ошибок + * @param callable $callback обработчик фатальных ошибок * * @return $this */ @@ -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 * @@ -284,7 +300,7 @@ public function errorHandler($errno, $errstr, $errfile, $errline) * своей работы буфер в памяти для отлова ошибок переполнения памяти. Эти операции замедляют * вывод примерно на 1-2%. * - * @param string $output содержимое буфера вывода + * @param string $output содержимое буфера вывода * * @return string|bool */ @@ -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) { @@ -332,7 +346,7 @@ public function fatalErrorHandler($output) * Обработчик исключений * * @param Exception $e - * @param bool $return true чтобы вернуть сообщение вместо вывода + * @param bool $return true чтобы вернуть сообщение вместо вывода * * @return null|string */ @@ -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(), @@ -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); @@ -422,4 +435,3 @@ private function getUserNotification(Exception $e) return $message; } } - diff --git a/tests/BedovedTest.php b/tests/BedovedTest.php index 4467d5e..c243f0d 100644 --- a/tests/BedovedTest.php +++ b/tests/BedovedTest.php @@ -2,10 +2,9 @@ /** * Тесты * - * @version 0.1 - * @copyright Михаил Красильников + * @copyright Михаил Красильников * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 - * @author Михаил Красильников + * @author Михаил Красильников * * Copyright 2012 Mikhail Krasilnikov (Михаил Красильников). * @@ -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() { @@ -50,7 +57,7 @@ public function testEnableErrorConversion() } /** - * @covers Bedoved::errorHandler + * */ public function testErrorHandler() { @@ -72,7 +79,7 @@ public function testErrorHandler() } /** - * @covers Bedoved::errorHandler + * */ public function testErrorHandlerAtEscaped() { @@ -82,7 +89,7 @@ public function testErrorHandlerAtEscaped() } /** - * @covers Bedoved::errorHandler + * */ public function testErrorHandlerMasked() { @@ -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()}|" @@ -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() { @@ -128,4 +136,3 @@ public function testGetUserNotification() $this->assertContains('Fatal error!', $message); } } -