Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Public Member Functions | Static Public Member Functions | Data Fields | Protected Member Functions | Static Protected Member Functions | Static Protected Attributes
DependencyTest Class Reference
Inheritance diagram for DependencyTest:

Public Member Functions

 testUndeclared ()
 
 collectRedundant ()
 
 testRedundant ()
 
 getAllFiles ()
 

Static Public Member Functions

static setUpBeforeClass ()
 

Data Fields

const TYPE_SOFT = 'soft'
 
const TYPE_HARD = 'hard'
 
const MAP_TYPE_DECLARED = 'declared'
 
const MAP_TYPE_FOUND = 'found'
 
const MAP_TYPE_REDUNDANT = 'redundant'
 
const DIR_PATH_COUNT = 4
 

Protected Member Functions

 _getCleanedFileContents ($fileType, $file)
 
 _collectDependencies ($currentModuleName, $dependencies=[])
 
 _prepareFiles ($fileType, $files, $skip=null)
 
 _getDependencies ($module, $type, $mapType)
 
 _setDependencies ($module, $type, $mapType, $dependencies)
 
 _isFake ($module)
 

Static Protected Member Functions

static _initThemes ()
 
static _initRules ()
 
static _prepareListConfigXml ()
 
static _prepareListDbSchemaXml ()
 
static _prepareListRoutesXml ()
 
static _prepareMapRouters ()
 
static _getTypes ()
 
static convertModuleName (string $jsonName, array $packageModuleMap)
 
static _initDependencies ()
 

Static Protected Attributes

static $_listConfigXml = []
 
static $_listDbSchemaXml = []
 
static $_listRoutesXml = []
 
static $_mapRouters = []
 
static $_mapLayoutBlocks = []
 
static $_mapLayoutHandles = []
 
static $mapDependencies = []
 
static $_defaultThemes = ''
 
static $_namespaces
 
static $_rulesInstances = []
 

Detailed Description

@SuppressWarnings(PHPMD.ExcessiveClassComplexity) @SuppressWarnings(PHPMD.CouplingBetweenObjects)

Definition at line 25 of file DependencyTest.php.

Member Function Documentation

◆ _collectDependencies()

_collectDependencies (   $currentModuleName,
  $dependencies = [] 
)
protected

Collect dependencies

Parameters
string$currentModuleName
array$dependencies
Returns
array

Definition at line 379 of file DependencyTest.php.

380  {
381  if (!count($dependencies)) {
382  return [];
383  }
384  $undeclared = [];
385  foreach ($dependencies as $dependency) {
386  $this->collectDependency($dependency, $currentModuleName, $undeclared);
387  }
388  return $undeclared;
389  }

◆ _getCleanedFileContents()

_getCleanedFileContents (   $fileType,
  $file 
)
protected

Return cleaned file contents

Parameters
string$fileType
string$file
Returns
string

Definition at line 253 of file DependencyTest.php.

254  {
255  $contents = (string)file_get_contents($file);
256  switch ($fileType) {
257  case 'php':
258  //Removing php comments
259  $contents = preg_replace('~/\*.*?\*/~s', '', $contents);
260  $contents = preg_replace('~^\s*//.*$~m', '', $contents);
261  break;
262  case 'layout':
263  case 'config':
264  case 'db_schema':
265  //Removing xml comments
266  $contents = preg_replace('~<!\-\-/.*?\-\->~s', '', $contents);
267  break;
268  case 'template':
269  //Removing html
270  $contentsWithoutHtml = '';
271  preg_replace_callback(
272  '~(<\?php\s+.*\?>)~sU',
273  function ($matches) use ($contents, &$contentsWithoutHtml) {
274  $contentsWithoutHtml .= $matches[1];
275  return $contents;
276  },
277  $contents
278  );
279  $contents = $contentsWithoutHtml;
280  //Removing php comments
281  $contents = preg_replace('~/\*.*?\*/~s', '', $contents);
282  $contents = preg_replace('~^\s*//.*$~s', '', $contents);
283  break;
284  }
285  return $contents;
286  }
$contents
Definition: website.php:14

◆ _getDependencies()

_getDependencies (   $module,
  $type,
  $mapType 
)
protected

Retrieve array of dependency items

Parameters
$module
$type
$mapType
Returns
array

Definition at line 837 of file DependencyTest.php.

838  {
839  if (isset(self::$mapDependencies[$module][$type][$mapType])) {
840  return self::$mapDependencies[$module][$type][$mapType];
841  }
842 
843  return [];
844  }
$type
Definition: item.phtml:13

◆ _getTypes()

static _getTypes ( )
staticprotected

Retrieve dependency types array

Returns
array

Definition at line 682 of file DependencyTest.php.

◆ _initDependencies()

static _initDependencies ( )
staticprotected

Initialise map of dependencies.

Returns
void @SuppressWarnings(PHPMD.CyclomaticComplexity) @SuppressWarnings(PHPMD.NPathComplexity)
Exceptions

Definition at line 722 of file DependencyTest.php.

723  {
724  $packageModuleMap = self::getPackageModuleMapping();
725  $jsonFiles = Files::init()->getComposerFiles(ComponentRegistrar::MODULE, false);
726  foreach ($jsonFiles as $file) {
727  $contents = file_get_contents($file);
728  $decodedJson = json_decode($contents);
729  if (null == $decodedJson) {
730  throw new \Exception("Invalid Json: $file");
731  }
732  $json = new \Magento\Framework\Config\Composer\Package(json_decode($contents));
733  $moduleName = self::convertModuleName($json->get('name'), $packageModuleMap);
734  if (!isset(self::$mapDependencies[$moduleName])) {
735  self::$mapDependencies[$moduleName] = [];
736  }
737  foreach (self::_getTypes() as $type) {
738  if (!isset(self::$mapDependencies[$moduleName][$type])) {
739  self::$mapDependencies[$moduleName][$type] = [
740  self::MAP_TYPE_DECLARED => [],
741  self::MAP_TYPE_FOUND => [],
742  self::MAP_TYPE_REDUNDANT => [],
743  ];
744  }
745  }
746 
747  $require = array_keys((array)$json->get('require'));
748  self::addDependencies($moduleName, $require, self::TYPE_HARD, $packageModuleMap);
749 
750  $suggest = array_keys((array)$json->get('suggest'));
751  self::addDependencies($moduleName, $suggest, self::TYPE_SOFT, $packageModuleMap);
752  }
753  }
$contents
Definition: website.php:14
static convertModuleName(string $jsonName, array $packageModuleMap)
$type
Definition: item.phtml:13

◆ _initRules()

static _initRules ( )
staticprotected

Create rules objects

Definition at line 225 of file DependencyTest.php.

226  {
227  $replaceFilePattern = str_replace('\\', '/', realpath(__DIR__)) . '/_files/dependency_test/*.php';
228  $dbRuleTables = [];
229  foreach (glob($replaceFilePattern) as $fileName) {
230  $dbRuleTables = array_merge($dbRuleTables, @include $fileName);
231  }
232  self::$_rulesInstances = [
233  new DeclarativeSchemaRule($dbRuleTables),
234  new PhpRule(self::$_mapRouters, self::$_mapLayoutBlocks),
235  new DbRule($dbRuleTables),
236  new LayoutRule(
237  self::$_mapRouters,
238  self::$_mapLayoutBlocks,
239  self::$_mapLayoutHandles
240  ),
241  new DiRule(new VirtualTypeMapper()),
242  new ReportsConfigRule($dbRuleTables),
243  ];
244  }
defined('TESTS_BP')||define('TESTS_BP' __DIR__
Definition: _bootstrap.php:60
$fileName
Definition: translate.phtml:15

◆ _initThemes()

static _initThemes ( )
staticprotected

Initialize default themes

Definition at line 209 of file DependencyTest.php.

210  {
211  $defaultThemes = [];
212  foreach (self::$_listConfigXml as $file) {
213  $config = simplexml_load_file($file);
214  $nodes = @($config->xpath("/config/*/design/theme/full_name") ?: []);
215  foreach ($nodes as $node) {
216  $defaultThemes[] = (string)$node;
217  }
218  }
219  self::$_defaultThemes = sprintf('#app/design.*/(%s)/.*#', implode('|', array_unique($defaultThemes)));
220  }
$config
Definition: fraud_order.php:17

◆ _isFake()

_isFake (   $module)
protected

Check if module is fake

Parameters
$module
Returns
bool

Definition at line 870 of file DependencyTest.php.

871  {
872  return isset(self::$mapDependencies[$module]) ? false : true;
873  }
return false
Definition: gallery.phtml:36

◆ _prepareFiles()

_prepareFiles (   $fileType,
  $files,
  $skip = null 
)
protected

Convert file list to data provider structure

Parameters
string$fileType
array$files
bool | null$skip
Returns
array

Definition at line 473 of file DependencyTest.php.

474  {
475  $result = [];
476  foreach ($files as $relativePath => $file) {
477  $absolutePath = $file[0];
478  if (!$skip && substr_count($relativePath, '/') < self::DIR_PATH_COUNT) {
479  continue;
480  }
481  $result[$relativePath] = [$fileType, $absolutePath];
482  }
483  return $result;
484  }
$relativePath
Definition: get.php:35
foreach($appDirs as $dir) $files

◆ _prepareListConfigXml()

static _prepareListConfigXml ( )
staticprotected

Prepare list of config.xml files (by modules).

Definition at line 535 of file DependencyTest.php.

536  {
537  $files = Files::init()->getConfigFiles('config.xml', [], false);
538  foreach ($files as $file) {
539  if (preg_match('/(?<namespace>[A-Z][a-z]+)[_\/\\\\](?<module>[A-Z][a-zA-Z]+)/', $file, $matches)) {
540  $module = $matches['namespace'] . '\\' . $matches['module'];
541  self::$_listConfigXml[$module] = $file;
542  }
543  }
544  }
foreach($appDirs as $dir) $files

◆ _prepareListDbSchemaXml()

static _prepareListDbSchemaXml ( )
staticprotected

Prepare list of db_schema.xml files (by modules)

Definition at line 549 of file DependencyTest.php.

550  {
551  $files = Files::init()->getDbSchemaFiles('db_schema.xml', [], false);
552  foreach ($files as $file) {
553  if (preg_match('/(?<namespace>[A-Z][a-z]+)[_\/\\\\](?<module>[A-Z][a-zA-Z]+)/', $file, $matches)) {
554  $module = $matches['namespace'] . '\\' . $matches['module'];
555  self::$_listDbSchemaXml[$module] = $file;
556  }
557  }
558  }
foreach($appDirs as $dir) $files

◆ _prepareListRoutesXml()

static _prepareListRoutesXml ( )
staticprotected

Prepare list of routes.xml files (by modules)

Definition at line 563 of file DependencyTest.php.

564  {
565  $files = Files::init()->getConfigFiles('*/routes.xml', [], false);
566  foreach ($files as $file) {
567  if (preg_match('/(?<namespace>[A-Z][a-z]+)[_\/\\\\](?<module>[A-Z][a-zA-Z]+)/', $file, $matches)) {
568  $module = $matches['namespace'] . '\\' . $matches['module'];
569  self::$_listRoutesXml[$module][] = $file;
570  }
571  }
572  }
foreach($appDirs as $dir) $files

◆ _prepareMapRouters()

static _prepareMapRouters ( )
staticprotected

Prepare map of routers

Definition at line 577 of file DependencyTest.php.

578  {
579  $pattern = '/(?<namespace>[A-Z][a-z]+)[_\/\\\\](?<module>[A-Z][a-zA-Z]+)\/Controller\/' .
580  '(?<path>[\/\w]*).php/';
581 
583  foreach ($files as $file) {
584  if (preg_match($pattern, $file, $matches)) {
585  $module = $matches['namespace'] . '\\' . $matches['module'];
586  if (!empty(self::$_listRoutesXml[$module])) {
587  foreach (self::$_listRoutesXml[$module] as $configFile) {
588  self::updateRoutersMap($module, $configFile);
589  }
590  }
591  }
592  }
593  }
$pattern
Definition: website.php:22
foreach($appDirs as $dir) $files

◆ _setDependencies()

_setDependencies (   $module,
  $type,
  $mapType,
  $dependencies 
)
protected

Set dependency map items

Parameters
$module
$type
$mapType
$dependencies

Definition at line 854 of file DependencyTest.php.

855  {
856  if (!is_array($dependencies)) {
857  $dependencies = [$dependencies];
858  }
859  if (isset(self::$mapDependencies[$module][$type][$mapType])) {
860  self::$mapDependencies[$module][$type][$mapType] = $dependencies;
861  }
862  }
$type
Definition: item.phtml:13

◆ collectRedundant()

collectRedundant ( )

Collect redundant dependencies @SuppressWarnings(PHPMD.NPathComplexity)

Definition at line 423 of file DependencyTest.php.

424  {
425  foreach (array_keys(self::$mapDependencies) as $module) {
426  $declared = $this->_getDependencies($module, self::TYPE_HARD, self::MAP_TYPE_DECLARED);
427  $found = array_merge(
428  $this->_getDependencies($module, self::TYPE_HARD, self::MAP_TYPE_FOUND),
429  $this->_getDependencies($module, self::TYPE_SOFT, self::MAP_TYPE_FOUND)
430  );
431  $found['Magento\Framework'] = 'Magento\Framework';
432  $this->_setDependencies($module, self::TYPE_HARD, self::MAP_TYPE_REDUNDANT, array_diff($declared, $found));
433  }
434  }
_getDependencies($module, $type, $mapType)
_setDependencies($module, $type, $mapType, $dependencies)

◆ convertModuleName()

static convertModuleName ( string  $jsonName,
array  $packageModuleMap 
)
staticprotected

Converts a composer json component name into the Magento Module form

Parameters
string$jsonNameThe name of a composer json component or dependency e.g. 'magento/module-theme'
array$packageModuleMapMapping package name with module namespace.
Returns
string The corresponding Magento Module e.g. 'Magento\Theme'

Definition at line 694 of file DependencyTest.php.

694  : string
695  {
696  if (isset($packageModuleMap[$jsonName])) {
697  return $packageModuleMap[$jsonName];
698  }
699 
700  if (strpos($jsonName, 'magento/magento') !== false || strpos($jsonName, 'magento/framework') !== false) {
701  $moduleName = str_replace('/', "\t", $jsonName);
702  $moduleName = str_replace('framework-', "Framework\t", $moduleName);
703  $moduleName = str_replace('-', ' ', $moduleName);
704  $moduleName = ucwords($moduleName);
705  $moduleName = str_replace("\t", '\\', $moduleName);
706  $moduleName = str_replace(' ', '', $moduleName);
707 
708  return $moduleName;
709  }
710 
711  return $jsonName;
712  }

◆ getAllFiles()

getAllFiles ( )

Return all files

Returns
array

Definition at line 491 of file DependencyTest.php.

492  {
493  $files = [];
494 
495  // Get all php files
496  $files = array_merge(
497  $files,
498  $this->_prepareFiles(
499  'php',
501  true
502  )
503  );
504 
505  // Get all configuration files
506  $files = array_merge(
507  $files,
508  $this->_prepareFiles('config', Files::init()->getConfigFiles())
509  );
510 
511  // Get all configuration files
512  $files = array_merge(
513  $files,
514  $this->_prepareFiles('db_schema', Files::init()->getDbSchemaFiles())
515  );
516 
517  //Get all layout updates files
518  $files = array_merge(
519  $files,
520  $this->_prepareFiles('layout', Files::init()->getLayoutFiles())
521  );
522 
523  // Get all template files
524  $files = array_merge(
525  $files,
526  $this->_prepareFiles('template', Files::init()->getPhtmlFiles())
527  );
528 
529  return $files;
530  }
_prepareFiles($fileType, $files, $skip=null)
foreach($appDirs as $dir) $files

◆ setUpBeforeClass()

static setUpBeforeClass ( )
static

Sets up data

Definition at line 163 of file DependencyTest.php.

164  {
165  $root = BP;
166  $rootJson = json_decode(file_get_contents($root . '/composer.json'), true);
167  if (preg_match('/magento\/project-*/', $rootJson['name']) == 1) {
168  // The Dependency test is skipped for vendor/magento build
169  self::markTestSkipped(
170  'MAGETWO-43654: The build is running from vendor/magento. DependencyTest is skipped.'
171  );
172  }
173 
174  self::$_namespaces = implode('|', Files::init()->getNamespaces());
175 
179 
181  self::_prepareMapLayoutBlocks();
182  self::_prepareMapLayoutHandles();
183 
184  self::getLibraryWhiteLists();
185 
189  }
const BP
Definition: autoload.php:14

◆ testRedundant()

testRedundant ( )

Check redundant dependencies

@depends collectRedundant

Definition at line 441 of file DependencyTest.php.

442  {
443  $output = [];
444  foreach (array_keys(self::$mapDependencies) as $module) {
445  $result = [];
446  $redundant = $this->_getDependencies($module, self::TYPE_HARD, self::MAP_TYPE_REDUNDANT);
447  if (count($redundant)) {
448  $result[] = sprintf(
449  "\r\nModule %s: %s [%s]",
450  $module,
451  self::TYPE_HARD,
452  implode(', ', array_values($redundant))
453  );
454  }
455 
456  if (count($result)) {
457  $output[] = implode(', ', $result);
458  }
459  }
460  if (count($output)) {
461  $this->fail("Redundant dependencies found!\r\n" . implode(' ', $output));
462  }
463  }
_getDependencies($module, $type, $mapType)

◆ testUndeclared()

testUndeclared ( )

Check undeclared modules dependencies for specified file

Parameters
string$fileType
string$file

Definition at line 288 of file DependencyTest.php.

289  {
290  $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
291  $invoker(
298  function ($fileType, $file) {
299  // Validates file when it is belonged to default themes
300  $componentRegistrar = new ComponentRegistrar();
301  foreach ($componentRegistrar->getPaths(ComponentRegistrar::THEME) as $themeDir) {
302  if (strpos($file, $themeDir . '/') !== false) {
303  return;
304  }
305  }
306 
307  $foundModuleName = '';
308  foreach ($componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $moduleName => $moduleDir) {
309  if (strpos($file, $moduleDir . '/') !== false) {
310  $foundModuleName = str_replace('_', '\\', $moduleName);
311  break;
312  }
313  }
314  if (empty($foundModuleName)) {
315  return;
316  }
317 
318  $module = $foundModuleName;
319  $contents = $this->_getCleanedFileContents($fileType, $file);
320 
321  $dependencies = $this->getDependenciesFromFiles($module, $fileType, $file, $contents);
322 
323  // Collect dependencies
324  $undeclaredDependency = $this->_collectDependencies($module, $dependencies);
325 
326  // Prepare output message
327  $result = [];
328  foreach ($undeclaredDependency as $type => $modules) {
329  $modules = array_unique($modules);
330  if (!count($modules)) {
331  continue;
332  }
333  $result[] = sprintf("%s [%s]", $type, implode(', ', $modules));
334  }
335  if (count($result)) {
336  $this->fail('Module ' . $module . ' has undeclared dependencies: ' . implode(', ', $result));
337  }
338  },
339  $this->getAllFiles()
340  );
341  }
$contents
Definition: website.php:14
$componentRegistrar
Definition: bootstrap.php:23
$type
Definition: item.phtml:13
_collectDependencies($currentModuleName, $dependencies=[])

Field Documentation

◆ $_defaultThemes

$_defaultThemes = ''
staticprotected

Definition at line 135 of file DependencyTest.php.

◆ $_listConfigXml

$_listConfigXml = []
staticprotected

Definition at line 57 of file DependencyTest.php.

◆ $_listDbSchemaXml

$_listDbSchemaXml = []
staticprotected

Definition at line 68 of file DependencyTest.php.

◆ $_listRoutesXml

$_listRoutesXml = []
staticprotected

Definition at line 79 of file DependencyTest.php.

◆ $_mapLayoutBlocks

$_mapLayoutBlocks = []
staticprotected

Definition at line 102 of file DependencyTest.php.

◆ $_mapLayoutHandles

$_mapLayoutHandles = []
staticprotected

Definition at line 114 of file DependencyTest.php.

◆ $_mapRouters

$_mapRouters = []
staticprotected

Definition at line 90 of file DependencyTest.php.

◆ $_namespaces

$_namespaces
staticprotected

Definition at line 144 of file DependencyTest.php.

◆ $_rulesInstances

$_rulesInstances = []
staticprotected

Definition at line 151 of file DependencyTest.php.

◆ $mapDependencies

$mapDependencies = []
staticprotected

Definition at line 128 of file DependencyTest.php.

◆ DIR_PATH_COUNT

const DIR_PATH_COUNT = 4

Count of directories in path

Definition at line 46 of file DependencyTest.php.

◆ MAP_TYPE_DECLARED

const MAP_TYPE_DECLARED = 'declared'

Types of dependencies map arrays

Definition at line 37 of file DependencyTest.php.

◆ MAP_TYPE_FOUND

const MAP_TYPE_FOUND = 'found'

Definition at line 39 of file DependencyTest.php.

◆ MAP_TYPE_REDUNDANT

const MAP_TYPE_REDUNDANT = 'redundant'

Definition at line 41 of file DependencyTest.php.

◆ TYPE_HARD

const TYPE_HARD = 'hard'

Definition at line 32 of file DependencyTest.php.

◆ TYPE_SOFT

const TYPE_SOFT = 'soft'

Types of dependencies between modules

Definition at line 30 of file DependencyTest.php.


The documentation for this class was generated from the following file: