FEATURE: Allow auto migration of classes in strings

* We now check class names case sensitive in strings.
* This will prevent issues with stuff like TCA, as class names mathing
  table names are written in lower case.
* Also add further tests and fix issues.
* Extend test to check that lower version is not replaced but mentioned
  as warning.
* Expected class names in Tx_ format are reported as fixable error.

Resolves: #15
This commit is contained in:
Daniel Siepmann 2017-05-04 13:35:02 +02:00
parent b69c262288
commit 7a16dac529
Signed by: Daniel Siepmann
GPG key ID: 33D6629915560EF4
6 changed files with 77 additions and 25 deletions

View file

@ -23,6 +23,7 @@ namespace Typo3Update\Feature;
use PHP_CodeSniffer as PhpCs; use PHP_CodeSniffer as PhpCs;
use PHP_CodeSniffer_File as PhpCsFile; use PHP_CodeSniffer_File as PhpCsFile;
use PHP_CodeSniffer_Sniff as PhpCsSniff; use PHP_CodeSniffer_Sniff as PhpCsSniff;
use Typo3Update_Sniffs_Classname_StringSniff as StringSniff;
/** /**
* This feature will add fixable errors for old legacy classnames. * This feature will add fixable errors for old legacy classnames.
@ -96,8 +97,8 @@ class LegacyClassnameFeature implements FeatureInterface
*/ */
protected function isLegacyClassname($classname) protected function isLegacyClassname($classname)
{ {
if (get_class($this->sniff) === \Typo3Update_Sniffs_Classname_StringSniff::class) { if (get_class($this->sniff) === StringSniff::class) {
return false; return $this->legacyMapping->isLegacyClassname($classname);
} }
return $this->legacyMapping->isCaseInsensitiveLegacyClassname($classname); return $this->legacyMapping->isCaseInsensitiveLegacyClassname($classname);
@ -112,6 +113,12 @@ class LegacyClassnameFeature implements FeatureInterface
*/ */
protected function isMaybeLegacyClassname($classname) protected function isMaybeLegacyClassname($classname)
{ {
if (get_class($this->sniff) === StringSniff::class
&& $this->legacyMapping->isCaseInsensitiveLegacyClassname($classname)
) {
return true;
}
if (strpos($classname, 'Tx_') === false) { if (strpos($classname, 'Tx_') === false) {
return false; return false;
} }
@ -121,9 +128,7 @@ class LegacyClassnameFeature implements FeatureInterface
return $nameParts[1]; return $nameParts[1];
}, $classname); }, $classname);
if (!in_array($extensionName, $this->legacyExtensions) if (!in_array($extensionName, $this->legacyExtensions)) {
&& get_class($this->sniff) !== \Typo3Update_Sniffs_Classname_StringSniff::class
) {
return false; return false;
} }

View file

@ -128,7 +128,7 @@ final class LegacyClassnameMapping
$lowerVersion = strtolower($classname); $lowerVersion = strtolower($classname);
return $this->isLegacyTypo3Classname($classname) || $this->isLegacyMappingClassname($classname) return $this->isLegacyTypo3Classname($classname) || $this->isLegacyMappingClassname($classname)
|| $this->isLegacyTypo3Classname($lowerVersion) || $this->isLegacyMappingClassname($lowerVersion); || isset($this->typo3MappingsKeys[$lowerVersion]) || isset($this->mappingsKeys[$lowerVersion]);
} }
/** /**
@ -137,7 +137,7 @@ final class LegacyClassnameMapping
*/ */
public function getNewClassname($classname) public function getNewClassname($classname)
{ {
if ($this->isLegacyTypo3Classname($classname) || $this->isLegacyTypo3Classname(strtolower($classname))) { if ($this->isLegacyTypo3Classname($classname) || isset($this->typo3MappingsKeys[strtolower($classname)])) {
return $this->typo3Mappings[$this->getTypo3MappingKey($classname)]; return $this->typo3Mappings[$this->getTypo3MappingKey($classname)];
} }
@ -168,7 +168,7 @@ final class LegacyClassnameMapping
*/ */
protected function isLegacyTypo3Classname($classname) protected function isLegacyTypo3Classname($classname)
{ {
return isset($this->typo3Mappings[$classname]) || isset($this->typo3MappingsKeys[$classname]); return isset($this->typo3Mappings[$classname]);
} }
/** /**
@ -177,7 +177,7 @@ final class LegacyClassnameMapping
*/ */
protected function isLegacyMappingClassname($classname) protected function isLegacyMappingClassname($classname)
{ {
return isset($this->mappings[$classname]) || isset($this->mappingsKeys[$classname]); return isset($this->mappings[$classname]);
} }
/** /**

View file

@ -66,6 +66,10 @@ class LegacyClassnameMappingTest extends TestCase
*/ */
public function inCaseSensitivityLookupWorks() public function inCaseSensitivityLookupWorks()
{ {
$this->assertFalse(
$this->subject->isLegacyClassname('tx_extbase_domain_model_backenduser'),
'Classname was returned to be legacy but should not due to lowercase version and case sensitivity.'
);
$this->assertFalse( $this->assertFalse(
$this->subject->isLegacyClassname('Tx_Extbase_Domain_Model_Backenduser'), $this->subject->isLegacyClassname('Tx_Extbase_Domain_Model_Backenduser'),
'Classname was returned to be legacy but should not due to lowercase version and case sensitivity.' 'Classname was returned to be legacy but should not due to lowercase version and case sensitivity.'
@ -81,6 +85,11 @@ class LegacyClassnameMappingTest extends TestCase
*/ */
public function weCanRetrieveNewClassname() public function weCanRetrieveNewClassname()
{ {
$this->assertSame(
'TYPO3\CMS\Extbase\Command\HelpCommandController',
$this->subject->getNewClassname('tx_extbase_command_helpcommandcontroller'),
'New class name could not be fetched for lower cased version.'
);
$this->assertSame( $this->assertSame(
'TYPO3\CMS\Extbase\Command\HelpCommandController', 'TYPO3\CMS\Extbase\Command\HelpCommandController',
$this->subject->getNewClassname('Tx_Extbase_Command_HelpCommandController'), $this->subject->getNewClassname('Tx_Extbase_Command_HelpCommandController'),

View file

@ -0,0 +1,17 @@
--- tests/Fixtures/Standards/Typo3Update/Sniffs/Classname/StringSniff/InputFileForIssues.php
+++ PHP_CodeSniffer
@@ -19,10 +19,10 @@
* 02110-1301, USA.
*/
-$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = 'Tx_Extbase_Command_HelpCommandController';
-$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = "Tx_Extbase_Command_HelpCommandController";
+$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = '\TYPO3\CMS\Extbase\Command\HelpCommandController';
+$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = "\\TYPO3\\CMS\\Extbase\\Command\\HelpCommandController";
-$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['createHashBase'][] = 'EXT:ext_key/Classes/Hooks/Cache.php:&Tx_Extbase_Command_HelpCommandController->getHash';
+$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['createHashBase'][] = 'EXT:ext_key/Classes/Hooks/Cache.php:&\TYPO3\CMS\Extbase\Command\HelpCommandController->getHash';
-$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = "Tx_About_Domain_Model_Extension";
+$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = "\\TYPO3\\CMS\\About\\Domain\\Model\\Extension";
$GLOBALS['TCA']['tx_about_domain_model_extension'] = [];

View file

@ -1,42 +1,60 @@
{ {
"files": { "files": {
"InputFileForIssues.php": { "InputFileForIssues.php": {
"errors": 0, "errors": 4,
"messages": [ "messages": [
{ {
"column": 80, "column": 80,
"fixable": false, "fixable": true,
"line": 22, "line": 22,
"message": "Legacy classes are not allowed; found Tx_Extbase_Command_HelpCommandController that might be a legacy class that does not exist anymore", "message": "Legacy classes are not allowed; found \"Tx_Extbase_Command_HelpCommandController\", use \"TYPO3\\CMS\\Extbase\\Command\\HelpCommandController\" instead",
"severity": 5, "severity": 5,
"source": "Typo3Update.Classname.String.mightBeLegacyClassname", "source": "Typo3Update.Classname.String.legacyClassname",
"type": "WARNING" "type": "ERROR"
}, },
{ {
"column": 80, "column": 80,
"fixable": false, "fixable": true,
"line": 23, "line": 23,
"message": "Legacy classes are not allowed; found Tx_Extbase_Command_HelpCommandController that might be a legacy class that does not exist anymore", "message": "Legacy classes are not allowed; found \"Tx_Extbase_Command_HelpCommandController\", use \"TYPO3\\CMS\\Extbase\\Command\\HelpCommandController\" instead",
"severity": 5, "severity": 5,
"source": "Typo3Update.Classname.String.mightBeLegacyClassname", "source": "Typo3Update.Classname.String.legacyClassname",
"type": "WARNING" "type": "ERROR"
}, },
{ {
"column": 93, "column": 93,
"fixable": false, "fixable": true,
"line": 25, "line": 25,
"message": "Legacy classes are not allowed; found Tx_ExtKey_Hooks_Cache that might be a legacy class that does not exist anymore", "message": "Legacy classes are not allowed; found \"Tx_Extbase_Command_HelpCommandController\", use \"TYPO3\\CMS\\Extbase\\Command\\HelpCommandController\" instead",
"severity": 5,
"source": "Typo3Update.Classname.String.legacyClassname",
"type": "ERROR"
},
{
"column": 80,
"fixable": true,
"line": 27,
"message": "Legacy classes are not allowed; found \"Tx_About_Domain_Model_Extension\", use \"TYPO3\\CMS\\About\\Domain\\Model\\Extension\" instead",
"severity": 5,
"source": "Typo3Update.Classname.String.legacyClassname",
"type": "ERROR"
},
{
"column": 17,
"fixable": false,
"line": 28,
"message": "Legacy classes are not allowed; found tx_about_domain_model_extension that might be a legacy class that does not exist anymore",
"severity": 5, "severity": 5,
"source": "Typo3Update.Classname.String.mightBeLegacyClassname", "source": "Typo3Update.Classname.String.mightBeLegacyClassname",
"type": "WARNING" "type": "WARNING"
} }
], ],
"warnings": 3 "warnings": 1
} }
}, },
"totals": { "totals": {
"errors": 0, "errors": 4,
"fixable": 0, "fixable": 4,
"warnings": 3 "warnings": 1
} }
} }

View file

@ -22,4 +22,7 @@
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = 'Tx_Extbase_Command_HelpCommandController'; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = 'Tx_Extbase_Command_HelpCommandController';
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = "Tx_Extbase_Command_HelpCommandController"; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = "Tx_Extbase_Command_HelpCommandController";
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['createHashBase'][] = 'EXT:ext_key/Classes/Hooks/Cache.php:&Tx_ExtKey_Hooks_Cache->getHash'; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['createHashBase'][] = 'EXT:ext_key/Classes/Hooks/Cache.php:&Tx_Extbase_Command_HelpCommandController->getHash';
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = "Tx_About_Domain_Model_Extension";
$GLOBALS['TCA']['tx_about_domain_model_extension'] = [];