From 35277fc8675b6a2cbb194f8880145a9c85c845c4 Mon Sep 17 00:00:00 2001
From: Klaus Purer <klaus.purer@protonmail.ch>
Date: Fri, 14 Jun 2019 17:06:06 +0200
Subject: [PATCH] feat(Project): Improve core version handling by allowing a
 drupal_core_version config option (#2935144)

---
 .../Arrays/DisallowLongArraySyntaxSniff.php   |  2 +-
 coder_sniffer/DrupalPractice/Project.php      | 33 +++++++++++++------
 .../Sniffs/Constants/GlobalConstantSniff.php  |  2 +-
 .../Sniffs/Constants/GlobalDefineSniff.php    |  2 +-
 .../Sniffs/FunctionCalls/DbQuerySniff.php     |  2 +-
 .../FunctionDefinitions/HookInitCssSniff.php  |  2 +-
 .../FunctionDefinitions/InstallTSniff.php     |  2 +-
 .../Sniffs/Objects/GlobalFunctionSniff.php    |  2 +-
 .../Test/ProjectDetection/ProjectUnitTest.php | 10 ++++--
 9 files changed, 37 insertions(+), 20 deletions(-)

diff --git a/coder_sniffer/Drupal/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php b/coder_sniffer/Drupal/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php
index 23808033..8f72e850 100644
--- a/coder_sniffer/Drupal/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php
+++ b/coder_sniffer/Drupal/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php
@@ -38,7 +38,7 @@ class DisallowLongArraySyntaxSniff extends GenericDisallowLongArraySyntaxSniff
     public function process(File $phpcsFile, $stackPtr)
     {
         $drupalVersion = Project::getCoreVersion($phpcsFile);
-        if ($drupalVersion !== '8.x') {
+        if ($drupalVersion < 8) {
             // No need to check this file again, mark it as done.
             return ($phpcsFile->numTokens + 1);
         }
diff --git a/coder_sniffer/DrupalPractice/Project.php b/coder_sniffer/DrupalPractice/Project.php
index 8b775bf8..6b38fe09 100644
--- a/coder_sniffer/DrupalPractice/Project.php
+++ b/coder_sniffer/DrupalPractice/Project.php
@@ -12,6 +12,7 @@ namespace DrupalPractice;
 use PHP_CodeSniffer\Files\File;
 use \Drupal\Sniffs\InfoFiles\ClassFilesSniff;
 use Symfony\Component\Yaml\Yaml;
+use PHP_CodeSniffer\Config;
 
 /**
  * Helper class to retrieve project information like module/theme name for a file.
@@ -234,14 +235,21 @@ class Project
      *
      * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
      *
-     * @return string|false The core version string or false if it could not
-     *   be derived.
+     * @return int The core version number. Returns 8 by default.
      */
     public static function getCoreVersion(File $phpcsFile)
     {
+        // First check if a config option was passed.
+        $coreVersion = Config::getConfigData('drupal_core_version');
+        if (empty($coreVersion) === false) {
+            return (int) $coreVersion;
+        }
+
+        // TRy to guess the core version from info files in the file path.
         $infoFile = static::getInfoFile($phpcsFile);
         if ($infoFile === false) {
-            return false;
+            // Default to Drupal 8.
+            return 8;
         }
 
         $pathParts = pathinfo($infoFile);
@@ -249,16 +257,21 @@ class Project
         // Drupal 6 and 7 use the .info file extension.
         if ($pathParts['extension'] === 'info') {
             $infoSettings = ClassFilesSniff::drupalParseInfoFormat(file_get_contents($infoFile));
-            if (isset($infoSettings['core']) === true) {
-                return $infoSettings['core'];
+            if (isset($infoSettings['core']) === true
+                && is_string($infoSettings['core']) === true
+            ) {
+                return (int) $infoSettings['core']{0};
             }
-        } 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';
+
+            // Default to Drupal 7 if there is an info file.
+            return 7;
         }
 
+        // 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;
+
     }//end getCoreVersion()
 
 
diff --git a/coder_sniffer/DrupalPractice/Sniffs/Constants/GlobalConstantSniff.php b/coder_sniffer/DrupalPractice/Sniffs/Constants/GlobalConstantSniff.php
index 98afe01d..5013691c 100644
--- a/coder_sniffer/DrupalPractice/Sniffs/Constants/GlobalConstantSniff.php
+++ b/coder_sniffer/DrupalPractice/Sniffs/Constants/GlobalConstantSniff.php
@@ -55,7 +55,7 @@ class GlobalConstantSniff implements Sniff
         }
 
         $coreVersion = Project::getCoreVersion($phpcsFile);
-        if ($coreVersion !== '8.x') {
+        if ($coreVersion < 8) {
             // No need to check this file again, mark it as done.
             return ($phpcsFile->numTokens + 1);
         }
diff --git a/coder_sniffer/DrupalPractice/Sniffs/Constants/GlobalDefineSniff.php b/coder_sniffer/DrupalPractice/Sniffs/Constants/GlobalDefineSniff.php
index c2789677..7c10d9ac 100644
--- a/coder_sniffer/DrupalPractice/Sniffs/Constants/GlobalDefineSniff.php
+++ b/coder_sniffer/DrupalPractice/Sniffs/Constants/GlobalDefineSniff.php
@@ -63,7 +63,7 @@ class GlobalDefineSniff extends FunctionCall
         }
 
         $coreVersion = Project::getCoreVersion($phpcsFile);
-        if ($coreVersion !== '8.x') {
+        if ($coreVersion < 8) {
             // No need to check this file again, mark it as done.
             return ($phpcsFile->numTokens + 1);
         }
diff --git a/coder_sniffer/DrupalPractice/Sniffs/FunctionCalls/DbQuerySniff.php b/coder_sniffer/DrupalPractice/Sniffs/FunctionCalls/DbQuerySniff.php
index d92b3381..a8e66bb4 100644
--- a/coder_sniffer/DrupalPractice/Sniffs/FunctionCalls/DbQuerySniff.php
+++ b/coder_sniffer/DrupalPractice/Sniffs/FunctionCalls/DbQuerySniff.php
@@ -56,7 +56,7 @@ class DbQuerySniff extends FunctionCall
         $closeBracket
     ) {
         // This check only applies to Drupal 7, not Drupal 6.
-        if (Project::getCoreVersion($phpcsFile) !== '7.x') {
+        if (Project::getCoreVersion($phpcsFile) !== 7) {
             return ($phpcsFile->numTokens + 1);
         }
 
diff --git a/coder_sniffer/DrupalPractice/Sniffs/FunctionDefinitions/HookInitCssSniff.php b/coder_sniffer/DrupalPractice/Sniffs/FunctionDefinitions/HookInitCssSniff.php
index 69d43a41..1064f94f 100644
--- a/coder_sniffer/DrupalPractice/Sniffs/FunctionDefinitions/HookInitCssSniff.php
+++ b/coder_sniffer/DrupalPractice/Sniffs/FunctionDefinitions/HookInitCssSniff.php
@@ -45,7 +45,7 @@ class HookInitCssSniff extends FunctionDefinition
         }
 
         // This check only applies to Drupal 7, not Drupal 6.
-        if (Project::getCoreVersion($phpcsFile) !== '7.x') {
+        if (Project::getCoreVersion($phpcsFile) !== 7) {
             return ($phpcsFile->numTokens + 1);
         }
 
diff --git a/coder_sniffer/DrupalPractice/Sniffs/FunctionDefinitions/InstallTSniff.php b/coder_sniffer/DrupalPractice/Sniffs/FunctionDefinitions/InstallTSniff.php
index 31012b01..5e431152 100644
--- a/coder_sniffer/DrupalPractice/Sniffs/FunctionDefinitions/InstallTSniff.php
+++ b/coder_sniffer/DrupalPractice/Sniffs/FunctionDefinitions/InstallTSniff.php
@@ -53,7 +53,7 @@ class InstallTSniff extends FunctionDefinition
         }
 
         // This check only applies to Drupal 7, not Drupal 8.
-        if (Project::getCoreVersion($phpcsFile) !== '7.x') {
+        if (Project::getCoreVersion($phpcsFile) !== 7) {
             return ($phpcsFile->numTokens + 1);
         }
 
diff --git a/coder_sniffer/DrupalPractice/Sniffs/Objects/GlobalFunctionSniff.php b/coder_sniffer/DrupalPractice/Sniffs/Objects/GlobalFunctionSniff.php
index 383f9901..50992778 100644
--- a/coder_sniffer/DrupalPractice/Sniffs/Objects/GlobalFunctionSniff.php
+++ b/coder_sniffer/DrupalPractice/Sniffs/Objects/GlobalFunctionSniff.php
@@ -70,7 +70,7 @@ class GlobalFunctionSniff extends FunctionCall
         $tokens = $phpcsFile->getTokens();
 
         // Only run this sniff on Drupal 8+.
-        if (Project::getCoreVersion($phpcsFile) !== '8.x') {
+        if (Project::getCoreVersion($phpcsFile) < 8) {
             // No need to check this file again, mark it as done.
             return ($phpcsFile->numTokens + 1);
         }
diff --git a/coder_sniffer/DrupalPractice/Test/ProjectDetection/ProjectUnitTest.php b/coder_sniffer/DrupalPractice/Test/ProjectDetection/ProjectUnitTest.php
index af9c75e2..0c5cc200 100644
--- a/coder_sniffer/DrupalPractice/Test/ProjectDetection/ProjectUnitTest.php
+++ b/coder_sniffer/DrupalPractice/Test/ProjectDetection/ProjectUnitTest.php
@@ -96,15 +96,19 @@ class ProjectUnitTest extends \PHPUnit_Framework_TestCase
         return [
             [
                 dirname(__FILE__).'/modules/drupal6/nested/test.php',
-                '6.x',
+                6,
             ],
             [
                 dirname(__FILE__).'/modules/drupal7/test.php',
-                '7.x',
+                7,
             ],
             [
                 dirname(__FILE__).'/modules/drupal8/test.php',
-                '8.x',
+                8,
+            ],
+            [
+                'invalid',
+                8,
             ],
         ];
 
-- 
GitLab