@@ -20,125 +20,125 @@ |
||
| 20 | 20 | */ |
| 21 | 21 | abstract class LoggerInterfaceTest extends TestCase |
| 22 | 22 | { |
| 23 | - /** |
|
| 24 | - * @return LoggerInterface |
|
| 25 | - */ |
|
| 26 | - abstract public function getLogger(); |
|
| 27 | - |
|
| 28 | - /** |
|
| 29 | - * This must return the log messages in order. |
|
| 30 | - * |
|
| 31 | - * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>". |
|
| 32 | - * |
|
| 33 | - * Example ->error('Foo') would yield "error Foo". |
|
| 34 | - * |
|
| 35 | - * @return string[] |
|
| 36 | - */ |
|
| 37 | - abstract public function getLogs(); |
|
| 38 | - |
|
| 39 | - public function testImplements() |
|
| 40 | - { |
|
| 41 | - $this->assertInstanceOf('GravityView\Psr\Log\LoggerInterface', $this->getLogger()); |
|
| 42 | - } |
|
| 43 | - |
|
| 44 | - /** |
|
| 45 | - * @dataProvider provideLevelsAndMessages |
|
| 46 | - */ |
|
| 47 | - public function testLogsAtAllLevels($level, $message) |
|
| 48 | - { |
|
| 49 | - $logger = $this->getLogger(); |
|
| 50 | - $logger->{$level}($message, array('user' => 'Bob')); |
|
| 51 | - $logger->log($level, $message, array('user' => 'Bob')); |
|
| 52 | - |
|
| 53 | - $expected = array( |
|
| 54 | - $level.' message of level '.$level.' with context: Bob', |
|
| 55 | - $level.' message of level '.$level.' with context: Bob', |
|
| 56 | - ); |
|
| 57 | - $this->assertEquals($expected, $this->getLogs()); |
|
| 58 | - } |
|
| 59 | - |
|
| 60 | - public function provideLevelsAndMessages() |
|
| 61 | - { |
|
| 62 | - return array( |
|
| 63 | - LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), |
|
| 64 | - LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), |
|
| 65 | - LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), |
|
| 66 | - LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), |
|
| 67 | - LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), |
|
| 68 | - LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), |
|
| 69 | - LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), |
|
| 70 | - LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), |
|
| 71 | - ); |
|
| 72 | - } |
|
| 73 | - |
|
| 74 | - /** |
|
| 75 | - * @expectedException \GravityView\Psr\Log\InvalidArgumentException |
|
| 76 | - */ |
|
| 77 | - public function testThrowsOnInvalidLevel() |
|
| 78 | - { |
|
| 79 | - $logger = $this->getLogger(); |
|
| 80 | - $logger->log('invalid level', 'Foo'); |
|
| 81 | - } |
|
| 82 | - |
|
| 83 | - public function testContextReplacement() |
|
| 84 | - { |
|
| 85 | - $logger = $this->getLogger(); |
|
| 86 | - $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); |
|
| 87 | - |
|
| 88 | - $expected = array('info {Message {nothing} Bob Bar a}'); |
|
| 89 | - $this->assertEquals($expected, $this->getLogs()); |
|
| 90 | - } |
|
| 91 | - |
|
| 92 | - public function testObjectCastToString() |
|
| 93 | - { |
|
| 94 | - if (method_exists($this, 'createPartialMock')) { |
|
| 95 | - $dummy = $this->createPartialMock('GravityView\GravityView\Psr\Log\Test\DummyTest', array('__toString')); |
|
| 96 | - } else { |
|
| 97 | - $dummy = $this->getMock('GravityView\GravityView\Psr\Log\Test\DummyTest', array('__toString')); |
|
| 98 | - } |
|
| 99 | - $dummy->expects($this->once()) |
|
| 100 | - ->method('__toString') |
|
| 101 | - ->will($this->returnValue('DUMMY')); |
|
| 102 | - |
|
| 103 | - $this->getLogger()->warning($dummy); |
|
| 104 | - |
|
| 105 | - $expected = array('warning DUMMY'); |
|
| 106 | - $this->assertEquals($expected, $this->getLogs()); |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - public function testContextCanContainAnything() |
|
| 110 | - { |
|
| 111 | - $closed = fopen('php://memory', 'r'); |
|
| 112 | - fclose($closed); |
|
| 113 | - |
|
| 114 | - $context = array( |
|
| 115 | - 'bool' => true, |
|
| 116 | - 'null' => null, |
|
| 117 | - 'string' => 'Foo', |
|
| 118 | - 'int' => 0, |
|
| 119 | - 'float' => 0.5, |
|
| 120 | - 'nested' => array('with object' => new DummyTest), |
|
| 121 | - 'object' => new \DateTime, |
|
| 122 | - 'resource' => fopen('php://memory', 'r'), |
|
| 123 | - 'closed' => $closed, |
|
| 124 | - ); |
|
| 125 | - |
|
| 126 | - $this->getLogger()->warning('Crazy context data', $context); |
|
| 127 | - |
|
| 128 | - $expected = array('warning Crazy context data'); |
|
| 129 | - $this->assertEquals($expected, $this->getLogs()); |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - public function testContextExceptionKeyCanBeExceptionOrOtherValues() |
|
| 133 | - { |
|
| 134 | - $logger = $this->getLogger(); |
|
| 135 | - $logger->warning('Random message', array('exception' => 'oops')); |
|
| 136 | - $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); |
|
| 137 | - |
|
| 138 | - $expected = array( |
|
| 139 | - 'warning Random message', |
|
| 140 | - 'critical Uncaught Exception!' |
|
| 141 | - ); |
|
| 142 | - $this->assertEquals($expected, $this->getLogs()); |
|
| 143 | - } |
|
| 23 | + /** |
|
| 24 | + * @return LoggerInterface |
|
| 25 | + */ |
|
| 26 | + abstract public function getLogger(); |
|
| 27 | + |
|
| 28 | + /** |
|
| 29 | + * This must return the log messages in order. |
|
| 30 | + * |
|
| 31 | + * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>". |
|
| 32 | + * |
|
| 33 | + * Example ->error('Foo') would yield "error Foo". |
|
| 34 | + * |
|
| 35 | + * @return string[] |
|
| 36 | + */ |
|
| 37 | + abstract public function getLogs(); |
|
| 38 | + |
|
| 39 | + public function testImplements() |
|
| 40 | + { |
|
| 41 | + $this->assertInstanceOf('GravityView\Psr\Log\LoggerInterface', $this->getLogger()); |
|
| 42 | + } |
|
| 43 | + |
|
| 44 | + /** |
|
| 45 | + * @dataProvider provideLevelsAndMessages |
|
| 46 | + */ |
|
| 47 | + public function testLogsAtAllLevels($level, $message) |
|
| 48 | + { |
|
| 49 | + $logger = $this->getLogger(); |
|
| 50 | + $logger->{$level}($message, array('user' => 'Bob')); |
|
| 51 | + $logger->log($level, $message, array('user' => 'Bob')); |
|
| 52 | + |
|
| 53 | + $expected = array( |
|
| 54 | + $level.' message of level '.$level.' with context: Bob', |
|
| 55 | + $level.' message of level '.$level.' with context: Bob', |
|
| 56 | + ); |
|
| 57 | + $this->assertEquals($expected, $this->getLogs()); |
|
| 58 | + } |
|
| 59 | + |
|
| 60 | + public function provideLevelsAndMessages() |
|
| 61 | + { |
|
| 62 | + return array( |
|
| 63 | + LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), |
|
| 64 | + LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), |
|
| 65 | + LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), |
|
| 66 | + LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), |
|
| 67 | + LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), |
|
| 68 | + LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), |
|
| 69 | + LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), |
|
| 70 | + LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), |
|
| 71 | + ); |
|
| 72 | + } |
|
| 73 | + |
|
| 74 | + /** |
|
| 75 | + * @expectedException \GravityView\Psr\Log\InvalidArgumentException |
|
| 76 | + */ |
|
| 77 | + public function testThrowsOnInvalidLevel() |
|
| 78 | + { |
|
| 79 | + $logger = $this->getLogger(); |
|
| 80 | + $logger->log('invalid level', 'Foo'); |
|
| 81 | + } |
|
| 82 | + |
|
| 83 | + public function testContextReplacement() |
|
| 84 | + { |
|
| 85 | + $logger = $this->getLogger(); |
|
| 86 | + $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); |
|
| 87 | + |
|
| 88 | + $expected = array('info {Message {nothing} Bob Bar a}'); |
|
| 89 | + $this->assertEquals($expected, $this->getLogs()); |
|
| 90 | + } |
|
| 91 | + |
|
| 92 | + public function testObjectCastToString() |
|
| 93 | + { |
|
| 94 | + if (method_exists($this, 'createPartialMock')) { |
|
| 95 | + $dummy = $this->createPartialMock('GravityView\GravityView\Psr\Log\Test\DummyTest', array('__toString')); |
|
| 96 | + } else { |
|
| 97 | + $dummy = $this->getMock('GravityView\GravityView\Psr\Log\Test\DummyTest', array('__toString')); |
|
| 98 | + } |
|
| 99 | + $dummy->expects($this->once()) |
|
| 100 | + ->method('__toString') |
|
| 101 | + ->will($this->returnValue('DUMMY')); |
|
| 102 | + |
|
| 103 | + $this->getLogger()->warning($dummy); |
|
| 104 | + |
|
| 105 | + $expected = array('warning DUMMY'); |
|
| 106 | + $this->assertEquals($expected, $this->getLogs()); |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + public function testContextCanContainAnything() |
|
| 110 | + { |
|
| 111 | + $closed = fopen('php://memory', 'r'); |
|
| 112 | + fclose($closed); |
|
| 113 | + |
|
| 114 | + $context = array( |
|
| 115 | + 'bool' => true, |
|
| 116 | + 'null' => null, |
|
| 117 | + 'string' => 'Foo', |
|
| 118 | + 'int' => 0, |
|
| 119 | + 'float' => 0.5, |
|
| 120 | + 'nested' => array('with object' => new DummyTest), |
|
| 121 | + 'object' => new \DateTime, |
|
| 122 | + 'resource' => fopen('php://memory', 'r'), |
|
| 123 | + 'closed' => $closed, |
|
| 124 | + ); |
|
| 125 | + |
|
| 126 | + $this->getLogger()->warning('Crazy context data', $context); |
|
| 127 | + |
|
| 128 | + $expected = array('warning Crazy context data'); |
|
| 129 | + $this->assertEquals($expected, $this->getLogs()); |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + public function testContextExceptionKeyCanBeExceptionOrOtherValues() |
|
| 133 | + { |
|
| 134 | + $logger = $this->getLogger(); |
|
| 135 | + $logger->warning('Random message', array('exception' => 'oops')); |
|
| 136 | + $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); |
|
| 137 | + |
|
| 138 | + $expected = array( |
|
| 139 | + 'warning Random message', |
|
| 140 | + 'critical Uncaught Exception!' |
|
| 141 | + ); |
|
| 142 | + $this->assertEquals($expected, $this->getLogs()); |
|
| 143 | + } |
|
| 144 | 144 | } |
@@ -17,8 +17,8 @@ |
||
| 17 | 17 | */ |
| 18 | 18 | class DummyTest |
| 19 | 19 | { |
| 20 | - public function __toString() |
|
| 21 | - { |
|
| 22 | - return 'DummyTest'; |
|
| 23 | - } |
|
| 20 | + public function __toString() |
|
| 21 | + { |
|
| 22 | + return 'DummyTest'; |
|
| 23 | + } |
|
| 24 | 24 | } |
@@ -25,107 +25,107 @@ |
||
| 25 | 25 | */ |
| 26 | 26 | interface LoggerInterface |
| 27 | 27 | { |
| 28 | - /** |
|
| 29 | - * System is unusable. |
|
| 30 | - * |
|
| 31 | - * @param string $message |
|
| 32 | - * @param mixed[] $context |
|
| 33 | - * |
|
| 34 | - * @return void |
|
| 35 | - */ |
|
| 36 | - public function emergency($message, array $context = array()); |
|
| 28 | + /** |
|
| 29 | + * System is unusable. |
|
| 30 | + * |
|
| 31 | + * @param string $message |
|
| 32 | + * @param mixed[] $context |
|
| 33 | + * |
|
| 34 | + * @return void |
|
| 35 | + */ |
|
| 36 | + public function emergency($message, array $context = array()); |
|
| 37 | 37 | |
| 38 | - /** |
|
| 39 | - * Action must be taken immediately. |
|
| 40 | - * |
|
| 41 | - * Example: Entire website down, database unavailable, etc. This should |
|
| 42 | - * trigger the SMS alerts and wake you up. |
|
| 43 | - * |
|
| 44 | - * @param string $message |
|
| 45 | - * @param mixed[] $context |
|
| 46 | - * |
|
| 47 | - * @return void |
|
| 48 | - */ |
|
| 49 | - public function alert($message, array $context = array()); |
|
| 38 | + /** |
|
| 39 | + * Action must be taken immediately. |
|
| 40 | + * |
|
| 41 | + * Example: Entire website down, database unavailable, etc. This should |
|
| 42 | + * trigger the SMS alerts and wake you up. |
|
| 43 | + * |
|
| 44 | + * @param string $message |
|
| 45 | + * @param mixed[] $context |
|
| 46 | + * |
|
| 47 | + * @return void |
|
| 48 | + */ |
|
| 49 | + public function alert($message, array $context = array()); |
|
| 50 | 50 | |
| 51 | - /** |
|
| 52 | - * Critical conditions. |
|
| 53 | - * |
|
| 54 | - * Example: Application component unavailable, unexpected exception. |
|
| 55 | - * |
|
| 56 | - * @param string $message |
|
| 57 | - * @param mixed[] $context |
|
| 58 | - * |
|
| 59 | - * @return void |
|
| 60 | - */ |
|
| 61 | - public function critical($message, array $context = array()); |
|
| 51 | + /** |
|
| 52 | + * Critical conditions. |
|
| 53 | + * |
|
| 54 | + * Example: Application component unavailable, unexpected exception. |
|
| 55 | + * |
|
| 56 | + * @param string $message |
|
| 57 | + * @param mixed[] $context |
|
| 58 | + * |
|
| 59 | + * @return void |
|
| 60 | + */ |
|
| 61 | + public function critical($message, array $context = array()); |
|
| 62 | 62 | |
| 63 | - /** |
|
| 64 | - * Runtime errors that do not require immediate action but should typically |
|
| 65 | - * be logged and monitored. |
|
| 66 | - * |
|
| 67 | - * @param string $message |
|
| 68 | - * @param mixed[] $context |
|
| 69 | - * |
|
| 70 | - * @return void |
|
| 71 | - */ |
|
| 72 | - public function error($message, array $context = array()); |
|
| 63 | + /** |
|
| 64 | + * Runtime errors that do not require immediate action but should typically |
|
| 65 | + * be logged and monitored. |
|
| 66 | + * |
|
| 67 | + * @param string $message |
|
| 68 | + * @param mixed[] $context |
|
| 69 | + * |
|
| 70 | + * @return void |
|
| 71 | + */ |
|
| 72 | + public function error($message, array $context = array()); |
|
| 73 | 73 | |
| 74 | - /** |
|
| 75 | - * Exceptional occurrences that are not errors. |
|
| 76 | - * |
|
| 77 | - * Example: Use of deprecated APIs, poor use of an API, undesirable things |
|
| 78 | - * that are not necessarily wrong. |
|
| 79 | - * |
|
| 80 | - * @param string $message |
|
| 81 | - * @param mixed[] $context |
|
| 82 | - * |
|
| 83 | - * @return void |
|
| 84 | - */ |
|
| 85 | - public function warning($message, array $context = array()); |
|
| 74 | + /** |
|
| 75 | + * Exceptional occurrences that are not errors. |
|
| 76 | + * |
|
| 77 | + * Example: Use of deprecated APIs, poor use of an API, undesirable things |
|
| 78 | + * that are not necessarily wrong. |
|
| 79 | + * |
|
| 80 | + * @param string $message |
|
| 81 | + * @param mixed[] $context |
|
| 82 | + * |
|
| 83 | + * @return void |
|
| 84 | + */ |
|
| 85 | + public function warning($message, array $context = array()); |
|
| 86 | 86 | |
| 87 | - /** |
|
| 88 | - * Normal but significant events. |
|
| 89 | - * |
|
| 90 | - * @param string $message |
|
| 91 | - * @param mixed[] $context |
|
| 92 | - * |
|
| 93 | - * @return void |
|
| 94 | - */ |
|
| 95 | - public function notice($message, array $context = array()); |
|
| 87 | + /** |
|
| 88 | + * Normal but significant events. |
|
| 89 | + * |
|
| 90 | + * @param string $message |
|
| 91 | + * @param mixed[] $context |
|
| 92 | + * |
|
| 93 | + * @return void |
|
| 94 | + */ |
|
| 95 | + public function notice($message, array $context = array()); |
|
| 96 | 96 | |
| 97 | - /** |
|
| 98 | - * Interesting events. |
|
| 99 | - * |
|
| 100 | - * Example: User logs in, SQL logs. |
|
| 101 | - * |
|
| 102 | - * @param string $message |
|
| 103 | - * @param mixed[] $context |
|
| 104 | - * |
|
| 105 | - * @return void |
|
| 106 | - */ |
|
| 107 | - public function info($message, array $context = array()); |
|
| 97 | + /** |
|
| 98 | + * Interesting events. |
|
| 99 | + * |
|
| 100 | + * Example: User logs in, SQL logs. |
|
| 101 | + * |
|
| 102 | + * @param string $message |
|
| 103 | + * @param mixed[] $context |
|
| 104 | + * |
|
| 105 | + * @return void |
|
| 106 | + */ |
|
| 107 | + public function info($message, array $context = array()); |
|
| 108 | 108 | |
| 109 | - /** |
|
| 110 | - * Detailed debug information. |
|
| 111 | - * |
|
| 112 | - * @param string $message |
|
| 113 | - * @param mixed[] $context |
|
| 114 | - * |
|
| 115 | - * @return void |
|
| 116 | - */ |
|
| 117 | - public function debug($message, array $context = array()); |
|
| 109 | + /** |
|
| 110 | + * Detailed debug information. |
|
| 111 | + * |
|
| 112 | + * @param string $message |
|
| 113 | + * @param mixed[] $context |
|
| 114 | + * |
|
| 115 | + * @return void |
|
| 116 | + */ |
|
| 117 | + public function debug($message, array $context = array()); |
|
| 118 | 118 | |
| 119 | - /** |
|
| 120 | - * Logs with an arbitrary level. |
|
| 121 | - * |
|
| 122 | - * @param mixed $level |
|
| 123 | - * @param string $message |
|
| 124 | - * @param mixed[] $context |
|
| 125 | - * |
|
| 126 | - * @return void |
|
| 127 | - * |
|
| 128 | - * @throws \GravityView\Psr\Log\InvalidArgumentException |
|
| 129 | - */ |
|
| 130 | - public function log($level, $message, array $context = array()); |
|
| 119 | + /** |
|
| 120 | + * Logs with an arbitrary level. |
|
| 121 | + * |
|
| 122 | + * @param mixed $level |
|
| 123 | + * @param string $message |
|
| 124 | + * @param mixed[] $context |
|
| 125 | + * |
|
| 126 | + * @return void |
|
| 127 | + * |
|
| 128 | + * @throws \GravityView\Psr\Log\InvalidArgumentException |
|
| 129 | + */ |
|
| 130 | + public function log($level, $message, array $context = array()); |
|
| 131 | 131 | } |
@@ -2,19 +2,19 @@ |
||
| 2 | 2 | // autoload.php @generated by Strauss |
| 3 | 3 | |
| 4 | 4 | if ( file_exists( __DIR__ . '/autoload-classmap.php' ) ) { |
| 5 | - $class_map = include __DIR__ . '/autoload-classmap.php'; |
|
| 6 | - if ( is_array( $class_map ) ) { |
|
| 7 | - spl_autoload_register( |
|
| 8 | - function ( $classname ) use ( $class_map ) { |
|
| 9 | - if ( isset( $class_map[ $classname ] ) && file_exists( $class_map[ $classname ] ) ) { |
|
| 10 | - require_once $class_map[ $classname ]; |
|
| 11 | - } |
|
| 12 | - } |
|
| 13 | - ); |
|
| 14 | - } |
|
| 15 | - unset( $class_map ); |
|
| 5 | + $class_map = include __DIR__ . '/autoload-classmap.php'; |
|
| 6 | + if ( is_array( $class_map ) ) { |
|
| 7 | + spl_autoload_register( |
|
| 8 | + function ( $classname ) use ( $class_map ) { |
|
| 9 | + if ( isset( $class_map[ $classname ] ) && file_exists( $class_map[ $classname ] ) ) { |
|
| 10 | + require_once $class_map[ $classname ]; |
|
| 11 | + } |
|
| 12 | + } |
|
| 13 | + ); |
|
| 14 | + } |
|
| 15 | + unset( $class_map ); |
|
| 16 | 16 | } |
| 17 | 17 | |
| 18 | 18 | if ( file_exists( __DIR__ . '/autoload-files.php' ) ) { |
| 19 | - require_once __DIR__ . '/autoload-files.php'; |
|
| 19 | + require_once __DIR__ . '/autoload-files.php'; |
|
| 20 | 20 | } |
| 21 | 21 | \ No newline at end of file |
@@ -34,322 +34,322 @@ |
||
| 34 | 34 | */ |
| 35 | 35 | class Logger extends AbstractLogger |
| 36 | 36 | {
|
| 37 | - /** |
|
| 38 | - * KLogger options |
|
| 39 | - * Anything options not considered 'core' to the logging library should be |
|
| 40 | - * settable view the third parameter in the constructor |
|
| 41 | - * |
|
| 42 | - * Core options include the log file path and the log threshold |
|
| 43 | - * |
|
| 44 | - * @var array |
|
| 45 | - */ |
|
| 46 | - protected $options = array ( |
|
| 47 | - 'extension' => 'txt', |
|
| 48 | - 'dateFormat' => 'Y-m-d G:i:s.u', |
|
| 49 | - 'filename' => false, |
|
| 50 | - 'flushFrequency' => false, |
|
| 51 | - 'prefix' => 'log_', |
|
| 52 | - 'logFormat' => false, |
|
| 53 | - 'appendContext' => true, |
|
| 54 | - ); |
|
| 55 | - |
|
| 56 | - /** |
|
| 57 | - * Path to the log file |
|
| 58 | - * @var string |
|
| 59 | - */ |
|
| 60 | - private $logFilePath; |
|
| 61 | - |
|
| 62 | - /** |
|
| 63 | - * Current minimum logging threshold |
|
| 64 | - * @var integer |
|
| 65 | - */ |
|
| 66 | - protected $logLevelThreshold = LogLevel::DEBUG; |
|
| 67 | - |
|
| 68 | - /** |
|
| 69 | - * The number of lines logged in this instance's lifetime |
|
| 70 | - * @var int |
|
| 71 | - */ |
|
| 72 | - private $logLineCount = 0; |
|
| 73 | - |
|
| 74 | - /** |
|
| 75 | - * Log Levels |
|
| 76 | - * @var array |
|
| 77 | - */ |
|
| 78 | - protected $logLevels = array( |
|
| 79 | - LogLevel::EMERGENCY => 0, |
|
| 80 | - LogLevel::ALERT => 1, |
|
| 81 | - LogLevel::CRITICAL => 2, |
|
| 82 | - LogLevel::ERROR => 3, |
|
| 83 | - LogLevel::WARNING => 4, |
|
| 84 | - LogLevel::NOTICE => 5, |
|
| 85 | - LogLevel::INFO => 6, |
|
| 86 | - LogLevel::DEBUG => 7 |
|
| 87 | - ); |
|
| 88 | - |
|
| 89 | - /** |
|
| 90 | - * This holds the file handle for this instance's log file |
|
| 91 | - * @var resource |
|
| 92 | - */ |
|
| 93 | - private $fileHandle; |
|
| 94 | - |
|
| 95 | - /** |
|
| 96 | - * This holds the last line logged to the logger |
|
| 97 | - * Used for unit tests |
|
| 98 | - * @var string |
|
| 99 | - */ |
|
| 100 | - private $lastLine = ''; |
|
| 101 | - |
|
| 102 | - /** |
|
| 103 | - * Octal notation for default permissions of the log file |
|
| 104 | - * @var integer |
|
| 105 | - */ |
|
| 106 | - private $defaultPermissions = 0777; |
|
| 107 | - |
|
| 108 | - /** |
|
| 109 | - * Class constructor |
|
| 110 | - * |
|
| 111 | - * @param string $logDirectory File path to the logging directory |
|
| 112 | - * @param string $logLevelThreshold The LogLevel Threshold |
|
| 113 | - * @param array $options |
|
| 114 | - * |
|
| 115 | - * @internal param string $logFilePrefix The prefix for the log file name |
|
| 116 | - * @internal param string $logFileExt The extension for the log file |
|
| 117 | - */ |
|
| 118 | - public function __construct($logDirectory, $logLevelThreshold = LogLevel::DEBUG, array $options = array()) |
|
| 119 | - {
|
|
| 120 | - $this->logLevelThreshold = $logLevelThreshold; |
|
| 121 | - $this->options = array_merge($this->options, $options); |
|
| 122 | - |
|
| 123 | - $logDirectory = rtrim($logDirectory, DIRECTORY_SEPARATOR); |
|
| 124 | - if ( ! file_exists($logDirectory)) {
|
|
| 125 | - mkdir($logDirectory, $this->defaultPermissions, true); |
|
| 126 | - } |
|
| 127 | - |
|
| 128 | - if(strpos($logDirectory, 'php://') === 0) {
|
|
| 129 | - $this->setLogToStdOut($logDirectory); |
|
| 130 | - $this->setFileHandle('w+');
|
|
| 131 | - } else {
|
|
| 132 | - $this->setLogFilePath($logDirectory); |
|
| 133 | - if(file_exists($this->logFilePath) && !is_writable($this->logFilePath)) {
|
|
| 134 | - throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
|
|
| 135 | - } |
|
| 136 | - $this->setFileHandle('a');
|
|
| 137 | - } |
|
| 138 | - |
|
| 139 | - if ( ! $this->fileHandle) {
|
|
| 140 | - throw new RuntimeException('The file could not be opened. Check permissions.');
|
|
| 141 | - } |
|
| 142 | - } |
|
| 143 | - |
|
| 144 | - /** |
|
| 145 | - * @param string $stdOutPath |
|
| 146 | - */ |
|
| 147 | - public function setLogToStdOut($stdOutPath) {
|
|
| 148 | - $this->logFilePath = $stdOutPath; |
|
| 149 | - } |
|
| 150 | - |
|
| 151 | - /** |
|
| 152 | - * @param string $logDirectory |
|
| 153 | - */ |
|
| 154 | - public function setLogFilePath($logDirectory) {
|
|
| 155 | - if ($this->options['filename']) {
|
|
| 156 | - if (strpos($this->options['filename'], '.log') !== false || strpos($this->options['filename'], '.txt') !== false) {
|
|
| 157 | - $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename']; |
|
| 158 | - } |
|
| 159 | - else {
|
|
| 160 | - $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'].'.'.$this->options['extension']; |
|
| 161 | - } |
|
| 162 | - } else {
|
|
| 163 | - $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['prefix'].date('Y-m-d').'.'.$this->options['extension'];
|
|
| 164 | - } |
|
| 165 | - } |
|
| 166 | - |
|
| 167 | - /** |
|
| 168 | - * @param $writeMode |
|
| 169 | - * |
|
| 170 | - * @internal param resource $fileHandle |
|
| 171 | - */ |
|
| 172 | - public function setFileHandle($writeMode) {
|
|
| 173 | - $this->fileHandle = fopen($this->logFilePath, $writeMode); |
|
| 174 | - } |
|
| 175 | - |
|
| 176 | - |
|
| 177 | - /** |
|
| 178 | - * Class destructor |
|
| 179 | - */ |
|
| 180 | - public function __destruct() |
|
| 181 | - {
|
|
| 182 | - if ($this->fileHandle) {
|
|
| 183 | - fclose($this->fileHandle); |
|
| 184 | - } |
|
| 185 | - } |
|
| 186 | - |
|
| 187 | - /** |
|
| 188 | - * Sets the date format used by all instances of KLogger |
|
| 189 | - * |
|
| 190 | - * @param string $dateFormat Valid format string for date() |
|
| 191 | - */ |
|
| 192 | - public function setDateFormat($dateFormat) |
|
| 193 | - {
|
|
| 194 | - $this->options['dateFormat'] = $dateFormat; |
|
| 195 | - } |
|
| 196 | - |
|
| 197 | - /** |
|
| 198 | - * Sets the Log Level Threshold |
|
| 199 | - * |
|
| 200 | - * @param string $logLevelThreshold The log level threshold |
|
| 201 | - */ |
|
| 202 | - public function setLogLevelThreshold($logLevelThreshold) |
|
| 203 | - {
|
|
| 204 | - $this->logLevelThreshold = $logLevelThreshold; |
|
| 205 | - } |
|
| 206 | - |
|
| 207 | - /** |
|
| 208 | - * Logs with an arbitrary level. |
|
| 209 | - * |
|
| 210 | - * @param mixed $level |
|
| 211 | - * @param string $message |
|
| 212 | - * @param array $context |
|
| 213 | - * @return null |
|
| 214 | - */ |
|
| 215 | - public function log($level, $message, array $context = array()) |
|
| 216 | - {
|
|
| 217 | - if ($this->logLevels[$this->logLevelThreshold] < $this->logLevels[$level]) {
|
|
| 218 | - return; |
|
| 219 | - } |
|
| 220 | - $message = $this->formatMessage($level, $message, $context); |
|
| 221 | - $this->write($message); |
|
| 222 | - } |
|
| 223 | - |
|
| 224 | - /** |
|
| 225 | - * Writes a line to the log without prepending a status or timestamp |
|
| 226 | - * |
|
| 227 | - * @param string $message Line to write to the log |
|
| 228 | - * @return void |
|
| 229 | - */ |
|
| 230 | - public function write($message) |
|
| 231 | - {
|
|
| 232 | - if (null !== $this->fileHandle) {
|
|
| 233 | - if (fwrite($this->fileHandle, $message) === false) {
|
|
| 234 | - throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
|
|
| 235 | - } else {
|
|
| 236 | - $this->lastLine = trim($message); |
|
| 237 | - $this->logLineCount++; |
|
| 238 | - |
|
| 239 | - if ($this->options['flushFrequency'] && $this->logLineCount % $this->options['flushFrequency'] === 0) {
|
|
| 240 | - fflush($this->fileHandle); |
|
| 241 | - } |
|
| 242 | - } |
|
| 243 | - } |
|
| 244 | - } |
|
| 245 | - |
|
| 246 | - /** |
|
| 247 | - * Get the file path that the log is currently writing to |
|
| 248 | - * |
|
| 249 | - * @return string |
|
| 250 | - */ |
|
| 251 | - public function getLogFilePath() |
|
| 252 | - {
|
|
| 253 | - return $this->logFilePath; |
|
| 254 | - } |
|
| 255 | - |
|
| 256 | - /** |
|
| 257 | - * Get the last line logged to the log file |
|
| 258 | - * |
|
| 259 | - * @return string |
|
| 260 | - */ |
|
| 261 | - public function getLastLogLine() |
|
| 262 | - {
|
|
| 263 | - return $this->lastLine; |
|
| 264 | - } |
|
| 265 | - |
|
| 266 | - /** |
|
| 267 | - * Formats the message for logging. |
|
| 268 | - * |
|
| 269 | - * @param string $level The Log Level of the message |
|
| 270 | - * @param string $message The message to log |
|
| 271 | - * @param array $context The context |
|
| 272 | - * @return string |
|
| 273 | - */ |
|
| 274 | - protected function formatMessage($level, $message, $context) |
|
| 275 | - {
|
|
| 276 | - if ($this->options['logFormat']) {
|
|
| 277 | - $parts = array( |
|
| 278 | - 'date' => $this->getTimestamp(), |
|
| 279 | - 'level' => strtoupper($level), |
|
| 280 | - 'level-padding' => str_repeat(' ', 9 - strlen($level)),
|
|
| 281 | - 'priority' => $this->logLevels[$level], |
|
| 282 | - 'message' => $message, |
|
| 283 | - 'context' => json_encode($context), |
|
| 284 | - ); |
|
| 285 | - $message = $this->options['logFormat']; |
|
| 286 | - foreach ($parts as $part => $value) {
|
|
| 287 | - $message = str_replace('{'.$part.'}', $value, $message);
|
|
| 288 | - } |
|
| 289 | - |
|
| 290 | - } else {
|
|
| 291 | - $message = "[{$this->getTimestamp()}] [{$level}] {$message}";
|
|
| 292 | - } |
|
| 293 | - |
|
| 294 | - if ($this->options['appendContext'] && ! empty($context)) {
|
|
| 295 | - $message .= PHP_EOL.$this->indent($this->contextToString($context)); |
|
| 296 | - } |
|
| 297 | - |
|
| 298 | - return $message.PHP_EOL; |
|
| 299 | - |
|
| 300 | - } |
|
| 301 | - |
|
| 302 | - /** |
|
| 303 | - * Gets the correctly formatted Date/Time for the log entry. |
|
| 304 | - * |
|
| 305 | - * PHP DateTime is dump, and you have to resort to trickery to get microseconds |
|
| 306 | - * to work correctly, so here it is. |
|
| 307 | - * |
|
| 308 | - * @return string |
|
| 309 | - */ |
|
| 310 | - private function getTimestamp() |
|
| 311 | - {
|
|
| 312 | - $originalTime = microtime(true); |
|
| 313 | - $micro = sprintf("%06d", ($originalTime - floor($originalTime)) * 1000000);
|
|
| 314 | - $date = new DateTime(date('Y-m-d H:i:s.'.$micro, $originalTime));
|
|
| 315 | - |
|
| 316 | - return $date->format($this->options['dateFormat']); |
|
| 317 | - } |
|
| 318 | - |
|
| 319 | - /** |
|
| 320 | - * Takes the given context and coverts it to a string. |
|
| 321 | - * |
|
| 322 | - * @param array $context The Context |
|
| 323 | - * @return string |
|
| 324 | - */ |
|
| 325 | - protected function contextToString($context) |
|
| 326 | - {
|
|
| 327 | - $export = ''; |
|
| 328 | - foreach ($context as $key => $value) {
|
|
| 329 | - $export .= "{$key}: ";
|
|
| 330 | - $export .= preg_replace(array( |
|
| 331 | - '/=>\s+([a-zA-Z])/im', |
|
| 332 | - '/array\(\s+\)/im', |
|
| 333 | - '/^ |\G /m' |
|
| 334 | - ), array( |
|
| 335 | - '=> $1', |
|
| 336 | - 'array()', |
|
| 337 | - ' ' |
|
| 338 | - ), str_replace('array (', 'array(', var_export($value, true)));
|
|
| 339 | - $export .= PHP_EOL; |
|
| 340 | - } |
|
| 341 | - return str_replace(array('\\\\', '\\\''), array('\\', '\''), rtrim($export));
|
|
| 342 | - } |
|
| 343 | - |
|
| 344 | - /** |
|
| 345 | - * Indents the given string with the given indent. |
|
| 346 | - * |
|
| 347 | - * @param string $string The string to indent |
|
| 348 | - * @param string $indent What to use as the indent. |
|
| 349 | - * @return string |
|
| 350 | - */ |
|
| 351 | - protected function indent($string, $indent = ' ') |
|
| 352 | - {
|
|
| 353 | - return $indent.str_replace("\n", "\n".$indent, $string);
|
|
| 354 | - } |
|
| 37 | + /** |
|
| 38 | + * KLogger options |
|
| 39 | + * Anything options not considered 'core' to the logging library should be |
|
| 40 | + * settable view the third parameter in the constructor |
|
| 41 | + * |
|
| 42 | + * Core options include the log file path and the log threshold |
|
| 43 | + * |
|
| 44 | + * @var array |
|
| 45 | + */ |
|
| 46 | + protected $options = array ( |
|
| 47 | + 'extension' => 'txt', |
|
| 48 | + 'dateFormat' => 'Y-m-d G:i:s.u', |
|
| 49 | + 'filename' => false, |
|
| 50 | + 'flushFrequency' => false, |
|
| 51 | + 'prefix' => 'log_', |
|
| 52 | + 'logFormat' => false, |
|
| 53 | + 'appendContext' => true, |
|
| 54 | + ); |
|
| 55 | + |
|
| 56 | + /** |
|
| 57 | + * Path to the log file |
|
| 58 | + * @var string |
|
| 59 | + */ |
|
| 60 | + private $logFilePath; |
|
| 61 | + |
|
| 62 | + /** |
|
| 63 | + * Current minimum logging threshold |
|
| 64 | + * @var integer |
|
| 65 | + */ |
|
| 66 | + protected $logLevelThreshold = LogLevel::DEBUG; |
|
| 67 | + |
|
| 68 | + /** |
|
| 69 | + * The number of lines logged in this instance's lifetime |
|
| 70 | + * @var int |
|
| 71 | + */ |
|
| 72 | + private $logLineCount = 0; |
|
| 73 | + |
|
| 74 | + /** |
|
| 75 | + * Log Levels |
|
| 76 | + * @var array |
|
| 77 | + */ |
|
| 78 | + protected $logLevels = array( |
|
| 79 | + LogLevel::EMERGENCY => 0, |
|
| 80 | + LogLevel::ALERT => 1, |
|
| 81 | + LogLevel::CRITICAL => 2, |
|
| 82 | + LogLevel::ERROR => 3, |
|
| 83 | + LogLevel::WARNING => 4, |
|
| 84 | + LogLevel::NOTICE => 5, |
|
| 85 | + LogLevel::INFO => 6, |
|
| 86 | + LogLevel::DEBUG => 7 |
|
| 87 | + ); |
|
| 88 | + |
|
| 89 | + /** |
|
| 90 | + * This holds the file handle for this instance's log file |
|
| 91 | + * @var resource |
|
| 92 | + */ |
|
| 93 | + private $fileHandle; |
|
| 94 | + |
|
| 95 | + /** |
|
| 96 | + * This holds the last line logged to the logger |
|
| 97 | + * Used for unit tests |
|
| 98 | + * @var string |
|
| 99 | + */ |
|
| 100 | + private $lastLine = ''; |
|
| 101 | + |
|
| 102 | + /** |
|
| 103 | + * Octal notation for default permissions of the log file |
|
| 104 | + * @var integer |
|
| 105 | + */ |
|
| 106 | + private $defaultPermissions = 0777; |
|
| 107 | + |
|
| 108 | + /** |
|
| 109 | + * Class constructor |
|
| 110 | + * |
|
| 111 | + * @param string $logDirectory File path to the logging directory |
|
| 112 | + * @param string $logLevelThreshold The LogLevel Threshold |
|
| 113 | + * @param array $options |
|
| 114 | + * |
|
| 115 | + * @internal param string $logFilePrefix The prefix for the log file name |
|
| 116 | + * @internal param string $logFileExt The extension for the log file |
|
| 117 | + */ |
|
| 118 | + public function __construct($logDirectory, $logLevelThreshold = LogLevel::DEBUG, array $options = array()) |
|
| 119 | + {
|
|
| 120 | + $this->logLevelThreshold = $logLevelThreshold; |
|
| 121 | + $this->options = array_merge($this->options, $options); |
|
| 122 | + |
|
| 123 | + $logDirectory = rtrim($logDirectory, DIRECTORY_SEPARATOR); |
|
| 124 | + if ( ! file_exists($logDirectory)) {
|
|
| 125 | + mkdir($logDirectory, $this->defaultPermissions, true); |
|
| 126 | + } |
|
| 127 | + |
|
| 128 | + if(strpos($logDirectory, 'php://') === 0) {
|
|
| 129 | + $this->setLogToStdOut($logDirectory); |
|
| 130 | + $this->setFileHandle('w+');
|
|
| 131 | + } else {
|
|
| 132 | + $this->setLogFilePath($logDirectory); |
|
| 133 | + if(file_exists($this->logFilePath) && !is_writable($this->logFilePath)) {
|
|
| 134 | + throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
|
|
| 135 | + } |
|
| 136 | + $this->setFileHandle('a');
|
|
| 137 | + } |
|
| 138 | + |
|
| 139 | + if ( ! $this->fileHandle) {
|
|
| 140 | + throw new RuntimeException('The file could not be opened. Check permissions.');
|
|
| 141 | + } |
|
| 142 | + } |
|
| 143 | + |
|
| 144 | + /** |
|
| 145 | + * @param string $stdOutPath |
|
| 146 | + */ |
|
| 147 | + public function setLogToStdOut($stdOutPath) {
|
|
| 148 | + $this->logFilePath = $stdOutPath; |
|
| 149 | + } |
|
| 150 | + |
|
| 151 | + /** |
|
| 152 | + * @param string $logDirectory |
|
| 153 | + */ |
|
| 154 | + public function setLogFilePath($logDirectory) {
|
|
| 155 | + if ($this->options['filename']) {
|
|
| 156 | + if (strpos($this->options['filename'], '.log') !== false || strpos($this->options['filename'], '.txt') !== false) {
|
|
| 157 | + $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename']; |
|
| 158 | + } |
|
| 159 | + else {
|
|
| 160 | + $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'].'.'.$this->options['extension']; |
|
| 161 | + } |
|
| 162 | + } else {
|
|
| 163 | + $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['prefix'].date('Y-m-d').'.'.$this->options['extension'];
|
|
| 164 | + } |
|
| 165 | + } |
|
| 166 | + |
|
| 167 | + /** |
|
| 168 | + * @param $writeMode |
|
| 169 | + * |
|
| 170 | + * @internal param resource $fileHandle |
|
| 171 | + */ |
|
| 172 | + public function setFileHandle($writeMode) {
|
|
| 173 | + $this->fileHandle = fopen($this->logFilePath, $writeMode); |
|
| 174 | + } |
|
| 175 | + |
|
| 176 | + |
|
| 177 | + /** |
|
| 178 | + * Class destructor |
|
| 179 | + */ |
|
| 180 | + public function __destruct() |
|
| 181 | + {
|
|
| 182 | + if ($this->fileHandle) {
|
|
| 183 | + fclose($this->fileHandle); |
|
| 184 | + } |
|
| 185 | + } |
|
| 186 | + |
|
| 187 | + /** |
|
| 188 | + * Sets the date format used by all instances of KLogger |
|
| 189 | + * |
|
| 190 | + * @param string $dateFormat Valid format string for date() |
|
| 191 | + */ |
|
| 192 | + public function setDateFormat($dateFormat) |
|
| 193 | + {
|
|
| 194 | + $this->options['dateFormat'] = $dateFormat; |
|
| 195 | + } |
|
| 196 | + |
|
| 197 | + /** |
|
| 198 | + * Sets the Log Level Threshold |
|
| 199 | + * |
|
| 200 | + * @param string $logLevelThreshold The log level threshold |
|
| 201 | + */ |
|
| 202 | + public function setLogLevelThreshold($logLevelThreshold) |
|
| 203 | + {
|
|
| 204 | + $this->logLevelThreshold = $logLevelThreshold; |
|
| 205 | + } |
|
| 206 | + |
|
| 207 | + /** |
|
| 208 | + * Logs with an arbitrary level. |
|
| 209 | + * |
|
| 210 | + * @param mixed $level |
|
| 211 | + * @param string $message |
|
| 212 | + * @param array $context |
|
| 213 | + * @return null |
|
| 214 | + */ |
|
| 215 | + public function log($level, $message, array $context = array()) |
|
| 216 | + {
|
|
| 217 | + if ($this->logLevels[$this->logLevelThreshold] < $this->logLevels[$level]) {
|
|
| 218 | + return; |
|
| 219 | + } |
|
| 220 | + $message = $this->formatMessage($level, $message, $context); |
|
| 221 | + $this->write($message); |
|
| 222 | + } |
|
| 223 | + |
|
| 224 | + /** |
|
| 225 | + * Writes a line to the log without prepending a status or timestamp |
|
| 226 | + * |
|
| 227 | + * @param string $message Line to write to the log |
|
| 228 | + * @return void |
|
| 229 | + */ |
|
| 230 | + public function write($message) |
|
| 231 | + {
|
|
| 232 | + if (null !== $this->fileHandle) {
|
|
| 233 | + if (fwrite($this->fileHandle, $message) === false) {
|
|
| 234 | + throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
|
|
| 235 | + } else {
|
|
| 236 | + $this->lastLine = trim($message); |
|
| 237 | + $this->logLineCount++; |
|
| 238 | + |
|
| 239 | + if ($this->options['flushFrequency'] && $this->logLineCount % $this->options['flushFrequency'] === 0) {
|
|
| 240 | + fflush($this->fileHandle); |
|
| 241 | + } |
|
| 242 | + } |
|
| 243 | + } |
|
| 244 | + } |
|
| 245 | + |
|
| 246 | + /** |
|
| 247 | + * Get the file path that the log is currently writing to |
|
| 248 | + * |
|
| 249 | + * @return string |
|
| 250 | + */ |
|
| 251 | + public function getLogFilePath() |
|
| 252 | + {
|
|
| 253 | + return $this->logFilePath; |
|
| 254 | + } |
|
| 255 | + |
|
| 256 | + /** |
|
| 257 | + * Get the last line logged to the log file |
|
| 258 | + * |
|
| 259 | + * @return string |
|
| 260 | + */ |
|
| 261 | + public function getLastLogLine() |
|
| 262 | + {
|
|
| 263 | + return $this->lastLine; |
|
| 264 | + } |
|
| 265 | + |
|
| 266 | + /** |
|
| 267 | + * Formats the message for logging. |
|
| 268 | + * |
|
| 269 | + * @param string $level The Log Level of the message |
|
| 270 | + * @param string $message The message to log |
|
| 271 | + * @param array $context The context |
|
| 272 | + * @return string |
|
| 273 | + */ |
|
| 274 | + protected function formatMessage($level, $message, $context) |
|
| 275 | + {
|
|
| 276 | + if ($this->options['logFormat']) {
|
|
| 277 | + $parts = array( |
|
| 278 | + 'date' => $this->getTimestamp(), |
|
| 279 | + 'level' => strtoupper($level), |
|
| 280 | + 'level-padding' => str_repeat(' ', 9 - strlen($level)),
|
|
| 281 | + 'priority' => $this->logLevels[$level], |
|
| 282 | + 'message' => $message, |
|
| 283 | + 'context' => json_encode($context), |
|
| 284 | + ); |
|
| 285 | + $message = $this->options['logFormat']; |
|
| 286 | + foreach ($parts as $part => $value) {
|
|
| 287 | + $message = str_replace('{'.$part.'}', $value, $message);
|
|
| 288 | + } |
|
| 289 | + |
|
| 290 | + } else {
|
|
| 291 | + $message = "[{$this->getTimestamp()}] [{$level}] {$message}";
|
|
| 292 | + } |
|
| 293 | + |
|
| 294 | + if ($this->options['appendContext'] && ! empty($context)) {
|
|
| 295 | + $message .= PHP_EOL.$this->indent($this->contextToString($context)); |
|
| 296 | + } |
|
| 297 | + |
|
| 298 | + return $message.PHP_EOL; |
|
| 299 | + |
|
| 300 | + } |
|
| 301 | + |
|
| 302 | + /** |
|
| 303 | + * Gets the correctly formatted Date/Time for the log entry. |
|
| 304 | + * |
|
| 305 | + * PHP DateTime is dump, and you have to resort to trickery to get microseconds |
|
| 306 | + * to work correctly, so here it is. |
|
| 307 | + * |
|
| 308 | + * @return string |
|
| 309 | + */ |
|
| 310 | + private function getTimestamp() |
|
| 311 | + {
|
|
| 312 | + $originalTime = microtime(true); |
|
| 313 | + $micro = sprintf("%06d", ($originalTime - floor($originalTime)) * 1000000);
|
|
| 314 | + $date = new DateTime(date('Y-m-d H:i:s.'.$micro, $originalTime));
|
|
| 315 | + |
|
| 316 | + return $date->format($this->options['dateFormat']); |
|
| 317 | + } |
|
| 318 | + |
|
| 319 | + /** |
|
| 320 | + * Takes the given context and coverts it to a string. |
|
| 321 | + * |
|
| 322 | + * @param array $context The Context |
|
| 323 | + * @return string |
|
| 324 | + */ |
|
| 325 | + protected function contextToString($context) |
|
| 326 | + {
|
|
| 327 | + $export = ''; |
|
| 328 | + foreach ($context as $key => $value) {
|
|
| 329 | + $export .= "{$key}: ";
|
|
| 330 | + $export .= preg_replace(array( |
|
| 331 | + '/=>\s+([a-zA-Z])/im', |
|
| 332 | + '/array\(\s+\)/im', |
|
| 333 | + '/^ |\G /m' |
|
| 334 | + ), array( |
|
| 335 | + '=> $1', |
|
| 336 | + 'array()', |
|
| 337 | + ' ' |
|
| 338 | + ), str_replace('array (', 'array(', var_export($value, true)));
|
|
| 339 | + $export .= PHP_EOL; |
|
| 340 | + } |
|
| 341 | + return str_replace(array('\\\\', '\\\''), array('\\', '\''), rtrim($export));
|
|
| 342 | + } |
|
| 343 | + |
|
| 344 | + /** |
|
| 345 | + * Indents the given string with the given indent. |
|
| 346 | + * |
|
| 347 | + * @param string $string The string to indent |
|
| 348 | + * @param string $indent What to use as the indent. |
|
| 349 | + * @return string |
|
| 350 | + */ |
|
| 351 | + protected function indent($string, $indent = ' ') |
|
| 352 | + {
|
|
| 353 | + return $indent.str_replace("\n", "\n".$indent, $string);
|
|
| 354 | + } |
|
| 355 | 355 | } |
@@ -21,298 +21,298 @@ |
||
| 21 | 21 | */ |
| 22 | 22 | abstract class Enum implements \JsonSerializable |
| 23 | 23 | { |
| 24 | - /** |
|
| 25 | - * Enum value |
|
| 26 | - * |
|
| 27 | - * @var mixed |
|
| 28 | - * @psalm-var T |
|
| 29 | - */ |
|
| 30 | - protected $value; |
|
| 24 | + /** |
|
| 25 | + * Enum value |
|
| 26 | + * |
|
| 27 | + * @var mixed |
|
| 28 | + * @psalm-var T |
|
| 29 | + */ |
|
| 30 | + protected $value; |
|
| 31 | 31 | |
| 32 | - /** |
|
| 33 | - * Enum key, the constant name |
|
| 34 | - * |
|
| 35 | - * @var string |
|
| 36 | - */ |
|
| 37 | - private $key; |
|
| 32 | + /** |
|
| 33 | + * Enum key, the constant name |
|
| 34 | + * |
|
| 35 | + * @var string |
|
| 36 | + */ |
|
| 37 | + private $key; |
|
| 38 | 38 | |
| 39 | - /** |
|
| 40 | - * Store existing constants in a static cache per object. |
|
| 41 | - * |
|
| 42 | - * |
|
| 43 | - * @var array |
|
| 44 | - * @psalm-var array<class-string, array<string, mixed>> |
|
| 45 | - */ |
|
| 46 | - protected static $cache = []; |
|
| 39 | + /** |
|
| 40 | + * Store existing constants in a static cache per object. |
|
| 41 | + * |
|
| 42 | + * |
|
| 43 | + * @var array |
|
| 44 | + * @psalm-var array<class-string, array<string, mixed>> |
|
| 45 | + */ |
|
| 46 | + protected static $cache = []; |
|
| 47 | 47 | |
| 48 | - /** |
|
| 49 | - * Cache of instances of the Enum class |
|
| 50 | - * |
|
| 51 | - * @var array |
|
| 52 | - * @psalm-var array<class-string, array<string, static>> |
|
| 53 | - */ |
|
| 54 | - protected static $instances = []; |
|
| 48 | + /** |
|
| 49 | + * Cache of instances of the Enum class |
|
| 50 | + * |
|
| 51 | + * @var array |
|
| 52 | + * @psalm-var array<class-string, array<string, static>> |
|
| 53 | + */ |
|
| 54 | + protected static $instances = []; |
|
| 55 | 55 | |
| 56 | - /** |
|
| 57 | - * Creates a new value of some type |
|
| 58 | - * |
|
| 59 | - * @psalm-pure |
|
| 60 | - * @param mixed $value |
|
| 61 | - * |
|
| 62 | - * @psalm-param T $value |
|
| 63 | - * @throws \UnexpectedValueException if incompatible type is given. |
|
| 64 | - */ |
|
| 65 | - public function __construct($value) |
|
| 66 | - { |
|
| 67 | - if ($value instanceof static) { |
|
| 68 | - /** @psalm-var T */ |
|
| 69 | - $value = $value->getValue(); |
|
| 70 | - } |
|
| 56 | + /** |
|
| 57 | + * Creates a new value of some type |
|
| 58 | + * |
|
| 59 | + * @psalm-pure |
|
| 60 | + * @param mixed $value |
|
| 61 | + * |
|
| 62 | + * @psalm-param T $value |
|
| 63 | + * @throws \UnexpectedValueException if incompatible type is given. |
|
| 64 | + */ |
|
| 65 | + public function __construct($value) |
|
| 66 | + { |
|
| 67 | + if ($value instanceof static) { |
|
| 68 | + /** @psalm-var T */ |
|
| 69 | + $value = $value->getValue(); |
|
| 70 | + } |
|
| 71 | 71 | |
| 72 | - /** @psalm-suppress ImplicitToStringCast assertValidValueReturningKey returns always a string but psalm has currently an issue here */ |
|
| 73 | - $this->key = static::assertValidValueReturningKey($value); |
|
| 72 | + /** @psalm-suppress ImplicitToStringCast assertValidValueReturningKey returns always a string but psalm has currently an issue here */ |
|
| 73 | + $this->key = static::assertValidValueReturningKey($value); |
|
| 74 | 74 | |
| 75 | - /** @psalm-var T */ |
|
| 76 | - $this->value = $value; |
|
| 77 | - } |
|
| 75 | + /** @psalm-var T */ |
|
| 76 | + $this->value = $value; |
|
| 77 | + } |
|
| 78 | 78 | |
| 79 | - /** |
|
| 80 | - * This method exists only for the compatibility reason when deserializing a previously serialized version |
|
| 81 | - * that didn't had the key property |
|
| 82 | - */ |
|
| 83 | - public function __wakeup() |
|
| 84 | - { |
|
| 85 | - /** @psalm-suppress DocblockTypeContradiction key can be null when deserializing an enum without the key */ |
|
| 86 | - if ($this->key === null) { |
|
| 87 | - /** |
|
| 88 | - * @psalm-suppress InaccessibleProperty key is not readonly as marked by psalm |
|
| 89 | - * @psalm-suppress PossiblyFalsePropertyAssignmentValue deserializing a case that was removed |
|
| 90 | - */ |
|
| 91 | - $this->key = static::search($this->value); |
|
| 92 | - } |
|
| 93 | - } |
|
| 79 | + /** |
|
| 80 | + * This method exists only for the compatibility reason when deserializing a previously serialized version |
|
| 81 | + * that didn't had the key property |
|
| 82 | + */ |
|
| 83 | + public function __wakeup() |
|
| 84 | + { |
|
| 85 | + /** @psalm-suppress DocblockTypeContradiction key can be null when deserializing an enum without the key */ |
|
| 86 | + if ($this->key === null) { |
|
| 87 | + /** |
|
| 88 | + * @psalm-suppress InaccessibleProperty key is not readonly as marked by psalm |
|
| 89 | + * @psalm-suppress PossiblyFalsePropertyAssignmentValue deserializing a case that was removed |
|
| 90 | + */ |
|
| 91 | + $this->key = static::search($this->value); |
|
| 92 | + } |
|
| 93 | + } |
|
| 94 | 94 | |
| 95 | - /** |
|
| 96 | - * @param mixed $value |
|
| 97 | - * @return static |
|
| 98 | - */ |
|
| 99 | - public static function from($value): self |
|
| 100 | - { |
|
| 101 | - $key = static::assertValidValueReturningKey($value); |
|
| 95 | + /** |
|
| 96 | + * @param mixed $value |
|
| 97 | + * @return static |
|
| 98 | + */ |
|
| 99 | + public static function from($value): self |
|
| 100 | + { |
|
| 101 | + $key = static::assertValidValueReturningKey($value); |
|
| 102 | 102 | |
| 103 | - return self::__callStatic($key, []); |
|
| 104 | - } |
|
| 103 | + return self::__callStatic($key, []); |
|
| 104 | + } |
|
| 105 | 105 | |
| 106 | - /** |
|
| 107 | - * @psalm-pure |
|
| 108 | - * @return mixed |
|
| 109 | - * @psalm-return T |
|
| 110 | - */ |
|
| 111 | - public function getValue() |
|
| 112 | - { |
|
| 113 | - return $this->value; |
|
| 114 | - } |
|
| 106 | + /** |
|
| 107 | + * @psalm-pure |
|
| 108 | + * @return mixed |
|
| 109 | + * @psalm-return T |
|
| 110 | + */ |
|
| 111 | + public function getValue() |
|
| 112 | + { |
|
| 113 | + return $this->value; |
|
| 114 | + } |
|
| 115 | 115 | |
| 116 | - /** |
|
| 117 | - * Returns the enum key (i.e. the constant name). |
|
| 118 | - * |
|
| 119 | - * @psalm-pure |
|
| 120 | - * @return string |
|
| 121 | - */ |
|
| 122 | - public function getKey() |
|
| 123 | - { |
|
| 124 | - return $this->key; |
|
| 125 | - } |
|
| 116 | + /** |
|
| 117 | + * Returns the enum key (i.e. the constant name). |
|
| 118 | + * |
|
| 119 | + * @psalm-pure |
|
| 120 | + * @return string |
|
| 121 | + */ |
|
| 122 | + public function getKey() |
|
| 123 | + { |
|
| 124 | + return $this->key; |
|
| 125 | + } |
|
| 126 | 126 | |
| 127 | - /** |
|
| 128 | - * @psalm-pure |
|
| 129 | - * @psalm-suppress InvalidCast |
|
| 130 | - * @return string |
|
| 131 | - */ |
|
| 132 | - public function __toString() |
|
| 133 | - { |
|
| 134 | - return (string)$this->value; |
|
| 135 | - } |
|
| 127 | + /** |
|
| 128 | + * @psalm-pure |
|
| 129 | + * @psalm-suppress InvalidCast |
|
| 130 | + * @return string |
|
| 131 | + */ |
|
| 132 | + public function __toString() |
|
| 133 | + { |
|
| 134 | + return (string)$this->value; |
|
| 135 | + } |
|
| 136 | 136 | |
| 137 | - /** |
|
| 138 | - * Determines if Enum should be considered equal with the variable passed as a parameter. |
|
| 139 | - * Returns false if an argument is an object of different class or not an object. |
|
| 140 | - * |
|
| 141 | - * This method is final, for more information read https://github.com/myclabs/php-enum/issues/4 |
|
| 142 | - * |
|
| 143 | - * @psalm-pure |
|
| 144 | - * @psalm-param mixed $variable |
|
| 145 | - * @return bool |
|
| 146 | - */ |
|
| 147 | - final public function equals($variable = null): bool |
|
| 148 | - { |
|
| 149 | - return $variable instanceof self |
|
| 150 | - && $this->getValue() === $variable->getValue() |
|
| 151 | - && static::class === \get_class($variable); |
|
| 152 | - } |
|
| 137 | + /** |
|
| 138 | + * Determines if Enum should be considered equal with the variable passed as a parameter. |
|
| 139 | + * Returns false if an argument is an object of different class or not an object. |
|
| 140 | + * |
|
| 141 | + * This method is final, for more information read https://github.com/myclabs/php-enum/issues/4 |
|
| 142 | + * |
|
| 143 | + * @psalm-pure |
|
| 144 | + * @psalm-param mixed $variable |
|
| 145 | + * @return bool |
|
| 146 | + */ |
|
| 147 | + final public function equals($variable = null): bool |
|
| 148 | + { |
|
| 149 | + return $variable instanceof self |
|
| 150 | + && $this->getValue() === $variable->getValue() |
|
| 151 | + && static::class === \get_class($variable); |
|
| 152 | + } |
|
| 153 | 153 | |
| 154 | - /** |
|
| 155 | - * Returns the names (keys) of all constants in the Enum class |
|
| 156 | - * |
|
| 157 | - * @psalm-pure |
|
| 158 | - * @psalm-return list<string> |
|
| 159 | - * @return array |
|
| 160 | - */ |
|
| 161 | - public static function keys() |
|
| 162 | - { |
|
| 163 | - return \array_keys(static::toArray()); |
|
| 164 | - } |
|
| 154 | + /** |
|
| 155 | + * Returns the names (keys) of all constants in the Enum class |
|
| 156 | + * |
|
| 157 | + * @psalm-pure |
|
| 158 | + * @psalm-return list<string> |
|
| 159 | + * @return array |
|
| 160 | + */ |
|
| 161 | + public static function keys() |
|
| 162 | + { |
|
| 163 | + return \array_keys(static::toArray()); |
|
| 164 | + } |
|
| 165 | 165 | |
| 166 | - /** |
|
| 167 | - * Returns instances of the Enum class of all Enum constants |
|
| 168 | - * |
|
| 169 | - * @psalm-pure |
|
| 170 | - * @psalm-return array<string, static> |
|
| 171 | - * @return static[] Constant name in key, Enum instance in value |
|
| 172 | - */ |
|
| 173 | - public static function values() |
|
| 174 | - { |
|
| 175 | - $values = array(); |
|
| 166 | + /** |
|
| 167 | + * Returns instances of the Enum class of all Enum constants |
|
| 168 | + * |
|
| 169 | + * @psalm-pure |
|
| 170 | + * @psalm-return array<string, static> |
|
| 171 | + * @return static[] Constant name in key, Enum instance in value |
|
| 172 | + */ |
|
| 173 | + public static function values() |
|
| 174 | + { |
|
| 175 | + $values = array(); |
|
| 176 | 176 | |
| 177 | - /** @psalm-var T $value */ |
|
| 178 | - foreach (static::toArray() as $key => $value) { |
|
| 179 | - $values[$key] = new static($value); |
|
| 180 | - } |
|
| 177 | + /** @psalm-var T $value */ |
|
| 178 | + foreach (static::toArray() as $key => $value) { |
|
| 179 | + $values[$key] = new static($value); |
|
| 180 | + } |
|
| 181 | 181 | |
| 182 | - return $values; |
|
| 183 | - } |
|
| 182 | + return $values; |
|
| 183 | + } |
|
| 184 | 184 | |
| 185 | - /** |
|
| 186 | - * Returns all possible values as an array |
|
| 187 | - * |
|
| 188 | - * @psalm-pure |
|
| 189 | - * @psalm-suppress ImpureStaticProperty |
|
| 190 | - * |
|
| 191 | - * @psalm-return array<string, mixed> |
|
| 192 | - * @return array Constant name in key, constant value in value |
|
| 193 | - */ |
|
| 194 | - public static function toArray() |
|
| 195 | - { |
|
| 196 | - $class = static::class; |
|
| 185 | + /** |
|
| 186 | + * Returns all possible values as an array |
|
| 187 | + * |
|
| 188 | + * @psalm-pure |
|
| 189 | + * @psalm-suppress ImpureStaticProperty |
|
| 190 | + * |
|
| 191 | + * @psalm-return array<string, mixed> |
|
| 192 | + * @return array Constant name in key, constant value in value |
|
| 193 | + */ |
|
| 194 | + public static function toArray() |
|
| 195 | + { |
|
| 196 | + $class = static::class; |
|
| 197 | 197 | |
| 198 | - if (!isset(static::$cache[$class])) { |
|
| 199 | - /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */ |
|
| 200 | - $reflection = new \ReflectionClass($class); |
|
| 201 | - /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */ |
|
| 202 | - static::$cache[$class] = $reflection->getConstants(); |
|
| 203 | - } |
|
| 198 | + if (!isset(static::$cache[$class])) { |
|
| 199 | + /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */ |
|
| 200 | + $reflection = new \ReflectionClass($class); |
|
| 201 | + /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */ |
|
| 202 | + static::$cache[$class] = $reflection->getConstants(); |
|
| 203 | + } |
|
| 204 | 204 | |
| 205 | - return static::$cache[$class]; |
|
| 206 | - } |
|
| 205 | + return static::$cache[$class]; |
|
| 206 | + } |
|
| 207 | 207 | |
| 208 | - /** |
|
| 209 | - * Check if is valid enum value |
|
| 210 | - * |
|
| 211 | - * @param $value |
|
| 212 | - * @psalm-param mixed $value |
|
| 213 | - * @psalm-pure |
|
| 214 | - * @psalm-assert-if-true T $value |
|
| 215 | - * @return bool |
|
| 216 | - */ |
|
| 217 | - public static function isValid($value) |
|
| 218 | - { |
|
| 219 | - return \in_array($value, static::toArray(), true); |
|
| 220 | - } |
|
| 208 | + /** |
|
| 209 | + * Check if is valid enum value |
|
| 210 | + * |
|
| 211 | + * @param $value |
|
| 212 | + * @psalm-param mixed $value |
|
| 213 | + * @psalm-pure |
|
| 214 | + * @psalm-assert-if-true T $value |
|
| 215 | + * @return bool |
|
| 216 | + */ |
|
| 217 | + public static function isValid($value) |
|
| 218 | + { |
|
| 219 | + return \in_array($value, static::toArray(), true); |
|
| 220 | + } |
|
| 221 | 221 | |
| 222 | - /** |
|
| 223 | - * Asserts valid enum value |
|
| 224 | - * |
|
| 225 | - * @psalm-pure |
|
| 226 | - * @psalm-assert T $value |
|
| 227 | - * @param mixed $value |
|
| 228 | - */ |
|
| 229 | - public static function assertValidValue($value): void |
|
| 230 | - { |
|
| 231 | - self::assertValidValueReturningKey($value); |
|
| 232 | - } |
|
| 222 | + /** |
|
| 223 | + * Asserts valid enum value |
|
| 224 | + * |
|
| 225 | + * @psalm-pure |
|
| 226 | + * @psalm-assert T $value |
|
| 227 | + * @param mixed $value |
|
| 228 | + */ |
|
| 229 | + public static function assertValidValue($value): void |
|
| 230 | + { |
|
| 231 | + self::assertValidValueReturningKey($value); |
|
| 232 | + } |
|
| 233 | 233 | |
| 234 | - /** |
|
| 235 | - * Asserts valid enum value |
|
| 236 | - * |
|
| 237 | - * @psalm-pure |
|
| 238 | - * @psalm-assert T $value |
|
| 239 | - * @param mixed $value |
|
| 240 | - * @return string |
|
| 241 | - */ |
|
| 242 | - private static function assertValidValueReturningKey($value): string |
|
| 243 | - { |
|
| 244 | - if (false === ($key = static::search($value))) { |
|
| 245 | - throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class); |
|
| 246 | - } |
|
| 234 | + /** |
|
| 235 | + * Asserts valid enum value |
|
| 236 | + * |
|
| 237 | + * @psalm-pure |
|
| 238 | + * @psalm-assert T $value |
|
| 239 | + * @param mixed $value |
|
| 240 | + * @return string |
|
| 241 | + */ |
|
| 242 | + private static function assertValidValueReturningKey($value): string |
|
| 243 | + { |
|
| 244 | + if (false === ($key = static::search($value))) { |
|
| 245 | + throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class); |
|
| 246 | + } |
|
| 247 | 247 | |
| 248 | - return $key; |
|
| 249 | - } |
|
| 248 | + return $key; |
|
| 249 | + } |
|
| 250 | 250 | |
| 251 | - /** |
|
| 252 | - * Check if is valid enum key |
|
| 253 | - * |
|
| 254 | - * @param $key |
|
| 255 | - * @psalm-param string $key |
|
| 256 | - * @psalm-pure |
|
| 257 | - * @return bool |
|
| 258 | - */ |
|
| 259 | - public static function isValidKey($key) |
|
| 260 | - { |
|
| 261 | - $array = static::toArray(); |
|
| 251 | + /** |
|
| 252 | + * Check if is valid enum key |
|
| 253 | + * |
|
| 254 | + * @param $key |
|
| 255 | + * @psalm-param string $key |
|
| 256 | + * @psalm-pure |
|
| 257 | + * @return bool |
|
| 258 | + */ |
|
| 259 | + public static function isValidKey($key) |
|
| 260 | + { |
|
| 261 | + $array = static::toArray(); |
|
| 262 | 262 | |
| 263 | - return isset($array[$key]) || \array_key_exists($key, $array); |
|
| 264 | - } |
|
| 263 | + return isset($array[$key]) || \array_key_exists($key, $array); |
|
| 264 | + } |
|
| 265 | 265 | |
| 266 | - /** |
|
| 267 | - * Return key for value |
|
| 268 | - * |
|
| 269 | - * @param mixed $value |
|
| 270 | - * |
|
| 271 | - * @psalm-param mixed $value |
|
| 272 | - * @psalm-pure |
|
| 273 | - * @return string|false |
|
| 274 | - */ |
|
| 275 | - public static function search($value) |
|
| 276 | - { |
|
| 277 | - return \array_search($value, static::toArray(), true); |
|
| 278 | - } |
|
| 266 | + /** |
|
| 267 | + * Return key for value |
|
| 268 | + * |
|
| 269 | + * @param mixed $value |
|
| 270 | + * |
|
| 271 | + * @psalm-param mixed $value |
|
| 272 | + * @psalm-pure |
|
| 273 | + * @return string|false |
|
| 274 | + */ |
|
| 275 | + public static function search($value) |
|
| 276 | + { |
|
| 277 | + return \array_search($value, static::toArray(), true); |
|
| 278 | + } |
|
| 279 | 279 | |
| 280 | - /** |
|
| 281 | - * Returns a value when called statically like so: MyEnum::SOME_VALUE() given SOME_VALUE is a class constant |
|
| 282 | - * |
|
| 283 | - * @param string $name |
|
| 284 | - * @param array $arguments |
|
| 285 | - * |
|
| 286 | - * @return static |
|
| 287 | - * @throws \BadMethodCallException |
|
| 288 | - * |
|
| 289 | - * @psalm-pure |
|
| 290 | - */ |
|
| 291 | - public static function __callStatic($name, $arguments) |
|
| 292 | - { |
|
| 293 | - $class = static::class; |
|
| 294 | - if (!isset(self::$instances[$class][$name])) { |
|
| 295 | - $array = static::toArray(); |
|
| 296 | - if (!isset($array[$name]) && !\array_key_exists($name, $array)) { |
|
| 297 | - $message = "No static method or enum constant '$name' in class " . static::class; |
|
| 298 | - throw new \BadMethodCallException($message); |
|
| 299 | - } |
|
| 300 | - return self::$instances[$class][$name] = new static($array[$name]); |
|
| 301 | - } |
|
| 302 | - return clone self::$instances[$class][$name]; |
|
| 303 | - } |
|
| 280 | + /** |
|
| 281 | + * Returns a value when called statically like so: MyEnum::SOME_VALUE() given SOME_VALUE is a class constant |
|
| 282 | + * |
|
| 283 | + * @param string $name |
|
| 284 | + * @param array $arguments |
|
| 285 | + * |
|
| 286 | + * @return static |
|
| 287 | + * @throws \BadMethodCallException |
|
| 288 | + * |
|
| 289 | + * @psalm-pure |
|
| 290 | + */ |
|
| 291 | + public static function __callStatic($name, $arguments) |
|
| 292 | + { |
|
| 293 | + $class = static::class; |
|
| 294 | + if (!isset(self::$instances[$class][$name])) { |
|
| 295 | + $array = static::toArray(); |
|
| 296 | + if (!isset($array[$name]) && !\array_key_exists($name, $array)) { |
|
| 297 | + $message = "No static method or enum constant '$name' in class " . static::class; |
|
| 298 | + throw new \BadMethodCallException($message); |
|
| 299 | + } |
|
| 300 | + return self::$instances[$class][$name] = new static($array[$name]); |
|
| 301 | + } |
|
| 302 | + return clone self::$instances[$class][$name]; |
|
| 303 | + } |
|
| 304 | 304 | |
| 305 | - /** |
|
| 306 | - * Specify data which should be serialized to JSON. This method returns data that can be serialized by json_encode() |
|
| 307 | - * natively. |
|
| 308 | - * |
|
| 309 | - * @return mixed |
|
| 310 | - * @link http://php.net/manual/en/jsonserializable.jsonserialize.php |
|
| 311 | - * @psalm-pure |
|
| 312 | - */ |
|
| 313 | - #[\ReturnTypeWillChange] |
|
| 314 | - public function jsonSerialize() |
|
| 315 | - { |
|
| 316 | - return $this->getValue(); |
|
| 317 | - } |
|
| 305 | + /** |
|
| 306 | + * Specify data which should be serialized to JSON. This method returns data that can be serialized by json_encode() |
|
| 307 | + * natively. |
|
| 308 | + * |
|
| 309 | + * @return mixed |
|
| 310 | + * @link http://php.net/manual/en/jsonserializable.jsonserialize.php |
|
| 311 | + * @psalm-pure |
|
| 312 | + */ |
|
| 313 | + #[\ReturnTypeWillChange] |
|
| 314 | + public function jsonSerialize() |
|
| 315 | + { |
|
| 316 | + return $this->getValue(); |
|
| 317 | + } |
|
| 318 | 318 | } |
@@ -14,13 +14,13 @@ discard block |
||
| 14 | 14 | class StraussConfigTest extends TestCase |
| 15 | 15 | { |
| 16 | 16 | |
| 17 | - /** |
|
| 18 | - * With a full (at time of writing) config, test the getters. |
|
| 19 | - */ |
|
| 20 | - public function testGetters() |
|
| 21 | - { |
|
| 17 | + /** |
|
| 18 | + * With a full (at time of writing) config, test the getters. |
|
| 19 | + */ |
|
| 20 | + public function testGetters() |
|
| 21 | + { |
|
| 22 | 22 | |
| 23 | - $composerExtraStraussJson = <<<'EOD' |
|
| 23 | + $composerExtraStraussJson = <<<'EOD' |
|
| 24 | 24 | { |
| 25 | 25 | "name": "brianhenryie/strauss-config-test", |
| 26 | 26 | "require": { |
@@ -50,38 +50,38 @@ discard block |
||
| 50 | 50 | } |
| 51 | 51 | EOD; |
| 52 | 52 | |
| 53 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 54 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 53 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 54 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 55 | 55 | |
| 56 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 56 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 57 | 57 | |
| 58 | - $sut = new StraussConfig($composer); |
|
| 58 | + $sut = new StraussConfig($composer); |
|
| 59 | 59 | |
| 60 | - $this->assertContains('pimple/pimple', $sut->getPackages()); |
|
| 60 | + $this->assertContains('pimple/pimple', $sut->getPackages()); |
|
| 61 | 61 | |
| 62 | - $this->assertEquals('target_directory' . DIRECTORY_SEPARATOR, $sut->getTargetDirectory()); |
|
| 62 | + $this->assertEquals('target_directory' . DIRECTORY_SEPARATOR, $sut->getTargetDirectory()); |
|
| 63 | 63 | |
| 64 | - $this->assertEquals("BrianHenryIE\\Strauss", $sut->getNamespacePrefix()); |
|
| 64 | + $this->assertEquals("BrianHenryIE\\Strauss", $sut->getNamespacePrefix()); |
|
| 65 | 65 | |
| 66 | - $this->assertEquals('BrianHenryIE_Strauss_', $sut->getClassmapPrefix()); |
|
| 66 | + $this->assertEquals('BrianHenryIE_Strauss_', $sut->getClassmapPrefix()); |
|
| 67 | 67 | |
| 68 | - // @see https://github.com/BrianHenryIE/strauss/issues/14 |
|
| 69 | - $this->assertContains('/^psr.*$/', $sut->getExcludeFilePatternsFromPrefixing()); |
|
| 68 | + // @see https://github.com/BrianHenryIE/strauss/issues/14 |
|
| 69 | + $this->assertContains('/^psr.*$/', $sut->getExcludeFilePatternsFromPrefixing()); |
|
| 70 | 70 | |
| 71 | - $this->assertArrayHasKey('clancats/container', $sut->getOverrideAutoload()); |
|
| 71 | + $this->assertArrayHasKey('clancats/container', $sut->getOverrideAutoload()); |
|
| 72 | 72 | |
| 73 | - $this->assertFalse($sut->isDeleteVendorFiles()); |
|
| 74 | - } |
|
| 73 | + $this->assertFalse($sut->isDeleteVendorFiles()); |
|
| 74 | + } |
|
| 75 | 75 | |
| 76 | - /** |
|
| 77 | - * Test how it handles an extra key. |
|
| 78 | - * |
|
| 79 | - * Turns out it just ignores it... good! |
|
| 80 | - */ |
|
| 81 | - public function testExtraKey() |
|
| 82 | - { |
|
| 76 | + /** |
|
| 77 | + * Test how it handles an extra key. |
|
| 78 | + * |
|
| 79 | + * Turns out it just ignores it... good! |
|
| 80 | + */ |
|
| 81 | + public function testExtraKey() |
|
| 82 | + { |
|
| 83 | 83 | |
| 84 | - $composerExtraStraussJson = <<<'EOD' |
|
| 84 | + $composerExtraStraussJson = <<<'EOD' |
|
| 85 | 85 | { |
| 86 | 86 | "name": "brianhenryie/strauss-config-test", |
| 87 | 87 | "require": { |
@@ -112,31 +112,31 @@ discard block |
||
| 112 | 112 | } |
| 113 | 113 | EOD; |
| 114 | 114 | |
| 115 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 116 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 115 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 116 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 117 | 117 | |
| 118 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 118 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 119 | 119 | |
| 120 | - $exception = null; |
|
| 120 | + $exception = null; |
|
| 121 | 121 | |
| 122 | - try { |
|
| 123 | - $sut = new StraussConfig($composer); |
|
| 124 | - } catch (\Exception $e) { |
|
| 125 | - $exception = $e; |
|
| 126 | - } |
|
| 122 | + try { |
|
| 123 | + $sut = new StraussConfig($composer); |
|
| 124 | + } catch (\Exception $e) { |
|
| 125 | + $exception = $e; |
|
| 126 | + } |
|
| 127 | 127 | |
| 128 | - $this->assertNull($exception); |
|
| 129 | - } |
|
| 128 | + $this->assertNull($exception); |
|
| 129 | + } |
|
| 130 | 130 | |
| 131 | - /** |
|
| 132 | - * straussconfig-test-3.json has no target_dir key. |
|
| 133 | - * |
|
| 134 | - * If no target_dir is specified, used "strauss/" |
|
| 135 | - */ |
|
| 136 | - public function testDefaultTargetDir() |
|
| 137 | - { |
|
| 131 | + /** |
|
| 132 | + * straussconfig-test-3.json has no target_dir key. |
|
| 133 | + * |
|
| 134 | + * If no target_dir is specified, used "strauss/" |
|
| 135 | + */ |
|
| 136 | + public function testDefaultTargetDir() |
|
| 137 | + { |
|
| 138 | 138 | |
| 139 | - $composerExtraStraussJson = <<<'EOD' |
|
| 139 | + $composerExtraStraussJson = <<<'EOD' |
|
| 140 | 140 | { |
| 141 | 141 | "name": "brianhenryie/strauss-config-test", |
| 142 | 142 | "require": { |
@@ -163,23 +163,23 @@ discard block |
||
| 163 | 163 | } |
| 164 | 164 | EOD; |
| 165 | 165 | |
| 166 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 167 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 166 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 167 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 168 | 168 | |
| 169 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 169 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 170 | 170 | |
| 171 | - $sut = new StraussConfig($composer); |
|
| 171 | + $sut = new StraussConfig($composer); |
|
| 172 | 172 | |
| 173 | - $this->assertEquals('strauss'. DIRECTORY_SEPARATOR, $sut->getTargetDirectory()); |
|
| 174 | - } |
|
| 173 | + $this->assertEquals('strauss'. DIRECTORY_SEPARATOR, $sut->getTargetDirectory()); |
|
| 174 | + } |
|
| 175 | 175 | |
| 176 | - /** |
|
| 177 | - * When the namespace prefix isn't provided, use the PSR-4 autoload key name. |
|
| 178 | - */ |
|
| 179 | - public function testDefaultNamespacePrefixFromAutoloaderPsr4() |
|
| 180 | - { |
|
| 176 | + /** |
|
| 177 | + * When the namespace prefix isn't provided, use the PSR-4 autoload key name. |
|
| 178 | + */ |
|
| 179 | + public function testDefaultNamespacePrefixFromAutoloaderPsr4() |
|
| 180 | + { |
|
| 181 | 181 | |
| 182 | - $composerExtraStraussJson = <<<'EOD' |
|
| 182 | + $composerExtraStraussJson = <<<'EOD' |
|
| 183 | 183 | { |
| 184 | 184 | "name": "brianhenryie/strauss-config-test", |
| 185 | 185 | "require": { |
@@ -194,23 +194,23 @@ discard block |
||
| 194 | 194 | } |
| 195 | 195 | EOD; |
| 196 | 196 | |
| 197 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 198 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 197 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 198 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 199 | 199 | |
| 200 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 200 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 201 | 201 | |
| 202 | - $sut = new StraussConfig($composer); |
|
| 202 | + $sut = new StraussConfig($composer); |
|
| 203 | 203 | |
| 204 | - $this->assertEquals("BrianHenryIE\\Strauss", $sut->getNamespacePrefix()); |
|
| 205 | - } |
|
| 204 | + $this->assertEquals("BrianHenryIE\\Strauss", $sut->getNamespacePrefix()); |
|
| 205 | + } |
|
| 206 | 206 | |
| 207 | - /** |
|
| 208 | - * When the namespace prefix isn't provided, use the PSR-0 autoload key name. |
|
| 209 | - */ |
|
| 210 | - public function testDefaultNamespacePrefixFromAutoloaderPsr0() |
|
| 211 | - { |
|
| 207 | + /** |
|
| 208 | + * When the namespace prefix isn't provided, use the PSR-0 autoload key name. |
|
| 209 | + */ |
|
| 210 | + public function testDefaultNamespacePrefixFromAutoloaderPsr0() |
|
| 211 | + { |
|
| 212 | 212 | |
| 213 | - $composerExtraStraussJson = <<<'EOD' |
|
| 213 | + $composerExtraStraussJson = <<<'EOD' |
|
| 214 | 214 | { |
| 215 | 215 | "name": "brianhenryie/strauss-config-test", |
| 216 | 216 | "require": { |
@@ -224,25 +224,25 @@ discard block |
||
| 224 | 224 | } |
| 225 | 225 | } |
| 226 | 226 | EOD; |
| 227 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 228 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 227 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 228 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 229 | 229 | |
| 230 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 230 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 231 | 231 | |
| 232 | - $sut = new StraussConfig($composer); |
|
| 232 | + $sut = new StraussConfig($composer); |
|
| 233 | 233 | |
| 234 | - $this->assertEquals("BrianHenryIE\\Strauss", $sut->getNamespacePrefix()); |
|
| 235 | - } |
|
| 234 | + $this->assertEquals("BrianHenryIE\\Strauss", $sut->getNamespacePrefix()); |
|
| 235 | + } |
|
| 236 | 236 | |
| 237 | - /** |
|
| 238 | - * When the namespace prefix isn't provided, and there's no PSR-0 or PSR-4 autoloader to figure it from... |
|
| 239 | - * |
|
| 240 | - * brianhenryie/strauss-config-test |
|
| 241 | - */ |
|
| 242 | - public function testDefaultNamespacePrefixWithNoAutoloader() |
|
| 243 | - { |
|
| 237 | + /** |
|
| 238 | + * When the namespace prefix isn't provided, and there's no PSR-0 or PSR-4 autoloader to figure it from... |
|
| 239 | + * |
|
| 240 | + * brianhenryie/strauss-config-test |
|
| 241 | + */ |
|
| 242 | + public function testDefaultNamespacePrefixWithNoAutoloader() |
|
| 243 | + { |
|
| 244 | 244 | |
| 245 | - $composerExtraStraussJson = <<<'EOD' |
|
| 245 | + $composerExtraStraussJson = <<<'EOD' |
|
| 246 | 246 | { |
| 247 | 247 | "name": "brianhenryie/strauss-config-test", |
| 248 | 248 | "require": { |
@@ -251,23 +251,23 @@ discard block |
||
| 251 | 251 | } |
| 252 | 252 | EOD; |
| 253 | 253 | |
| 254 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 255 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 254 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 255 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 256 | 256 | |
| 257 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 257 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 258 | 258 | |
| 259 | - $sut = new StraussConfig($composer); |
|
| 259 | + $sut = new StraussConfig($composer); |
|
| 260 | 260 | |
| 261 | - $this->assertEquals("Brianhenryie\\Strauss_Config_Test", $sut->getNamespacePrefix()); |
|
| 262 | - } |
|
| 261 | + $this->assertEquals("Brianhenryie\\Strauss_Config_Test", $sut->getNamespacePrefix()); |
|
| 262 | + } |
|
| 263 | 263 | |
| 264 | - /** |
|
| 265 | - * When the classmap prefix isn't provided, use the PSR-4 autoload key name. |
|
| 266 | - */ |
|
| 267 | - public function testDefaultClassmapPrefixFromAutoloaderPsr4() |
|
| 268 | - { |
|
| 264 | + /** |
|
| 265 | + * When the classmap prefix isn't provided, use the PSR-4 autoload key name. |
|
| 266 | + */ |
|
| 267 | + public function testDefaultClassmapPrefixFromAutoloaderPsr4() |
|
| 268 | + { |
|
| 269 | 269 | |
| 270 | - $composerExtraStraussJson = <<<'EOD' |
|
| 270 | + $composerExtraStraussJson = <<<'EOD' |
|
| 271 | 271 | { |
| 272 | 272 | "name": "brianhenryie/strauss-config-test", |
| 273 | 273 | "require": { |
@@ -282,23 +282,23 @@ discard block |
||
| 282 | 282 | } |
| 283 | 283 | EOD; |
| 284 | 284 | |
| 285 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 286 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 285 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 286 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 287 | 287 | |
| 288 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 288 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 289 | 289 | |
| 290 | - $sut = new StraussConfig($composer); |
|
| 290 | + $sut = new StraussConfig($composer); |
|
| 291 | 291 | |
| 292 | - $this->assertEquals("BrianHenryIE_Strauss_", $sut->getClassmapPrefix()); |
|
| 293 | - } |
|
| 292 | + $this->assertEquals("BrianHenryIE_Strauss_", $sut->getClassmapPrefix()); |
|
| 293 | + } |
|
| 294 | 294 | |
| 295 | - /** |
|
| 296 | - * When the classmap prefix isn't provided, use the PSR-0 autoload key name. |
|
| 297 | - */ |
|
| 298 | - public function testDefaultClassmapPrefixFromAutoloaderPsr0() |
|
| 299 | - { |
|
| 295 | + /** |
|
| 296 | + * When the classmap prefix isn't provided, use the PSR-0 autoload key name. |
|
| 297 | + */ |
|
| 298 | + public function testDefaultClassmapPrefixFromAutoloaderPsr0() |
|
| 299 | + { |
|
| 300 | 300 | |
| 301 | - $composerExtraStraussJson = <<<'EOD' |
|
| 301 | + $composerExtraStraussJson = <<<'EOD' |
|
| 302 | 302 | { |
| 303 | 303 | "name": "brianhenryie/strauss-config-test", |
| 304 | 304 | "require": { |
@@ -312,26 +312,26 @@ discard block |
||
| 312 | 312 | } |
| 313 | 313 | } |
| 314 | 314 | EOD; |
| 315 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 316 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 315 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 316 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 317 | 317 | |
| 318 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 318 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 319 | 319 | |
| 320 | 320 | |
| 321 | - $sut = new StraussConfig($composer); |
|
| 321 | + $sut = new StraussConfig($composer); |
|
| 322 | 322 | |
| 323 | - $this->assertEquals("BrianHenryIE_Strauss_", $sut->getClassmapPrefix()); |
|
| 324 | - } |
|
| 323 | + $this->assertEquals("BrianHenryIE_Strauss_", $sut->getClassmapPrefix()); |
|
| 324 | + } |
|
| 325 | 325 | |
| 326 | - /** |
|
| 327 | - * When the classmap prefix isn't provided, and there's no PSR-0 or PSR-4 autoloader to figure it from... |
|
| 328 | - * |
|
| 329 | - * brianhenryie/strauss-config-test |
|
| 330 | - */ |
|
| 331 | - public function testDefaultClassmapPrefixWithNoAutoloader() |
|
| 332 | - { |
|
| 326 | + /** |
|
| 327 | + * When the classmap prefix isn't provided, and there's no PSR-0 or PSR-4 autoloader to figure it from... |
|
| 328 | + * |
|
| 329 | + * brianhenryie/strauss-config-test |
|
| 330 | + */ |
|
| 331 | + public function testDefaultClassmapPrefixWithNoAutoloader() |
|
| 332 | + { |
|
| 333 | 333 | |
| 334 | - $composerExtraStraussJson = <<<'EOD' |
|
| 334 | + $composerExtraStraussJson = <<<'EOD' |
|
| 335 | 335 | { |
| 336 | 336 | "name": "brianhenryie/strauss-config-test", |
| 337 | 337 | "require": { |
@@ -340,23 +340,23 @@ discard block |
||
| 340 | 340 | |
| 341 | 341 | } |
| 342 | 342 | EOD; |
| 343 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 344 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 343 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 344 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 345 | 345 | |
| 346 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 346 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 347 | 347 | |
| 348 | - $sut = new StraussConfig($composer); |
|
| 348 | + $sut = new StraussConfig($composer); |
|
| 349 | 349 | |
| 350 | - $this->assertEquals("Brianhenryie_Strauss_Config_Test", $sut->getClassmapPrefix()); |
|
| 351 | - } |
|
| 350 | + $this->assertEquals("Brianhenryie_Strauss_Config_Test", $sut->getClassmapPrefix()); |
|
| 351 | + } |
|
| 352 | 352 | |
| 353 | - /** |
|
| 354 | - * When Strauss config has packages specified, obviously use them. |
|
| 355 | - */ |
|
| 356 | - public function testGetPackagesFromConfig() |
|
| 357 | - { |
|
| 353 | + /** |
|
| 354 | + * When Strauss config has packages specified, obviously use them. |
|
| 355 | + */ |
|
| 356 | + public function testGetPackagesFromConfig() |
|
| 357 | + { |
|
| 358 | 358 | |
| 359 | - $composerExtraStraussJson = <<<'EOD' |
|
| 359 | + $composerExtraStraussJson = <<<'EOD' |
|
| 360 | 360 | { |
| 361 | 361 | "name": "brianhenryie/strauss-config-test", |
| 362 | 362 | "require": { |
@@ -386,23 +386,23 @@ discard block |
||
| 386 | 386 | } |
| 387 | 387 | |
| 388 | 388 | EOD; |
| 389 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 390 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 389 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 390 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 391 | 391 | |
| 392 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 392 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 393 | 393 | |
| 394 | - $sut = new StraussConfig($composer); |
|
| 394 | + $sut = new StraussConfig($composer); |
|
| 395 | 395 | |
| 396 | - $this->assertContains('pimple/pimple', $sut->getPackages()); |
|
| 397 | - } |
|
| 396 | + $this->assertContains('pimple/pimple', $sut->getPackages()); |
|
| 397 | + } |
|
| 398 | 398 | |
| 399 | - /** |
|
| 400 | - * When Strauss config has no packages specified, use composer.json's require list. |
|
| 401 | - */ |
|
| 402 | - public function testGetPackagesNoConfig() |
|
| 403 | - { |
|
| 399 | + /** |
|
| 400 | + * When Strauss config has no packages specified, use composer.json's require list. |
|
| 401 | + */ |
|
| 402 | + public function testGetPackagesNoConfig() |
|
| 403 | + { |
|
| 404 | 404 | |
| 405 | - $composerExtraStraussJson = <<<'EOD' |
|
| 405 | + $composerExtraStraussJson = <<<'EOD' |
|
| 406 | 406 | { |
| 407 | 407 | "name": "brianhenryie/strauss-config-test", |
| 408 | 408 | "require": { |
@@ -428,23 +428,23 @@ discard block |
||
| 428 | 428 | } |
| 429 | 429 | } |
| 430 | 430 | EOD; |
| 431 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 432 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 431 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 432 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 433 | 433 | |
| 434 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 434 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 435 | 435 | |
| 436 | - $sut = new StraussConfig($composer); |
|
| 436 | + $sut = new StraussConfig($composer); |
|
| 437 | 437 | |
| 438 | - $this->assertContains('league/container', $sut->getPackages()); |
|
| 439 | - } |
|
| 438 | + $this->assertContains('league/container', $sut->getPackages()); |
|
| 439 | + } |
|
| 440 | 440 | |
| 441 | - /** |
|
| 442 | - * For backwards compatibility, if a Mozart config is present, use it. |
|
| 443 | - */ |
|
| 444 | - public function testMapMozartConfig() |
|
| 445 | - { |
|
| 441 | + /** |
|
| 442 | + * For backwards compatibility, if a Mozart config is present, use it. |
|
| 443 | + */ |
|
| 444 | + public function testMapMozartConfig() |
|
| 445 | + { |
|
| 446 | 446 | |
| 447 | - $composerExtraStraussJson = <<<'EOD' |
|
| 447 | + $composerExtraStraussJson = <<<'EOD' |
|
| 448 | 448 | { |
| 449 | 449 | "extra": { |
| 450 | 450 | "mozart": { |
@@ -469,41 +469,41 @@ discard block |
||
| 469 | 469 | } |
| 470 | 470 | } |
| 471 | 471 | EOD; |
| 472 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 473 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 472 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 473 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 474 | 474 | |
| 475 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 475 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 476 | 476 | |
| 477 | - $sut = new StraussConfig($composer); |
|
| 477 | + $sut = new StraussConfig($composer); |
|
| 478 | 478 | |
| 479 | - $this->assertContains('pimple/pimple', $sut->getPackages()); |
|
| 479 | + $this->assertContains('pimple/pimple', $sut->getPackages()); |
|
| 480 | 480 | |
| 481 | - $this->assertEquals('dep_directory' . DIRECTORY_SEPARATOR, $sut->getTargetDirectory()); |
|
| 481 | + $this->assertEquals('dep_directory' . DIRECTORY_SEPARATOR, $sut->getTargetDirectory()); |
|
| 482 | 482 | |
| 483 | - $this->assertEquals("My_Mozart_Config", $sut->getNamespacePrefix()); |
|
| 483 | + $this->assertEquals("My_Mozart_Config", $sut->getNamespacePrefix()); |
|
| 484 | 484 | |
| 485 | - $this->assertEquals('My_Mozart_Config_', $sut->getClassmapPrefix()); |
|
| 485 | + $this->assertEquals('My_Mozart_Config_', $sut->getClassmapPrefix()); |
|
| 486 | 486 | |
| 487 | - $this->assertContains('psr/container', $sut->getExcludePackagesFromPrefixing()); |
|
| 487 | + $this->assertContains('psr/container', $sut->getExcludePackagesFromPrefixing()); |
|
| 488 | 488 | |
| 489 | - $this->assertArrayHasKey('clancats/container', $sut->getOverrideAutoload()); |
|
| 489 | + $this->assertArrayHasKey('clancats/container', $sut->getOverrideAutoload()); |
|
| 490 | 490 | |
| 491 | - // Mozart default was true. |
|
| 492 | - $this->assertTrue($sut->isDeleteVendorFiles()); |
|
| 493 | - } |
|
| 491 | + // Mozart default was true. |
|
| 492 | + $this->assertTrue($sut->isDeleteVendorFiles()); |
|
| 493 | + } |
|
| 494 | + |
|
| 495 | + /** |
|
| 496 | + * Since sometimes the namespace we're prefixing will already have a leading backslash, sometimes |
|
| 497 | + * the namespace_prefix will want its slash at the beginning, sometimes at the end. |
|
| 498 | + * |
|
| 499 | + * @see Prefixer::replaceNamespace() |
|
| 500 | + * |
|
| 501 | + * @covers \BrianHenryIE\Strauss\Composer\Extra\StraussConfig::getNamespacePrefix |
|
| 502 | + */ |
|
| 503 | + public function testNamespacePrefixHasNoSlash() |
|
| 504 | + { |
|
| 494 | 505 | |
| 495 | - /** |
|
| 496 | - * Since sometimes the namespace we're prefixing will already have a leading backslash, sometimes |
|
| 497 | - * the namespace_prefix will want its slash at the beginning, sometimes at the end. |
|
| 498 | - * |
|
| 499 | - * @see Prefixer::replaceNamespace() |
|
| 500 | - * |
|
| 501 | - * @covers \BrianHenryIE\Strauss\Composer\Extra\StraussConfig::getNamespacePrefix |
|
| 502 | - */ |
|
| 503 | - public function testNamespacePrefixHasNoSlash() |
|
| 504 | - { |
|
| 505 | - |
|
| 506 | - $composerExtraStraussJson = <<<'EOD' |
|
| 506 | + $composerExtraStraussJson = <<<'EOD' |
|
| 507 | 507 | { |
| 508 | 508 | "extra": { |
| 509 | 509 | "mozart": { |
@@ -512,13 +512,13 @@ discard block |
||
| 512 | 512 | } |
| 513 | 513 | } |
| 514 | 514 | EOD; |
| 515 | - $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 516 | - file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 515 | + $tmpfname = tempnam(sys_get_temp_dir(), 'strauss-test-'); |
|
| 516 | + file_put_contents($tmpfname, $composerExtraStraussJson); |
|
| 517 | 517 | |
| 518 | - $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 518 | + $composer = Factory::create(new NullIO(), $tmpfname); |
|
| 519 | 519 | |
| 520 | - $sut = new StraussConfig($composer); |
|
| 520 | + $sut = new StraussConfig($composer); |
|
| 521 | 521 | |
| 522 | - $this->assertEquals("My_Mozart_Config", $sut->getNamespacePrefix()); |
|
| 523 | - } |
|
| 522 | + $this->assertEquals("My_Mozart_Config", $sut->getNamespacePrefix()); |
|
| 523 | + } |
|
| 524 | 524 | } |
@@ -8,134 +8,134 @@ |
||
| 8 | 8 | class ComposerPackageTest extends TestCase |
| 9 | 9 | { |
| 10 | 10 | |
| 11 | - /** |
|
| 12 | - * A simple test to check the getters all work. |
|
| 13 | - */ |
|
| 14 | - public function testParseJson() |
|
| 15 | - { |
|
| 11 | + /** |
|
| 12 | + * A simple test to check the getters all work. |
|
| 13 | + */ |
|
| 14 | + public function testParseJson() |
|
| 15 | + { |
|
| 16 | 16 | |
| 17 | - $testFile = __DIR__ . '/composerpackage-test-libmergepdf.json'; |
|
| 17 | + $testFile = __DIR__ . '/composerpackage-test-libmergepdf.json'; |
|
| 18 | 18 | |
| 19 | - $composer = new ComposerPackage($testFile); |
|
| 19 | + $composer = new ComposerPackage($testFile); |
|
| 20 | 20 | |
| 21 | - $this->assertEquals('iio/libmergepdf', $composer->getName()); |
|
| 21 | + $this->assertEquals('iio/libmergepdf', $composer->getName()); |
|
| 22 | 22 | |
| 23 | - $this->assertIsArray($composer->getAutoload()); |
|
| 23 | + $this->assertIsArray($composer->getAutoload()); |
|
| 24 | 24 | |
| 25 | - $this->assertIsArray($composer->getRequiresNames()); |
|
| 26 | - } |
|
| 25 | + $this->assertIsArray($composer->getRequiresNames()); |
|
| 26 | + } |
|
| 27 | 27 | |
| 28 | - /** |
|
| 29 | - * Test the dependencies' names are returned. |
|
| 30 | - */ |
|
| 31 | - public function testGetRequiresNames() |
|
| 32 | - { |
|
| 28 | + /** |
|
| 29 | + * Test the dependencies' names are returned. |
|
| 30 | + */ |
|
| 31 | + public function testGetRequiresNames() |
|
| 32 | + { |
|
| 33 | 33 | |
| 34 | - $testFile = __DIR__ . '/composerpackage-test-libmergepdf.json'; |
|
| 34 | + $testFile = __DIR__ . '/composerpackage-test-libmergepdf.json'; |
|
| 35 | 35 | |
| 36 | - $composer = new ComposerPackage($testFile); |
|
| 36 | + $composer = new ComposerPackage($testFile); |
|
| 37 | 37 | |
| 38 | - $requiresNames = $composer->getRequiresNames(); |
|
| 38 | + $requiresNames = $composer->getRequiresNames(); |
|
| 39 | 39 | |
| 40 | - $this->assertContains('tecnickcom/tcpdf', $requiresNames); |
|
| 41 | - $this->assertContains('setasign/fpdi', $requiresNames); |
|
| 42 | - } |
|
| 40 | + $this->assertContains('tecnickcom/tcpdf', $requiresNames); |
|
| 41 | + $this->assertContains('setasign/fpdi', $requiresNames); |
|
| 42 | + } |
|
| 43 | 43 | |
| 44 | - /** |
|
| 45 | - * Test PHP and ext- are not returned, since we won't be dealing with them. |
|
| 46 | - */ |
|
| 47 | - public function testGetRequiresNamesDoesNotContain() |
|
| 48 | - { |
|
| 44 | + /** |
|
| 45 | + * Test PHP and ext- are not returned, since we won't be dealing with them. |
|
| 46 | + */ |
|
| 47 | + public function testGetRequiresNamesDoesNotContain() |
|
| 48 | + { |
|
| 49 | 49 | |
| 50 | - $testFile = __DIR__ . '/composerpackage-test-easypost-php.json'; |
|
| 50 | + $testFile = __DIR__ . '/composerpackage-test-easypost-php.json'; |
|
| 51 | 51 | |
| 52 | - $composer = new ComposerPackage($testFile); |
|
| 52 | + $composer = new ComposerPackage($testFile); |
|
| 53 | 53 | |
| 54 | - $requiresNames = $composer->getRequiresNames(); |
|
| 54 | + $requiresNames = $composer->getRequiresNames(); |
|
| 55 | 55 | |
| 56 | - $this->assertNotContains('ext-curl', $requiresNames); |
|
| 57 | - $this->assertNotContains('php', $requiresNames); |
|
| 58 | - } |
|
| 56 | + $this->assertNotContains('ext-curl', $requiresNames); |
|
| 57 | + $this->assertNotContains('php', $requiresNames); |
|
| 58 | + } |
|
| 59 | 59 | |
| 60 | 60 | |
| 61 | - /** |
|
| 62 | - * |
|
| 63 | - */ |
|
| 64 | - public function testAutoloadPsr0() |
|
| 65 | - { |
|
| 61 | + /** |
|
| 62 | + * |
|
| 63 | + */ |
|
| 64 | + public function testAutoloadPsr0() |
|
| 65 | + { |
|
| 66 | 66 | |
| 67 | - $testFile = __DIR__ . '/composerpackage-test-easypost-php.json'; |
|
| 67 | + $testFile = __DIR__ . '/composerpackage-test-easypost-php.json'; |
|
| 68 | 68 | |
| 69 | - $composer = new ComposerPackage($testFile); |
|
| 69 | + $composer = new ComposerPackage($testFile); |
|
| 70 | 70 | |
| 71 | - $autoload = $composer->getAutoload(); |
|
| 71 | + $autoload = $composer->getAutoload(); |
|
| 72 | 72 | |
| 73 | - $this->assertArrayHasKey('psr-0', $autoload); |
|
| 73 | + $this->assertArrayHasKey('psr-0', $autoload); |
|
| 74 | 74 | |
| 75 | - $this->assertIsArray($autoload['psr-0']); |
|
| 76 | - } |
|
| 75 | + $this->assertIsArray($autoload['psr-0']); |
|
| 76 | + } |
|
| 77 | 77 | |
| 78 | - /** |
|
| 79 | - * |
|
| 80 | - */ |
|
| 81 | - public function testAutoloadPsr4() |
|
| 82 | - { |
|
| 78 | + /** |
|
| 79 | + * |
|
| 80 | + */ |
|
| 81 | + public function testAutoloadPsr4() |
|
| 82 | + { |
|
| 83 | 83 | |
| 84 | - $testFile = __DIR__ . '/composerpackage-test-libmergepdf.json'; |
|
| 84 | + $testFile = __DIR__ . '/composerpackage-test-libmergepdf.json'; |
|
| 85 | 85 | |
| 86 | - $composer = new ComposerPackage($testFile); |
|
| 86 | + $composer = new ComposerPackage($testFile); |
|
| 87 | 87 | |
| 88 | - $autoload = $composer->getAutoload(); |
|
| 88 | + $autoload = $composer->getAutoload(); |
|
| 89 | 89 | |
| 90 | - $this->assertArrayHasKey('psr-4', $autoload); |
|
| 90 | + $this->assertArrayHasKey('psr-4', $autoload); |
|
| 91 | 91 | |
| 92 | - $this->assertIsArray($autoload['psr-4']); |
|
| 93 | - } |
|
| 92 | + $this->assertIsArray($autoload['psr-4']); |
|
| 93 | + } |
|
| 94 | 94 | |
| 95 | - /** |
|
| 96 | - * |
|
| 97 | - */ |
|
| 98 | - public function testAutoloadClassmap() |
|
| 99 | - { |
|
| 95 | + /** |
|
| 96 | + * |
|
| 97 | + */ |
|
| 98 | + public function testAutoloadClassmap() |
|
| 99 | + { |
|
| 100 | 100 | |
| 101 | - $testFile = __DIR__ . '/composerpackage-test-libmergepdf.json'; |
|
| 101 | + $testFile = __DIR__ . '/composerpackage-test-libmergepdf.json'; |
|
| 102 | 102 | |
| 103 | - $composer = new ComposerPackage($testFile); |
|
| 103 | + $composer = new ComposerPackage($testFile); |
|
| 104 | 104 | |
| 105 | - $autoload = $composer->getAutoload(); |
|
| 105 | + $autoload = $composer->getAutoload(); |
|
| 106 | 106 | |
| 107 | - $this->assertArrayHasKey('classmap', $autoload); |
|
| 107 | + $this->assertArrayHasKey('classmap', $autoload); |
|
| 108 | 108 | |
| 109 | - $this->assertIsArray($autoload['classmap']); |
|
| 110 | - } |
|
| 109 | + $this->assertIsArray($autoload['classmap']); |
|
| 110 | + } |
|
| 111 | 111 | |
| 112 | - /** |
|
| 113 | - * |
|
| 114 | - */ |
|
| 115 | - public function testAutoloadFiles() |
|
| 116 | - { |
|
| 112 | + /** |
|
| 113 | + * |
|
| 114 | + */ |
|
| 115 | + public function testAutoloadFiles() |
|
| 116 | + { |
|
| 117 | 117 | |
| 118 | - $testFile = __DIR__ . '/composerpackage-test-php-di.json'; |
|
| 118 | + $testFile = __DIR__ . '/composerpackage-test-php-di.json'; |
|
| 119 | 119 | |
| 120 | - $composer = new ComposerPackage($testFile); |
|
| 120 | + $composer = new ComposerPackage($testFile); |
|
| 121 | 121 | |
| 122 | - $autoload = $composer->getAutoload(); |
|
| 122 | + $autoload = $composer->getAutoload(); |
|
| 123 | 123 | |
| 124 | - $this->assertArrayHasKey('files', $autoload); |
|
| 124 | + $this->assertArrayHasKey('files', $autoload); |
|
| 125 | 125 | |
| 126 | - $this->assertIsArray($autoload['files']); |
|
| 127 | - } |
|
| 126 | + $this->assertIsArray($autoload['files']); |
|
| 127 | + } |
|
| 128 | 128 | |
| 129 | - public function testOverrideAutoload() |
|
| 130 | - { |
|
| 131 | - $this->markTestIncomplete(); |
|
| 132 | - } |
|
| 129 | + public function testOverrideAutoload() |
|
| 130 | + { |
|
| 131 | + $this->markTestIncomplete(); |
|
| 132 | + } |
|
| 133 | 133 | |
| 134 | - /** |
|
| 135 | - * When composer.json is not where it was specified, what error message (via Exception) should be returned? |
|
| 136 | - */ |
|
| 137 | - public function testMissingComposer() |
|
| 138 | - { |
|
| 139 | - $this->markTestIncomplete(); |
|
| 140 | - } |
|
| 134 | + /** |
|
| 135 | + * When composer.json is not where it was specified, what error message (via Exception) should be returned? |
|
| 136 | + */ |
|
| 137 | + public function testMissingComposer() |
|
| 138 | + { |
|
| 139 | + $this->markTestIncomplete(); |
|
| 140 | + } |
|
| 141 | 141 | } |
@@ -9,18 +9,18 @@ |
||
| 9 | 9 | class ProjectComposerPackageTest extends TestCase |
| 10 | 10 | { |
| 11 | 11 | |
| 12 | - /** |
|
| 13 | - * A simple test to check the getters all work. |
|
| 14 | - */ |
|
| 15 | - public function testParseJson() |
|
| 16 | - { |
|
| 12 | + /** |
|
| 13 | + * A simple test to check the getters all work. |
|
| 14 | + */ |
|
| 15 | + public function testParseJson() |
|
| 16 | + { |
|
| 17 | 17 | |
| 18 | - $testFile = __DIR__ . '/projectcomposerpackage-test-1.json'; |
|
| 18 | + $testFile = __DIR__ . '/projectcomposerpackage-test-1.json'; |
|
| 19 | 19 | |
| 20 | - $composer = new ProjectComposerPackage($testFile); |
|
| 20 | + $composer = new ProjectComposerPackage($testFile); |
|
| 21 | 21 | |
| 22 | - $config = $composer->getStraussConfig(); |
|
| 22 | + $config = $composer->getStraussConfig(); |
|
| 23 | 23 | |
| 24 | - $this->assertInstanceOf(StraussConfig::class, $config); |
|
| 25 | - } |
|
| 24 | + $this->assertInstanceOf(StraussConfig::class, $config); |
|
| 25 | + } |
|
| 26 | 26 | } |