Skip to content

Commit

Permalink
Merge pull request #1027 from spiral/tokenizer-logs
Browse files Browse the repository at this point in the history
[spiral/tokenizer] Write logs only if debug is enabled
  • Loading branch information
butschster committed Dec 13, 2023
2 parents 8f8adff + ad4a43f commit 24c04a4
Show file tree
Hide file tree
Showing 10 changed files with 176 additions and 233 deletions.
2 changes: 1 addition & 1 deletion src/Scaffolder/src/Config/ScaffolderConfig.php
Expand Up @@ -207,7 +207,7 @@ private function joinPathChunks(array $chunks, string $joint): string

private function classify(string $name): string
{
return ( new InflectorFactory() )
return (new InflectorFactory())
->build()
->classify($name);
}
Expand Down
42 changes: 18 additions & 24 deletions src/Tokenizer/src/AbstractLocator.php
Expand Up @@ -42,10 +42,12 @@ protected function availableReflections(): \Generator

if ($reflection->hasIncludes()) {
// We are not analyzing files which has includes, it's not safe to require such reflections
$this->getLogger()->warning(
\sprintf('File `%s` has includes and excluded from analysis', (string) $file),
['file' => $file]
);
if ($this->debug) {
$this->getLogger()->warning(
\sprintf('File `%s` has includes and excluded from analysis', (string) $file),
['file' => $file]
);
}

continue;
}
Expand Down Expand Up @@ -86,16 +88,12 @@ protected function classReflection(string $class): \ReflectionClass
$e = $e->getPrevious();
}

$this->getLogger()->error(
\sprintf(
'%s: %s in %s:%s',
$class,
$e->getMessage(),
$e->getFile(),
$e->getLine()
),
['error' => $e]
);
if ($this->debug) {
$this->getLogger()->error(
\sprintf('%s: %s in %s:%s', $class, $e->getMessage(), $e->getFile(), $e->getLine()),
['error' => $e]
);
}

throw new LocatorException($e->getMessage(), (int) $e->getCode(), $e);
} finally {
Expand Down Expand Up @@ -133,16 +131,12 @@ protected function enumReflection(string $enum): \ReflectionEnum
$e = $e->getPrevious();
}

$this->getLogger()->error(
\sprintf(
'%s: %s in %s:%s',
$enum,
$e->getMessage(),
$e->getFile(),
$e->getLine()
),
['error' => $e]
);
if ($this->debug) {
$this->getLogger()->error(
\sprintf('%s: %s in %s:%s', $enum, $e->getMessage(), $e->getFile(), $e->getLine()),
['error' => $e]
);
}

throw new LocatorException($e->getMessage(), (int) $e->getCode(), $e);
} finally {
Expand Down
116 changes: 116 additions & 0 deletions src/Tokenizer/tests/AbstractLocatorTest.php
@@ -0,0 +1,116 @@
<?php

declare(strict_types=1);

namespace Spiral\Tests\Tokenizer;

use Psr\Log\LoggerInterface;
use Spiral\Tokenizer\AbstractLocator;
use Spiral\Tokenizer\Exception\LocatorException;
use Symfony\Component\Finder\Finder;

final class AbstractLocatorTest extends \PHPUnit\Framework\TestCase
{
private Finder $finder;

protected function setUp(): void
{
$this->finder = new Finder();
$this->finder->files()->in([__DIR__ . '/Classes'])->name('*.php');
}

public function testHasIncludesMessage(): void
{
$class = $this->getLocator(true);
$ref = new \ReflectionMethod($class, 'availableReflections');

$logger = $this->createMock(LoggerInterface::class);
$logger->expects($this->once())->method('warning')->with(
$this->stringContains(' has includes and excluded from analysis')
);
$class->setLogger($logger);

\iterator_to_array($ref->invoke($class));
}

public function testNoHasIncludesMessageSent(): void
{
$class = $this->getLocator();
$ref = new \ReflectionMethod($class, 'availableReflections');

$logger = $this->createMock(LoggerInterface::class);
$logger->expects($this->never())->method('warning');
$class->setLogger($logger);

\iterator_to_array($ref->invoke($class));
}

public function testClassReflectionMessage(): void
{
$class = $this->getLocator(true);
$ref = new \ReflectionMethod($class, 'classReflection');

$logger = $this->createMock(LoggerInterface::class);
$logger->expects($this->once())->method('error')->with(
$this->stringContains("Class 'foo' can not be loaded")
);
$class->setLogger($logger);

try {
$ref->invoke($class, 'foo');
} catch (LocatorException) {
}
}

public function testNoClassReflectionMessageSent(): void
{
$class = $this->getLocator();
$ref = new \ReflectionMethod($class, 'classReflection');

$logger = $this->createMock(LoggerInterface::class);
$logger->expects($this->never())->method('error');
$class->setLogger($logger);

try {
$ref->invoke($class, 'foo');
} catch (LocatorException) {
}
}

public function testEnumReflectionMessage(): void
{
$class = $this->getLocator(true);
$ref = new \ReflectionMethod($class, 'enumReflection');

$logger = $this->createMock(LoggerInterface::class);
$logger->expects($this->once())->method('error')->with(
$this->stringContains("Enum 'foo' can not be loaded")
);
$class->setLogger($logger);

try {
$ref->invoke($class, 'foo');
} catch (LocatorException) {
}
}

public function testNoEnumReflectionMessageSent(): void
{
$class = $this->getLocator();
$ref = new \ReflectionMethod($class, 'enumReflection');

$logger = $this->createMock(LoggerInterface::class);
$logger->expects($this->never())->method('error');
$class->setLogger($logger);

try {
$ref->invoke($class, 'foo');
} catch (LocatorException) {
}
}

private function getLocator(bool $debug = false): AbstractLocator
{
return new class($this->finder, $debug) extends AbstractLocator {};
}
}
53 changes: 3 additions & 50 deletions src/Tokenizer/tests/ClassLocatorTest.php
@@ -1,20 +1,17 @@
<?php

declare(strict_types=1);

namespace Spiral\Tests\Tokenizer;

use PHPUnit\Framework\TestCase;
use Psr\Log\AbstractLogger;
use Spiral\Tokenizer\ClassLocator;
use Spiral\Tokenizer\Config\TokenizerConfig;
use Spiral\Tests\Tokenizer\Classes\ClassA;
use Spiral\Tests\Tokenizer\Classes\ClassB;
use Spiral\Tests\Tokenizer\Classes\ClassC;
use Spiral\Tests\Tokenizer\Classes\Inner\ClassD;
use Spiral\Tests\Tokenizer\Fixtures\TestInterface;
use Spiral\Tests\Tokenizer\Fixtures\TestTrait;
use Spiral\Tokenizer\Tokenizer;

class ClassLocatorTest extends TestCase
final class ClassLocatorTest extends TestCase
{
public function testClassesAll(): void
{
Expand Down Expand Up @@ -106,48 +103,4 @@ public function testClassesByClassB(): void
$this->assertArrayNotHasKey(ClassA::class, $classes);
$this->assertArrayNotHasKey(ClassD::class, $classes);
}

public function testLoggerErrors(): void
{
$tokenizer = $this->getTokenizer();

//By class
$locator = $tokenizer->classLocator();
$logger = new class extends AbstractLogger
{
private $messages = [];

public function log($level, $message, array $context = []): void
{
$this->messages[] = compact('level', 'message');
}

public function getMessages()
{
return $this->messages;
}
};

/**
* @var ClassLocator $locator
*/
$locator->setLogger($logger);

$locator->getClasses(ClassB::class);

$this->assertStringContainsString(
' has includes and excluded from analysis',
$logger->getMessages()[0]['message']
);
}

protected function getTokenizer(): Tokenizer
{
$config = new TokenizerConfig([
'directories' => [__DIR__],
'exclude' => ['Excluded']
]);

return new Tokenizer($config);
}
}
53 changes: 3 additions & 50 deletions src/Tokenizer/tests/EnumLocatorTest.php
@@ -1,22 +1,19 @@
<?php

declare(strict_types=1);

namespace Spiral\Tests\Tokenizer;

use PHPUnit\Framework\TestCase;
use Psr\Log\AbstractLogger;
use Spiral\Tests\Tokenizer\Enums\BadEnum;
use Spiral\Tests\Tokenizer\Enums\EnumA;
use Spiral\Tests\Tokenizer\Enums\EnumB;
use Spiral\Tests\Tokenizer\Enums\EnumC;
use Spiral\Tests\Tokenizer\Enums\Excluded\EnumXX;
use Spiral\Tests\Tokenizer\Enums\Inner\EnumD;
use Spiral\Tokenizer\ClassLocator;
use Spiral\Tokenizer\Config\TokenizerConfig;
use Spiral\Tests\Tokenizer\Fixtures\TestInterface;
use Spiral\Tests\Tokenizer\Fixtures\TestTrait;
use Spiral\Tokenizer\Tokenizer;

class EnumLocatorTest extends TestCase
final class EnumLocatorTest extends TestCase
{
public function testEnumsAll(): void
{
Expand Down Expand Up @@ -77,48 +74,4 @@ public function testEnumsByTrait(): void
$this->assertArrayNotHasKey(EnumA::class, $enums);
$this->assertArrayNotHasKey(EnumD::class, $enums);
}

public function testLoggerErrors(): void
{
$tokenizer = $this->getTokenizer();

//By class
$locator = $tokenizer->enumLocator();
$logger = new class extends AbstractLogger
{
private $messages = [];

public function log($level, $message, array $context = []): void
{
$this->messages[] = compact('level', 'message');
}

public function getMessages()
{
return $this->messages;
}
};

/**
* @var ClassLocator $locator
*/
$locator->setLogger($logger);

$locator->getEnums(EnumB::class);

$this->assertStringContainsString(
' has includes and excluded from analysis',
$logger->getMessages()[0]['message']
);
}

protected function getTokenizer(): Tokenizer
{
$config = new TokenizerConfig([
'directories' => [__DIR__],
'exclude' => ['Excluded']
]);

return new Tokenizer($config);
}
}

0 comments on commit 24c04a4

Please sign in to comment.