Skip to content

Commit 98bceac

Browse files
authored
Analyser: more specific path has dev/prod mark priority (#142)
1 parent 2a45e4e commit 98bceac

File tree

4 files changed

+48
-8
lines changed

4 files changed

+48
-8
lines changed

src/Analyser.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use ReflectionFunction;
1414
use ShipMonk\ComposerDependencyAnalyser\Config\Configuration;
1515
use ShipMonk\ComposerDependencyAnalyser\Config\ErrorType;
16+
use ShipMonk\ComposerDependencyAnalyser\Config\PathToScan;
1617
use ShipMonk\ComposerDependencyAnalyser\Exception\InvalidPathException;
1718
use ShipMonk\ComposerDependencyAnalyser\Result\AnalysisResult;
1819
use ShipMonk\ComposerDependencyAnalyser\Result\SymbolUsage;
@@ -37,6 +38,7 @@
3738
use function strtolower;
3839
use function substr;
3940
use function trim;
41+
use function usort;
4042
use const DIRECTORY_SEPARATOR;
4143

4244
class Analyser
@@ -279,7 +281,12 @@ private function getUniqueFilePathsToScan(): array
279281
{
280282
$allFilePaths = [];
281283

282-
foreach ($this->config->getPathsToScan() as $scanPath) {
284+
$scanPaths = $this->config->getPathsToScan();
285+
usort($scanPaths, static function (PathToScan $a, PathToScan $b): int {
286+
return strlen($a->getPath()) <=> strlen($b->getPath());
287+
});
288+
289+
foreach ($scanPaths as $scanPath) {
283290
foreach ($this->listPhpFilesIn($scanPath->getPath()) as $filePath) {
284291
if ($this->config->isExcludedFilepath($filePath)) {
285292
continue;

tests/AnalyserTest.php

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,33 @@ public function testDevPathInsideProdPath(): void
534534
$this->assertResultsWithoutUsages($this->createAnalysisResult(2, []), $result);
535535
}
536536

537+
public function testProdPathInsideDevPath(): void
538+
{
539+
$vendorDir = realpath(__DIR__ . '/data/autoloaded/vendor');
540+
$devPath = realpath(__DIR__ . '/data/not-autoloaded/prod-in-subdirectory');
541+
$prodPath = realpath(__DIR__ . '/data/not-autoloaded/prod-in-subdirectory/prod');
542+
self::assertNotFalse($vendorDir);
543+
self::assertNotFalse($devPath);
544+
self::assertNotFalse($prodPath);
545+
546+
$config = new Configuration();
547+
$config->addPathToScan($prodPath, false);
548+
$config->addPathToScan($devPath, true);
549+
550+
$detector = new Analyser(
551+
$this->getStopwatchMock(),
552+
[$vendorDir => $this->getClassLoaderMock()],
553+
$config,
554+
[
555+
'regular/package' => false,
556+
'dev/package' => true,
557+
]
558+
);
559+
$result = $detector->run();
560+
561+
$this->assertResultsWithoutUsages($this->createAnalysisResult(2, []), $result);
562+
}
563+
537564
public function testOtherSymbols(): void
538565
{
539566
require_once __DIR__ . '/data/not-autoloaded/other-symbols/symbol-declaration.php';
@@ -703,13 +730,13 @@ private function getClassLoaderMock(): ClassLoader
703730

704731
private function assertResultsWithoutUsages(AnalysisResult $expectedResult, AnalysisResult $result): void
705732
{
706-
self::assertSame($expectedResult->getScannedFilesCount(), $result->getScannedFilesCount());
707-
self::assertEquals($expectedResult->getUnusedIgnores(), $result->getUnusedIgnores());
708-
self::assertEquals($expectedResult->getUnknownClassErrors(), $result->getUnknownClassErrors());
709-
self::assertEquals($expectedResult->getShadowDependencyErrors(), $result->getShadowDependencyErrors());
710-
self::assertEquals($expectedResult->getDevDependencyInProductionErrors(), $result->getDevDependencyInProductionErrors());
711-
self::assertEquals($expectedResult->getProdDependencyOnlyInDevErrors(), $result->getProdDependencyOnlyInDevErrors());
712-
self::assertEquals($expectedResult->getUnusedDependencyErrors(), $result->getUnusedDependencyErrors());
733+
self::assertSame($expectedResult->getScannedFilesCount(), $result->getScannedFilesCount(), 'Scanned files count mismatch');
734+
self::assertEquals($expectedResult->getUnusedIgnores(), $result->getUnusedIgnores(), 'Unused ignores mismatch');
735+
self::assertEquals($expectedResult->getUnknownClassErrors(), $result->getUnknownClassErrors(), 'Unknown class mismatch');
736+
self::assertEquals($expectedResult->getShadowDependencyErrors(), $result->getShadowDependencyErrors(), 'Shadow dependency mismatch');
737+
self::assertEquals($expectedResult->getDevDependencyInProductionErrors(), $result->getDevDependencyInProductionErrors(), 'Dev dependency in production mismatch');
738+
self::assertEquals($expectedResult->getProdDependencyOnlyInDevErrors(), $result->getProdDependencyOnlyInDevErrors(), 'Prod dependency only in dev mismatch');
739+
self::assertEquals($expectedResult->getUnusedDependencyErrors(), $result->getUnusedDependencyErrors(), 'Unused dependency mismatch');
713740
}
714741

715742
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?php
2+
3+
\Dev\Package\Clazz::class;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?php
2+
3+
\Regular\Package\Clazz::class;

0 commit comments

Comments
 (0)