If you want to migrate from the Inpsyde PHP Coding Standards (version 1 or 2) to the Syde PHP Coding Standards, there are a few things you may have to change in your codebase, that is, custom PHP_CodeSniffer ruleset files, or command-line arguments in scripts or CI workflows, or inline phpcs: annotations.
The Inpsyde PHP Coding Standards were only available as Inpsyde and InpsydeTemplates. The former is the full standard, including almost all custom rules, except for a few sniffs that are part of the newer InpsydeTemplates standard.
If you are using InpsydeTemplates, the new standard you want to use is Syde-Templates.
If you are using the full Inpsyde standard, you may want to start with the Syde-Extra standard, and adapt things as you see fit.
If you were using the Inpsyde standard, but actually turned off a lot of the more opinionated sniffs, or if you have been cherry-picking sniffs without using the full standard, you may want to start with the new Syde-Core standard, which only contains sniffs (custom and third-party!) that we consider required for a modern WordPress project at scale that considers performance, security and other hard best practices.
All sniffs have been renamed. As mentioned before, the name of the standard for all sniffs is now Syde (previously Inpsyde). In addition to that, all sniffs have been structured into sub-standards or sniff categories, very much in line with how the PHP_CodeSniffer and most other third-party standards are structured.
Here is a map of the old sniff names to the new ones:
Inpsyde.CodeQuality.ArgumentTypeDeclaration->Syde.Functions.ArgumentTypeDeclarationInpsyde.CodeQuality.DisableCallUserFunc->Syde.Functions.DisallowCallUserFuncInpsyde.CodeQuality.DisableSerialize->Syde.Classes.DeprecatedSerializeMagicMethodInpsyde.CodeQuality.DisallowSerializeInterface->Syde.Classes.DeprecatedSerializableInterfaceInpsyde.CodeQuality.DisallowShortOpenTag->Syde.PHP.DisallowShortOpenTagInpsyde.CodeQuality.ElementNameMinimalLength->Syde.NamingConventions.ElementNameMinimalLengthInpsyde.CodeQuality.EncodingComment->Syde.Encoding.Utf8EncodingCommentInpsyde.CodeQuality.FunctionBodyStart->Syde.Functions.FunctionBodyStartInpsyde.CodeQuality.FunctionLength->Syde.Functions.FunctionLengthInpsyde.CodeQuality.HookClosureReturn->Syde.WordPress.HookClosureReturnInpsyde.CodeQuality.HookPriority->Syde.WordPress.HookPriorityInpsyde.CodeQuality.LineLength->Syde.Files.LineLengthInpsyde.CodeQuality.NoAccessors->Syde.Classes.DisallowGetterSetterInpsyde.CodeQuality.NoElse->Syde.ControlStructures.DisallowElseInpsyde.CodeQuality.NoRootNamespaceFunctions->Syde.Functions.DisallowGlobalFunctionInpsyde.CodeQuality.NoTopLevelDefine->Syde.PHP.DisallowTopLevelDefineInpsyde.CodeQuality.PropertyPerClassLimit->Syde.Classes.PropertyLimitInpsyde.CodeQuality.ReturnTypeDeclaration->Syde.Functions.ReturnTypeDeclarationInpsyde.CodeQuality.StaticClosure->Syde.Functions.StaticClosureInpsyde.CodeQuality.VariablesName->Syde.NamingConventions.VariableNameInpsydeTemplates.Formatting.AlternativeControlStructure->Syde.ControlStructures.AlternativeSyntaxInpsydeTemplates.Formatting.ShortEchoTag->Syde.PHP.ShortOpenTagWithEchoInpsydeTemplates.Formatting.TrailingSemicolon->Syde.Formatting.TrailingSemicolon
In addition to the above list, the following Inpsyde sniffs have been replaced by third-party sniffs:
Inpsyde.CodeQuality.ForbiddenPublicProperty->SlevomatCodingStandard.Classes.ForbiddenPublicPropertyInpsyde.CodeQuality.NestingLevel->SlevomatCodingStandard.Complexity.CognitiveInpsyde.CodeQuality.Psr4->SlevomatCodingStandard.Files.TypeNameMatchesFileName
For some sniffs, also the available codes were changed.
Inpsyde.CodeQuality.EncodingComment.EncodingComment->Syde.Encoding.Utf8EncodingComment.FoundInpsyde.CodeQuality.HookPriority.HookPriority->Syde.WordPress.HookPriority.PHP_INT_MAXorSyde.WordPress.HookPriority.PHP_INT_MINInpsyde.CodeQuality.NestingLevel.High->Syde.Metrics.NestingLevel.TooHighInpsyde.CodeQuality.NoAccessors.NoGetter->Syde.Classes.DisallowGetterSetter.GetterFoundInpsyde.CodeQuality.NoAccessors.NoSetter->Syde.Classes.DisallowGetterSetter.SetterFound
In case you have a large codebase with many phpcs annotations, and you want to "upgrade" these annotations to point to the newer rule, you can do this on the command line.
First, you may want to check where there is anything to replace. You can do this by using grep.
grep -nri -e 'Inpsyde.CodeQuality' -e 'InpsydeTemplates.Formatting' --exclude-dir="vendor" .The above command assumes that you have navigated into some plugin or theme directory. Since all sniffs in the Inpsyde standard are placed in either the Inpsyde.CodeQuality or the newer InpsydeTemplates.Formatting substandard, the command is looking for these. Also, depending on your setup, there may be Composer-managed dependencies, so the command excludes the vendor/ directory, if present.
Feel free to adapt the command as you see fit. The idea here is to get an understanding of how much and what there is to migrate.
Once you know what you are working with, it's time to actually replace the old references with the correct new ones. You can do this by using sed.
Most probably, you will have to perform several different replacements in several files. One easy way to do this is by reading a list of sed commands from a script file and apply it to a file pattern.
Create a file phpcs.sed with the following content:
s/Inpsyde\.CodeQuality\.EncodingComment\.EncodingComment/Syde.Encoding.Utf8EncodingComment.Found/g
s/Inpsyde\.CodeQuality\.HookPriority\.HookPriority/Syde.WordPress.HookPriority.PHP_INT_MAX/g
s/Inpsyde\.CodeQuality\.NestingLevel\.High/Syde.Metrics.NestingLevel.TooHigh/g
s/Inpsyde\.CodeQuality\.NoAccessors\.NoGetter/Syde.Classes.DisallowGetterSetter.GetterFound/g
s/Inpsyde\.CodeQuality\.NoAccessors\.NoSetter/Syde.Classes.DisallowGetterSetter.SetterFound/g
s/Inpsyde\.CodeQuality\.ArgumentTypeDeclaration/Syde.Functions.ArgumentTypeDeclaration/g
s/Inpsyde\.CodeQuality\.DisableCallUserFunc/Syde.Functions.DisallowCallUserFunc/g
s/Inpsyde\.CodeQuality\.DisableSerialize/Syde.Classes.DeprecatedSerializeMagicMethod/g
s/Inpsyde\.CodeQuality\.DisallowSerializeInterface/Syde.Classes.DeprecatedSerializableInterface/g
s/Inpsyde\.CodeQuality\.DisallowShortOpenTag/Syde.PHP.DisallowShortOpenTag/g
s/Inpsyde\.CodeQuality\.ElementNameMinimalLength/Syde.NamingConventions.ElementNameMinimalLength/g
s/Inpsyde\.CodeQuality\.EncodingComment/Syde.Encoding.Utf8EncodingComment/g
s/Inpsyde\.CodeQuality\.ForbiddenPublicProperty/SlevomatCodingStandard.Classes.ForbiddenPublicProperty/g
s/Inpsyde\.CodeQuality\.FunctionBodyStart/Syde.Functions.FunctionBodyStart/g
s/Inpsyde\.CodeQuality\.FunctionLength/Syde.Functions.FunctionLength/g
s/Inpsyde\.CodeQuality\.HookClosureReturn/Syde.WordPress.HookClosureReturn/g
s/Inpsyde\.CodeQuality\.HookPriority/Syde.WordPress.HookPriority/g
s/Inpsyde\.CodeQuality\.LineLength/Syde.Files.LineLength/g
s/Inpsyde\.CodeQuality\.NestingLevel/SlevomatCodingStandard.Complexity.Cognitive/g
s/Inpsyde\.CodeQuality\.NoAccessors/Syde.Classes.DisallowGetterSetter/g
s/Inpsyde\.CodeQuality\.NoElse/Syde.ControlStructures.DisallowElse/g
s/Inpsyde\.CodeQuality\.NoRootNamespaceFunctions/Syde.Functions.DisallowGlobalFunction/g
s/Inpsyde\.CodeQuality\.NoTopLevelDefine/Syde.PHP.DisallowTopLevelDefine/g
s/Inpsyde\.CodeQuality\.PropertyPerClassLimit/Syde.Classes.PropertyLimit/g
s/Inpsyde\.CodeQuality\.Psr4/SlevomatCodingStandard.Files.TypeNameMatchesFileName/g
s/Inpsyde\.CodeQuality\.ReturnTypeDeclaration/Syde.Functions.ReturnTypeDeclaration/g
s/Inpsyde\.CodeQuality\.StaticClosure/Syde.Functions.StaticClosure/g
s/Inpsyde\.CodeQuality\.VariablesName/Syde.NamingConventions.VariableName/g
s/InpsydeTemplates\.Formatting\.AlternativeControlStructure/Syde.ControlStructures.AlternativeSyntax/g
s/InpsydeTemplates\.Formatting\.ShortEchoTag/Syde.PHP.ShortOpenTagWithEcho/g
s/InpsydeTemplates\.Formatting\.TrailingSemicolon/Syde.Formatting.TrailingSemicolon/g
You can store the file either in the current project directory, or somewhere else (e.g., your home directory).
With the above substitutions in place, you can utilize them like so:
sed -i -f /path/to/phpcs.sed -- <INPUTFILE>sed supports one or more input file paths, so we can use grep again to retrieve the list of files.
sed -i -f /path/to/phpcs.sed -- $(grep -nrl -e 'Inpsyde.CodeQuality' -e 'InpsydeTemplates.Formatting' --exclude-dir="vendor" .)Tip
The above command may result in an error on a Mac. If this is the case for you, try passing an empty string as argument for the -i flag to prevent this error from happening (e.g., sed -i '' ...).
The above command will first retrieve the list of files that include Inpsyde.CodeQuality or InpsydeTemplates.Formatting, ignoring the vendor directory, and then execute all substitution commands in the phpcs.sed file for each of the found files.
As before, feel free to adapt the command as necessary. For example, if you want to start with the src folder only, pass src instead of . as last argument to the nested grep command.
The above will cover all references of Inpsyde rules in your PHP code. However, there are still a few things you will have to do manually.
In case you are currently extending or otherwise referencing Inpsyde\CodingStandard, Inpsyde\Sniffs or InpsydeTemplates\Sniffs classes, you will have to adapt this to the new structure. The new base namespace is SydeCS\Syde, but there are more changes to class and method names, as well as function signatures.
Wherever you were previously referencing the Inpsyde standard, you may want to change this to Syde-Extra now, and iterate on the sniffs included in your rulesets. Or, if you want to start with the set of minimum required rules, update to Syde-Core instead.
If you are using InpsydeTemplates, this would now be Syde-Templates.
In addition to the changes to the rule names, there are also changes regarding sniff configuration.
As mentioned before, the custom Inpsyde.CodeQuality.Psr4 sniff has been replaced by the SlevomatCodingStandard.Files.TypeNameMatchesFileName third-party sniff. This sniff works slightly differently when it comes to configuration.
The Inpsyde.CodeQuality.Psr4 sniff has a public array property, $psr4, that takes elements with the key being a namespace and the value being one or more pipe-separated relative paths. An example configuration looks like so:
<rule ref="Inpsyde.CodeQuality.Psr4">
<properties>
<property name="psr4" type="array">
<element key="MyCompany\MyProject" value="src"/>
<element key="MyCompany\MyProject\Tests" value="tests/src|tests/e2e|tests/unit"/>
</property>
</properties>
</rule>Now, the SlevomatCodingStandard.Files.TypeNameMatchesFileName sniff also has an array property, $rootNamespaces, that takes elements that map from a relative path to a namespace.
An example configuration that matches the above behavior looks like so:
<rule ref="SlevomatCodingStandard.Files.TypeNameMatchesFileName">
<properties>
<property name="rootNamespaces" type="array">
<element key="src" value="MyCompany\MyProject" />
<element key="tests/src" value="MyCompany\MyProject\Tests" />
<element key="tests/e2e" value="MyCompany\MyProject\Tests" />
<element key="tests/unit" value="MyCompany\MyProject\Tests" />
</property>
</properties>
</rule>The Inpsyde.CodeQuality.DisableMagicSerialize sniff has a public property $disabledFunctions. For the new Syde.Classes.DeprecatedSerializeMagicMethod sniff, this property has been renamed to $deprecatedMethods.
Both the Syde.Functions.ArgumentTypeDeclaration and the Syde.Functions.ReturnTypeDeclaration sniffs have two new public properties: $allowedMethodNames and $defaultAllowedMethodNames. The second one includes a pre-defined list of method names that will be ignored by the sniff, whereas the first property is intended to be used to customize sniff behavior. If you currently ignore or disable either of the two sniffs, maybe you can review the relevant code, and make use of the new properties.