diff vendor/drupal/coder/coder_sniffer/DrupalPractice/Project.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/drupal/coder/coder_sniffer/DrupalPractice/Project.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,261 @@
+<?php
+/**
+ * DrupalPractice_Project
+ *
+ * @category PHP
+ * @package  PHP_CodeSniffer
+ * @link     http://pear.php.net/package/PHP_CodeSniffer
+ */
+
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * Helper class to retrieve project information like module/theme name for a file.
+ *
+ * @category PHP
+ * @package  PHP_CodeSniffer
+ * @link     http://pear.php.net/package/PHP_CodeSniffer
+ */
+class DrupalPractice_Project
+{
+
+
+    /**
+     * Determines the project short name a file might be associated with.
+     *
+     * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
+     *
+     * @return string|false Returns the project machine name or false if it could not
+     *   be derived.
+     */
+    public static function getName(PHP_CodeSniffer_File $phpcsFile)
+    {
+        // Cache the project name per file as this might get called often.
+        static $cache;
+
+        if (isset($cache[$phpcsFile->getFilename()]) === true) {
+            return $cache[$phpcsFile->getFilename()];
+        }
+
+        $pathParts = pathinfo($phpcsFile->getFilename());
+        // Module and install files are easy: they contain the project name in the
+        // file name.
+        if (isset($pathParts['extension']) === true && ($pathParts['extension'] === 'module' || $pathParts['extension'] === 'install')) {
+            $cache[$phpcsFile->getFilename()] = $pathParts['filename'];
+            return $pathParts['filename'];
+        }
+
+        $infoFile = static::getInfoFile($phpcsFile);
+        if ($infoFile === false) {
+            return false;
+        }
+
+        $pathParts = pathinfo($infoFile);
+        $cache[$phpcsFile->getFilename()] = $pathParts['filename'];
+        return $pathParts['filename'];
+
+    }//end getName()
+
+
+    /**
+     * Determines the info file a file might be associated with.
+     *
+     * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
+     *
+     * @return string|false The project info file name or false if it could not
+     *   be derived.
+     */
+    public static function getInfoFile(PHP_CodeSniffer_File $phpcsFile)
+    {
+        // Cache the project name per file as this might get called often.
+        static $cache;
+
+        if (isset($cache[$phpcsFile->getFilename()]) === true) {
+            return $cache[$phpcsFile->getFilename()];
+        }
+
+        $pathParts = pathinfo($phpcsFile->getFilename());
+
+        // Search for an info file.
+        $dir = $pathParts['dirname'];
+        do {
+            $infoFiles = glob("$dir/*.info.yml");
+            if (empty($infoFiles) === true) {
+                $infoFiles = glob("$dir/*.info");
+            }
+
+            // Go one directory up if we do not find an info file here.
+            $dir = dirname($dir);
+        } while (empty($infoFiles) === true && $dir !== dirname($dir));
+
+        // No info file found, so we give up.
+        if (empty($infoFiles) === true) {
+            $cache[$phpcsFile->getFilename()] = false;
+            return false;
+        }
+
+        // Sort the info file names and take the shortest info file.
+        usort($infoFiles, array('DrupalPractice_Project', 'compareLength'));
+        $infoFile = $infoFiles[0];
+        $cache[$phpcsFile->getFilename()] = $infoFile;
+        return $infoFile;
+
+    }//end getInfoFile()
+
+
+    /**
+     * Determines the *.services.yml file in a module.
+     *
+     * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
+     *
+     * @return string|false The Services YML file name or false if it could not
+     *   be derived.
+     */
+    public static function getServicesYmlFile(PHP_CodeSniffer_File $phpcsFile)
+    {
+        // Cache the services file per file as this might get called often.
+        static $cache;
+
+        if (isset($cache[$phpcsFile->getFilename()]) === true) {
+            return $cache[$phpcsFile->getFilename()];
+        }
+
+        $pathParts = pathinfo($phpcsFile->getFilename());
+
+        // Search for an info file.
+        $dir = $pathParts['dirname'];
+        do {
+            $ymlFiles = glob("$dir/*.services.yml");
+
+            // Go one directory up if we do not find an info file here.
+            $dir = dirname($dir);
+        } while (empty($ymlFiles) === true && $dir !== dirname($dir));
+
+        // No YML file found, so we give up.
+        if (empty($ymlFiles) === true) {
+            $cache[$phpcsFile->getFilename()] = false;
+            return false;
+        }
+
+        // Sort the YML file names and take the shortest info file.
+        usort($ymlFiles, array('DrupalPractice_Project', 'compareLength'));
+        $ymlFile = $ymlFiles[0];
+        $cache[$phpcsFile->getFilename()] = $ymlFile;
+        return $ymlFile;
+
+    }//end getServicesYmlFile()
+
+
+    /**
+     * Return true if the given class is a Drupal service registered in *.services.yml.
+     *
+     * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
+     * @param int                  $classPtr  The position of the class declaration
+     *                                        in the token stack.
+     *
+     * @return bool
+     */
+    public static function isServiceClass(PHP_CodeSniffer_File $phpcsFile, $classPtr)
+    {
+        // Cache the information per file as this might get called often.
+        static $cache;
+
+        if (isset($cache[$phpcsFile->getFilename()]) === true) {
+            return $cache[$phpcsFile->getFilename()];
+        }
+
+        // Get the namespace of the class if there is one.
+        $namespacePtr = $phpcsFile->findPrevious(T_NAMESPACE, ($classPtr - 1));
+        if ($namespacePtr === false) {
+            $cache[$phpcsFile->getFilename()] = false;
+            return false;
+        }
+
+        $ymlFile = static::getServicesYmlFile($phpcsFile);
+        if ($ymlFile === false) {
+            $cache[$phpcsFile->getFilename()] = false;
+            return false;
+        }
+
+        $services = Yaml::parse(file_get_contents($ymlFile));
+        if (isset($services['services']) === false) {
+            $cache[$phpcsFile->getFilename()] = false;
+            return false;
+        }
+
+        $nsEnd           = $phpcsFile->findNext(
+            [
+             T_NS_SEPARATOR,
+             T_STRING,
+             T_WHITESPACE,
+            ],
+            ($namespacePtr + 1),
+            null,
+            true
+        );
+        $namespace       = trim($phpcsFile->getTokensAsString(($namespacePtr + 1), ($nsEnd - $namespacePtr - 1)));
+        $classNameSpaced = ltrim($namespace.'\\'.$phpcsFile->getDeclarationName($classPtr), '\\');
+
+        foreach ($services['services'] as $service) {
+            if (isset($service['class']) === true
+                && $classNameSpaced === ltrim($service['class'], '\\')
+            ) {
+                $cache[$phpcsFile->getFilename()] = true;
+                return true;
+            }
+        }
+
+        return false;
+
+    }//end isServiceClass()
+
+
+    /**
+     * Helper method to sort array values by string length with usort().
+     *
+     * @param string $a First string.
+     * @param string $b Second string.
+     *
+     * @return int
+     */
+    public static function compareLength($a, $b)
+    {
+        return (strlen($a) - strlen($b));
+
+    }//end compareLength()
+
+
+    /**
+     * Determines the Drupal core version a file might be associated with.
+     *
+     * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
+     *
+     * @return string|false The core version string or false if it could not
+     *   be derived.
+     */
+    public static function getCoreVersion(PHP_CodeSniffer_File $phpcsFile)
+    {
+        $infoFile = static::getInfoFile($phpcsFile);
+        if ($infoFile === false) {
+            return false;
+        }
+
+        $pathParts = pathinfo($infoFile);
+
+        // Drupal 6 and 7 use the .info file extension.
+        if ($pathParts['extension'] === 'info') {
+            $info_settings = Drupal_Sniffs_InfoFiles_ClassFilesSniff::drupalParseInfoFormat(file_get_contents($infoFile));
+            if (isset($info_settings['core']) === true) {
+                return $info_settings['core'];
+            }
+        } else {
+            // Drupal 8 uses the .yml file extension.
+            // @todo Revisit for Drupal 9, but I don't want to do YAML parsing
+            // for now.
+            return '8.x';
+        }
+
+    }//end getCoreVersion()
+
+
+}//end class