From d73e701f46c1ac27948821569cb28cfe766513cd Mon Sep 17 00:00:00 2001 From: roettigl Date: Wed, 14 Aug 2019 13:59:28 +0200 Subject: [PATCH 1/3] MC-19094: Refactoring for better extendability. --- .gitignore | 1 + src/BreakingChangeDocReportBuilder.php | 79 +++++++--------- src/ObjectBuilderContainer.php | 113 +++++++++++++++++++++++ src/ReportBuilder.php | 93 +++++++++++-------- src/Scanner/DbSchemaScannerDecorator.php | 107 ++++++++------------- src/Scanner/Scanner.php | 57 ++++-------- src/Scanner/ScannerInterface.php | 26 ++++++ src/ScannerRegistry.php | 86 +++++++++++++++++ 8 files changed, 369 insertions(+), 193 deletions(-) create mode 100644 src/ObjectBuilderContainer.php create mode 100644 src/Scanner/ScannerInterface.php create mode 100644 src/ScannerRegistry.php diff --git a/.gitignore b/.gitignore index 5049f842..ee35c077 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /vendor /.idea +auth.json \ No newline at end of file diff --git a/src/BreakingChangeDocReportBuilder.php b/src/BreakingChangeDocReportBuilder.php index c5365dd2..a9d95344 100644 --- a/src/BreakingChangeDocReportBuilder.php +++ b/src/BreakingChangeDocReportBuilder.php @@ -6,9 +6,9 @@ namespace Magento\SemanticVersionChecker; +use Exception; use Magento\SemanticVersionChecker\Analyzer\ApiMembership\ApiMembershipAnalyzer; use Magento\SemanticVersionChecker\Finder\DbSchemaFinderDecorator; -use Magento\SemanticVersionChecker\Scanner\DbSchemaScannerDecorator; use PHPSemVerChecker\Report\Report; class BreakingChangeDocReportBuilder extends ReportBuilder @@ -28,27 +28,41 @@ class BreakingChangeDocReportBuilder extends ReportBuilder */ public function makeCompleteVersionReport() { - $this->makeVersionReport(static::REPORT_TYPE_API); + $this->makeVersionReport(); } /** - * Create BIC reports for API changes and existing code that gained or lost API membership + * Get the report of changes made to the existing APIs + * + * @return Report + */ + public function getBreakingChangeReport() + { + return $this->changeReport; + } + + /** + * Get the report of changes made to API membership (items that gained/lost API status) * - * @param string $ignoredReportType + * @return Report + */ + public function getApiMembershipReport() + { + return $this->membershipReport; + } + + /** + * Create BIC reports for API changes and existing code that gained or lost API membership * @return void - * @throws \Exception + * @throws Exception */ - protected function buildReport($ignoredReportType = null) + protected function buildReport() { $fileIterator = new DbSchemaFinderDecorator(); $sourceBeforeFiles = $fileIterator->findFromString($this->sourceBeforeDir, '', ''); $sourceAfterFiles = $fileIterator->findFromString($this->sourceAfterDir, '', ''); - - $apiScannerBefore = new DbSchemaScannerDecorator(static::REPORT_TYPE_API); - $apiScannerAfter = new DbSchemaScannerDecorator(static::REPORT_TYPE_API); - - $fullScannerBefore = new DbSchemaScannerDecorator(static::REPORT_TYPE_ALL); - $fullScannerAfter = new DbSchemaScannerDecorator(static::REPORT_TYPE_ALL); + $scannerRegistryBefore = new ScannerRegistry($this->objectContainer->getAllScanner()); + $scannerRegistryAfter = new ScannerRegistry($this->objectContainer->getAllScanner()); $filters = $this->getFilters($this->sourceBeforeDir, $this->sourceAfterDir); foreach ($filters as $filter) { @@ -56,50 +70,25 @@ protected function buildReport($ignoredReportType = null) } foreach ($sourceBeforeFiles as $file) { - $fullScannerBefore->scan($file); - $apiScannerBefore->scan($file); + $scannerRegistryBefore->scanFile($file); } foreach ($sourceAfterFiles as $file) { - $fullScannerAfter->scan($file); - $apiScannerAfter->scan($file); + $scannerRegistryAfter->scanFile($file); } - $apiRegistryBefore = $apiScannerBefore->getRegistry(); - $apiRegistryAfter = $apiScannerAfter->getRegistry(); - - $fullRegistryBefore = $fullScannerBefore->getRegistry(); - $fullRegistryAfter = $fullScannerAfter->getRegistry(); + $beforeRegistryList = $scannerRegistryBefore->getScannerRegistryList(); + $afterRegistryList = $scannerRegistryAfter->getScannerRegistryList(); $analyzer = new ApiMembershipAnalyzer(); $analyzer->analyzeWithMembership( - $apiRegistryBefore, - $apiRegistryAfter, - $fullRegistryBefore, - $fullRegistryAfter + $beforeRegistryList['api'], + $afterRegistryList['api'], + $beforeRegistryList['full'], + $afterRegistryList['full'] ); $this->changeReport = $analyzer->getBreakingChangeReport(); $this->membershipReport = $analyzer->getApiMembershipReport(); } - - /** - * Get the report of changes made to the existing APIs - * - * @return Report - */ - public function getBreakingChangeReport() - { - return $this->changeReport; - } - - /** - * Get the report of changes made to API membership (items that gained/lost API status) - * - * @return Report - */ - public function getApiMembershipReport() - { - return $this->membershipReport; - } } diff --git a/src/ObjectBuilderContainer.php b/src/ObjectBuilderContainer.php new file mode 100644 index 00000000..d1bd5857 --- /dev/null +++ b/src/ObjectBuilderContainer.php @@ -0,0 +1,113 @@ +getAllScanner(); + + if ($reportType === 'api') { + return [$allScanner['api'], $allScanner['dbSchema']]; + } + + return $allScanner; + } + + + public function getAllScanner(): array + { + // @todo use dependency injection + $scanner = $this->buildFullScanner(); + $scannerApi = $this->buildApiScanner(); + $scannerDb = new DbSchemaScannerDecorator($scanner->getRegistry()); + + return [ + 'full' => [ + 'type' => 'php', + 'pattern' => [ + '*.php', + ], + 'scanner' => $scanner, + ], + 'api' => [ + 'type' => 'php', + 'pattern' => [ + '*.php', + ], + 'scanner' => $scannerApi, + ], + 'dbSchema' => [ + 'type' => 'xml', + 'pattern' => [ + '*.xml', + ], + 'scanner' => $scannerDb, + ], + ]; + } + + /** + * @return Scanner + * @todo use dependency injection + */ + private function buildFullScanner() + { + $registry = new Registry(); + $parser = new Parser(new Emulative()); + $traverser = new NodeTraverser(); + + $classVisitor = new ClassVisitor($registry); + $interfaceVisitor = new InterfaceVisitor($registry); + $apiVisitors = [ + new NameResolver(), + $classVisitor, + $interfaceVisitor, + new FunctionVisitor($registry), + new TraitVisitor($registry), + ]; + + return new Scanner($registry, $parser, $traverser, $apiVisitors); + } + + /** + * @return Scanner + * @todo use dependency injection + */ + private function buildApiScanner() + { + $registry = new Registry(); + $parser = new Parser(new Emulative()); + $traverser = new NodeTraverser(); + + $classVisitor = new ApiClassVisitor($registry); + $interfaceVisitor = new ApiInterfaceVisitor($registry); + $apiVisitors = [ + new NameResolver(), + $classVisitor, + $interfaceVisitor, + new FunctionVisitor($registry), + new TraitVisitor($registry), + ]; + + return new Scanner($registry, $parser, $traverser, $apiVisitors); + } +} diff --git a/src/ReportBuilder.php b/src/ReportBuilder.php index b9610b28..e1ee7c2e 100644 --- a/src/ReportBuilder.php +++ b/src/ReportBuilder.php @@ -3,13 +3,14 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ + // @codingStandardsIgnoreFile namespace Magento\SemanticVersionChecker; +use Exception; use Magento\SemanticVersionChecker\Analyzer\Analyzer; use Magento\SemanticVersionChecker\Filter\FilePatternFilter; use Magento\SemanticVersionChecker\Finder\DbSchemaFinderDecorator; -use Magento\SemanticVersionChecker\Scanner\DbSchemaScannerDecorator; use PHPSemVerChecker\Configuration\LevelMapping; use PHPSemVerChecker\Filter\SourceFilter; use PHPSemVerChecker\Report\Report; @@ -28,12 +29,19 @@ class ReportBuilder protected $sourceBeforeDir; protected $sourceAfterDir; + /** + * @var ObjectBuilderContainer + */ + protected $objectContainer; + public function __construct($includePatternsPath, $excludePatternsPath, $sourceBeforeDir, $sourceAfterDir) { $this->includePatternsPath = $includePatternsPath; $this->excludePatternsPath = $excludePatternsPath; $this->sourceBeforeDir = $sourceBeforeDir; $this->sourceAfterDir = $sourceAfterDir; + + $this->objectContainer = new ObjectBuilderContainer(); } /** @@ -41,35 +49,7 @@ public function __construct($includePatternsPath, $excludePatternsPath, $sourceB */ public function makeCompleteVersionReport() { - $apiReport = $this->makeVersionReport(self::REPORT_TYPE_API); - $allReport = $this->dampenNonApiReport( - $this->makeVersionReport(self::REPORT_TYPE_ALL) - ); - return $allReport->merge($apiReport); - } - - /** - * Get filters for source files - * - * @param string $sourceBeforeDir - * @param string $sourceAfterDir - * @return array - */ - protected function getFilters($sourceBeforeDir, $sourceAfterDir) - { - $filters = [ - // always filter out files that are identical before and after - new SourceFilter(), - // process the include and exclude patterns - new FilePatternFilter( - $this->includePatternsPath, - $this->excludePatternsPath, - $sourceBeforeDir, - $sourceAfterDir - ) - ]; - - return $filters; + return $this->makeVersionReport(); } /** @@ -78,7 +58,7 @@ protected function getFilters($sourceBeforeDir, $sourceAfterDir) * @param string $reportType REPORT_TYPE_API|REPORT_TYPE_ALL * @return Report */ - protected function makeVersionReport($reportType) + protected function makeVersionReport() { $originalMapping = LevelMapping::$mapping; // Customize severity level of some @api changes @@ -95,7 +75,7 @@ protected function makeVersionReport($reportType) ); try { - $report = $this->buildReport($reportType); + $report = $this->buildReport(); } finally { // Restore original severity levels LevelMapping::setOverrides($originalMapping); @@ -109,16 +89,16 @@ protected function makeVersionReport($reportType) * * @param string $reportType * @return Report - * @throws \Exception + * @throws Exception */ - protected function buildReport($reportType) + protected function buildReport() { $fileIterator = new DbSchemaFinderDecorator(); $sourceBeforeFiles = $fileIterator->findFromString($this->sourceBeforeDir, '', ''); $sourceAfterFiles = $fileIterator->findFromString($this->sourceAfterDir, '', ''); - $scannerBefore = new DbSchemaScannerDecorator($reportType); - $scannerAfter = new DbSchemaScannerDecorator($reportType); + $scannerBefore = new ScannerRegistry($this->objectContainer->getAllScanner()); + $scannerAfter = new ScannerRegistry($this->objectContainer->getAllScanner()); $filters = $this->getFilters($this->sourceBeforeDir, $this->sourceAfterDir); foreach ($filters as $filter) { @@ -127,18 +107,49 @@ protected function buildReport($reportType) } foreach ($sourceBeforeFiles as $file) { - $scannerBefore->scan($file); + $scannerBefore->scanFile($file); } foreach ($sourceAfterFiles as $file) { - $scannerAfter->scan($file); + $scannerAfter->scanFile($file); } - $registryBefore = $scannerBefore->getRegistry(); - $registryAfter = $scannerAfter->getRegistry(); + $beforeRegistryList = $scannerBefore->getScannerRegistryList(); + $afterRegistryList = $scannerAfter->getScannerRegistryList(); + + $analyzer = new Analyzer(); + $apiReport = $analyzer->analyze($beforeRegistryList['api'], $afterRegistryList['api']); $analyzer = new Analyzer(); - return $analyzer->analyze($registryBefore, $registryAfter); + $allReport = $this->dampenNonApiReport( + $analyzer->analyze($beforeRegistryList['full'], $afterRegistryList['full']) + ); + + return $allReport->merge($apiReport); + } + + /** + * Get filters for source files + * + * @param string $sourceBeforeDir + * @param string $sourceAfterDir + * @return array + */ + protected function getFilters($sourceBeforeDir, $sourceAfterDir): array + { + $filters = [ + // always filter out files that are identical before and after + new SourceFilter(), + // process the include and exclude patterns + new FilePatternFilter( + $this->includePatternsPath, + $this->excludePatternsPath, + $sourceBeforeDir, + $sourceAfterDir + ), + ]; + + return $filters; } /** diff --git a/src/Scanner/DbSchemaScannerDecorator.php b/src/Scanner/DbSchemaScannerDecorator.php index 1a85c994..952ef2f7 100644 --- a/src/Scanner/DbSchemaScannerDecorator.php +++ b/src/Scanner/DbSchemaScannerDecorator.php @@ -12,61 +12,64 @@ * Class ScannerDecorator * @package Magento\SemanticVersionChecker\Scanner */ -class DbSchemaScannerDecorator +class DbSchemaScannerDecorator implements ScannerInterface { - /** - * @var Scanner - */ - private $basicScanner; /** * @var Registry */ private $registry; - /** - * @param string $reportType "api|all" - * @throws \Exception - */ - public function __construct($reportType = 'all') + + public function __construct(Registry $registry) { - $this->basicScanner = new Scanner($reportType); - $this->registry = $this->basicScanner->getRegistry(); + $this->registry = $registry; } /** * @param string $file * @return void */ - public function scan($file) + public function scan(string $file): void { - if ($this->isXml($file)) { - // Set the current file used by the registry so that we can tell where the change was scanned. - $this->registry->setCurrentFile($file); - $xml = simplexml_load_file($file); - $xmlResult = json_decode(json_encode($xml), true); + // Set the current file used by the registry so that we can tell where the change was scanned. + $this->registry->setCurrentFile($file); + $xml = simplexml_load_string(file_get_contents($file)); + $xmlResult = json_decode(json_encode($xml), true); - if (isset($xmlResult['table']['@attributes'])) { - $this->processTable($xmlResult['table']); - } else { - foreach ($xmlResult['table'] as $tableData) { - $this->processTable($tableData); - } - } + if (isset($xmlResult['table']['@attributes'])) { + $this->processTable($xmlResult['table']); } else { - $this->basicScanner->scan($file); + foreach ($xmlResult['table'] as $tableData) { + $this->processTable($tableData); + } } } /** - * Check whether content is XML file - * - * @param string $file - * @return int + * @param array $data */ - private function isXml($file) + private function processTable(array $data) { - return (bool) preg_match('/^.*.xml$/', $file); + $name = $data['@attributes']['name']; + $moduleName = $this->getModuleName(); + $this->getRegistry()->data['table'][$moduleName][$name]['resource'] = + $data['@attributes']['resource']; + + $types = ['column', 'constraint', 'index']; + foreach ($types as $type) { + if (isset($data[$type])) { + if (isset($data[$type]['@attributes'])) { + $this->registerObject($name, $type, $data[$type]['@attributes']); + } else { + foreach ($data[$type] as $typeData) { + if (isset($typeData['@attributes'])) { + $this->registerObject($name, $type, $typeData['@attributes']); + } + } + } + } + } } /** @@ -79,9 +82,15 @@ private function getModuleName() $currentFile = $this->getRegistry()->getCurrentFile(); $matches = []; preg_match('/^.*(Magento\/\w+).*.xml$/', $currentFile, $matches); + return str_replace('/', '_', $matches[1]); } + public function getRegistry(): Registry + { + return $this->registry; + } + /** * @param string $name * @param string $type @@ -99,38 +108,4 @@ private function registerObject($name, $type, array $typeData) $this->getRegistry()->data['table'][$this->getModuleName()][$name][$type][$typeName] = $typeName; } - - /** - * @param array $data - */ - public function processTable(array $data) - { - $name = $data['@attributes']['name']; - $moduleName = $this->getModuleName(); - $this->getRegistry()->data['table'][$moduleName][$name]['resource'] = - $data['@attributes']['resource']; - - $types = ['column', 'constraint', 'index']; - foreach ($types as $type) { - if (isset($data[$type])) { - if (isset($data[$type]['@attributes'])) { - $this->registerObject($name, $type, $data[$type]['@attributes']); - } else { - foreach ($data[$type] as $typeData) { - if (isset($typeData['@attributes'])) { - $this->registerObject($name, $type, $typeData['@attributes']); - } - } - } - } - } - } - - /** - * @return \PHPSemVerChecker\Registry\Registry - */ - public function getRegistry() - { - return $this->registry; - } } diff --git a/src/Scanner/Scanner.php b/src/Scanner/Scanner.php index 1da9c5ac..100051c8 100644 --- a/src/Scanner/Scanner.php +++ b/src/Scanner/Scanner.php @@ -7,23 +7,16 @@ namespace Magento\SemanticVersionChecker\Scanner; use PhpParser\Error; -use PhpParser\Lexer\Emulative; use PhpParser\NodeTraverser; -use PhpParser\NodeVisitor\NameResolver; +use PhpParser\NodeVisitor; use PhpParser\Parser\Php7 as Parser; use PHPSemVerChecker\Registry\Registry; -use Magento\SemanticVersionChecker\Visitor\ApiClassVisitor; -use PHPSemVerChecker\Visitor\ClassVisitor; -use PHPSemVerChecker\Visitor\FunctionVisitor; -use Magento\SemanticVersionChecker\Visitor\ApiInterfaceVisitor; -use PHPSemVerChecker\Visitor\InterfaceVisitor; -use PHPSemVerChecker\Visitor\TraitVisitor; use RuntimeException; -class Scanner +class Scanner implements ScannerInterface { /** - * @var \PHPSemVerChecker\Registry\Registry + * @var Registry */ protected $registry; @@ -33,38 +26,21 @@ class Scanner protected $parser; /** - * @var \PhpParser\NodeTraverser + * @var NodeTraverser */ protected $traverser; /** - * @param string $reportType "api|all" - * @throws \Exception + * @param Registry $registry + * @param Parser $parser + * @param NodeTraverser $nodeTraverser + * @param NodeVisitor[] $vistors */ - public function __construct($reportType = 'all') + public function __construct(Registry $registry, Parser $parser, NodeTraverser $traverser, array $visitors) { - $this->registry = new Registry(); - $this->parser = new Parser(new Emulative()); - $this->traverser = new NodeTraverser(); - - if ($reportType === 'all') { - $classVisitor = new ClassVisitor($this->registry); - $interfaceVisitor = new InterfaceVisitor($this->registry); - } elseif ($reportType === 'api') { - $classVisitor = new ApiClassVisitor($this->registry); - $interfaceVisitor = new ApiInterfaceVisitor($this->registry); - } else { - throw new \Exception("Unexpected report type given: \"$reportType\""); - } - - $visitors = [ - new NameResolver(), - $classVisitor, - $interfaceVisitor, - new FunctionVisitor($this->registry), - new TraitVisitor($this->registry), - ]; - + $this->registry = $registry; + $this->parser = $parser; + $this->traverser = $traverser; foreach ($visitors as $visitor) { $this->traverser->addVisitor($visitor); } @@ -74,25 +50,24 @@ public function __construct($reportType = 'all') * @param string $file * @return void */ - public function scan($file) + public function scan(string $file): void { // Set the current file used by the registry so that we can tell where the change was scanned. $this->registry->setCurrentFile($file); - $code = file_get_contents($file); try { $statements = $this->parser->parse($code); $this->traverser->traverse($statements); } catch (Error $e) { - throw new RuntimeException('Parse Error: ' . $e->getMessage() . ' in ' . $file); + throw new RuntimeException('Parse Error: '.$e->getMessage().' in '.$file); } } /** - * @return \PHPSemVerChecker\Registry\Registry + * @return Registry */ - public function getRegistry() + public function getRegistry(): Registry { return $this->registry; } diff --git a/src/Scanner/ScannerInterface.php b/src/Scanner/ScannerInterface.php new file mode 100644 index 00000000..1ecfc059 --- /dev/null +++ b/src/Scanner/ScannerInterface.php @@ -0,0 +1,26 @@ +scanners = $scanners; + } + + /** + * Fill the registry for registered scanner. + * + * @param string $filePath + */ + public function scanFile(string $filePath): void + { + foreach ($this->getScannerByFile($filePath) as $scanner) { + $scanner->scan($filePath); + } + } + + /** + * @param string $filePath + * @return array + */ + private function getScannerByFile(string $filePath): array + { + $relevantScanner = []; + foreach ($this->scanners as $scanner) { + foreach ($scanner['pattern'] as $pattern) { + if (preg_match('/^.'.$pattern.'$/', $filePath)) { + $relevantScanner[] = $scanner['scanner']; + } + } + } + + return $relevantScanner; + } + + /** + * @return Registry[] + */ + public function getPhpScannerRegistryList(): array + { + $registryList = []; + foreach ($this->scanners as $key => $scanner) { + if ($scanner['type'] !== 'php') { + continue; + } + /** @var Scanner $scannerObject */ + $scannerObject = $scanner['scanner']; + $registryList[$key] = $scannerObject->getRegistry(); + } + + return $registryList; + } + + /** + * @return Registry[] + */ + public function getScannerRegistryList(): array + { + $registryList = []; + foreach ($this->scanners as $key => $scanner) { + /** @var Scanner $scannerObject */ + $scannerObject = $scanner['scanner']; + $registryList[$key] = $scannerObject->getRegistry(); + } + + return $registryList; + } +} From 2bdebd22aa9c5cc56eb3fadd52c3fd63bbed7b9c Mon Sep 17 00:00:00 2001 From: roettigl Date: Wed, 14 Aug 2019 14:50:33 +0200 Subject: [PATCH 2/3] MC-19094: Refactoring for better extendability. --- src/BreakingChangeDocReportBuilder.php | 8 ++++---- src/ObjectBuilderContainer.php | 15 ++------------- src/ReportBuilder.php | 12 ++++++++---- src/ScannerRegistry.php | 18 ------------------ 4 files changed, 14 insertions(+), 39 deletions(-) diff --git a/src/BreakingChangeDocReportBuilder.php b/src/BreakingChangeDocReportBuilder.php index a9d95344..2061e94b 100644 --- a/src/BreakingChangeDocReportBuilder.php +++ b/src/BreakingChangeDocReportBuilder.php @@ -82,10 +82,10 @@ protected function buildReport() $analyzer = new ApiMembershipAnalyzer(); $analyzer->analyzeWithMembership( - $beforeRegistryList['api'], - $afterRegistryList['api'], - $beforeRegistryList['full'], - $afterRegistryList['full'] + $beforeRegistryList[self::REPORT_TYPE_API], + $afterRegistryList[self::REPORT_TYPE_API], + $beforeRegistryList[self::REPORT_TYPE_ALL], + $afterRegistryList[self::REPORT_TYPE_ALL] ); $this->changeReport = $analyzer->getBreakingChangeReport(); diff --git a/src/ObjectBuilderContainer.php b/src/ObjectBuilderContainer.php index d1bd5857..532245cc 100644 --- a/src/ObjectBuilderContainer.php +++ b/src/ObjectBuilderContainer.php @@ -21,27 +21,16 @@ class ObjectBuilderContainer { - public function getScannerByKey(string $reportType) - { - $allScanner = $this->getAllScanner(); - - if ($reportType === 'api') { - return [$allScanner['api'], $allScanner['dbSchema']]; - } - - return $allScanner; - } - - public function getAllScanner(): array { // @todo use dependency injection $scanner = $this->buildFullScanner(); $scannerApi = $this->buildApiScanner(); + // @todo refactoring should use own registry step 1 to get an working poc $scannerDb = new DbSchemaScannerDecorator($scanner->getRegistry()); return [ - 'full' => [ + 'all' => [ 'type' => 'php', 'pattern' => [ '*.php', diff --git a/src/ReportBuilder.php b/src/ReportBuilder.php index e1ee7c2e..87965844 100644 --- a/src/ReportBuilder.php +++ b/src/ReportBuilder.php @@ -100,8 +100,7 @@ protected function buildReport() $scannerBefore = new ScannerRegistry($this->objectContainer->getAllScanner()); $scannerAfter = new ScannerRegistry($this->objectContainer->getAllScanner()); - $filters = $this->getFilters($this->sourceBeforeDir, $this->sourceAfterDir); - foreach ($filters as $filter) { + foreach ($this->getFilters($this->sourceBeforeDir, $this->sourceAfterDir) as $filter) { // filters modify arrays by reference $filter->filter($sourceBeforeFiles, $sourceAfterFiles); } @@ -117,12 +116,16 @@ protected function buildReport() $beforeRegistryList = $scannerBefore->getScannerRegistryList(); $afterRegistryList = $scannerAfter->getScannerRegistryList(); + // @todo Refactor should merge all report types to own report (POC implementation) $analyzer = new Analyzer(); - $apiReport = $analyzer->analyze($beforeRegistryList['api'], $afterRegistryList['api']); + $apiReport = $analyzer->analyze( + $beforeRegistryList[self::REPORT_TYPE_API], + $afterRegistryList[self::REPORT_TYPE_API] + ); $analyzer = new Analyzer(); $allReport = $this->dampenNonApiReport( - $analyzer->analyze($beforeRegistryList['full'], $afterRegistryList['full']) + $analyzer->analyze($beforeRegistryList[self::REPORT_TYPE_ALL], $afterRegistryList[self::REPORT_TYPE_ALL]) ); return $allReport->merge($apiReport); @@ -170,6 +173,7 @@ protected function dampenNonApiReport(Report $report) $dampenedDifferences[$context][Level::MINOR] = []; $dampenedDifferences[$context][Level::MAJOR] = []; } + return new InjectableReport($dampenedDifferences); } } diff --git a/src/ScannerRegistry.php b/src/ScannerRegistry.php index 6cd7c118..5488c4a2 100644 --- a/src/ScannerRegistry.php +++ b/src/ScannerRegistry.php @@ -51,24 +51,6 @@ private function getScannerByFile(string $filePath): array return $relevantScanner; } - /** - * @return Registry[] - */ - public function getPhpScannerRegistryList(): array - { - $registryList = []; - foreach ($this->scanners as $key => $scanner) { - if ($scanner['type'] !== 'php') { - continue; - } - /** @var Scanner $scannerObject */ - $scannerObject = $scanner['scanner']; - $registryList[$key] = $scannerObject->getRegistry(); - } - - return $registryList; - } - /** * @return Registry[] */ From e426854fd2e971a100142e44a313760e4e4da0ec Mon Sep 17 00:00:00 2001 From: roettigl Date: Wed, 14 Aug 2019 16:09:31 +0200 Subject: [PATCH 3/3] MC-19094: Refactoring for better extendability. --- src/Analyzer/Analyzer.php | 1 + src/ReportBuilder.php | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Analyzer/Analyzer.php b/src/Analyzer/Analyzer.php index 0e31781e..5676a213 100644 --- a/src/Analyzer/Analyzer.php +++ b/src/Analyzer/Analyzer.php @@ -27,6 +27,7 @@ public function analyze($registryBefore, $registryAfter) $analyzers = [ new ClassAnalyzer(), new InterfaceAnalyzer(), + // @todo should moved in a extra analyzer for a better extendability. new DbSchemaAnalyzer(), new DbSchemaWhitelistAnalyzer(), new DbSchemaWhitelistReductionAnalyzer() diff --git a/src/ReportBuilder.php b/src/ReportBuilder.php index 87965844..19e7d17b 100644 --- a/src/ReportBuilder.php +++ b/src/ReportBuilder.php @@ -123,9 +123,11 @@ protected function buildReport() $afterRegistryList[self::REPORT_TYPE_API] ); - $analyzer = new Analyzer(); $allReport = $this->dampenNonApiReport( - $analyzer->analyze($beforeRegistryList[self::REPORT_TYPE_ALL], $afterRegistryList[self::REPORT_TYPE_ALL]) + $analyzer->analyze( + $beforeRegistryList[self::REPORT_TYPE_ALL], + $afterRegistryList[self::REPORT_TYPE_ALL] + ) ); return $allReport->merge($apiReport);