diff --git a/CHANGELOG.md b/CHANGELOG.md index ebc83d42..74778fd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,8 @@ and fill in the contents as you go. This simplifies later release management. -- ## 2.3.0 -- Do not lint PHP within `build/` and `dist/` build directories +- Broaden relaxation of "must be named namespace.php" check for plugin entrypoint files to allow the patterns `/plugin.php` or `/.php` in both regular and mu-plugin folders. #343 +- Do not lint PHP within `build/` and `dist/` build directories #342 ## 2.2.1 diff --git a/HM/Sniffs/Files/FunctionFileNameSniff.php b/HM/Sniffs/Files/FunctionFileNameSniff.php index 001cd013..37d35558 100644 --- a/HM/Sniffs/Files/FunctionFileNameSniff.php +++ b/HM/Sniffs/Files/FunctionFileNameSniff.php @@ -8,7 +8,7 @@ * Sniff to check for namespaced functions are in `namespace.php`. */ class FunctionFileNameSniff implements Sniff { - use MuPluginFileTrait; + use PluginEntryPointTrait; public function register() { return array( T_FUNCTION ); @@ -27,8 +27,8 @@ public function process( File $phpcsFile, $stackPtr ) { return; } - if ( $this->is_single_file_mu_plugin( $phpcsFile->getFileName() ) ) { - // Single-file plugins cannot be split into a namespace.php file. + if ( $this->is_plugin_entry_point( $phpcsFile ) ) { + // Plugin entry points cannot be split into a namespace.php file. return; } diff --git a/HM/Sniffs/Files/MuPluginFileTrait.php b/HM/Sniffs/Files/MuPluginFileTrait.php deleted file mode 100644 index 2c5487ec..00000000 --- a/HM/Sniffs/Files/MuPluginFileTrait.php +++ /dev/null @@ -1,27 +0,0 @@ -is_single_file_mu_plugin( $full ) ) { - // Single-file mu-plugins will naturally never have an inc/ directory. + if ( $this->is_plugin_entry_point( $phpcsFile ) ) { + // Plugin entry points will naturally never have an inc/ directory. return; } diff --git a/HM/Sniffs/Files/PluginEntryPointTrait.php b/HM/Sniffs/Files/PluginEntryPointTrait.php new file mode 100644 index 00000000..927709af --- /dev/null +++ b/HM/Sniffs/Files/PluginEntryPointTrait.php @@ -0,0 +1,60 @@ +getFilename(); + + // Normalize the directory separator across operating systems. + if ( DIRECTORY_SEPARATOR !== '/' ) { + $path = str_replace( DIRECTORY_SEPARATOR, '/', $path ); + } + + // Naming a file plugin.php conventionally signals it's a plugin entrypoint. + if ( basename( $path ) === 'plugin.php' ) { + return true; + } + + // Single-file mu-plugin: a direct child of (client-)mu-plugins/. + if ( preg_match( '#/(?:client-)?mu-plugins/[^/]+\.php$#', $path ) ) { + return true; + } + + // Nested entry point: the conventionally named main file directly + // inside a plugin's own folder, under plugins/, mu-plugins/ or + // client-mu-plugins/. Anything deeper is ordinary plugin code. + if ( ! preg_match( '#/(?:(?:client-)?mu-)?plugins/([^/]+)/([^/]+)\.php$#', $path, $matches ) ) { + return false; + } + + // Check for conventional pattern /.php. + [ , $dir, $file ] = $matches; + return $file === $dir; + } +} diff --git a/HM/Tests/Files/FunctionFileNameUnitTest.php b/HM/Tests/Files/FunctionFileNameUnitTest.php index 142d66c9..3f268376 100644 --- a/HM/Tests/Files/FunctionFileNameUnitTest.php +++ b/HM/Tests/Files/FunctionFileNameUnitTest.php @@ -52,6 +52,11 @@ public function getErrorList() { // Single-file mu-plugins can't all be named namespace.php. 'my-plugin.php', 'my-client-plugin.php', + // Nested plugin entry points are exempt too -- in plugins/ as well + // as mu-plugins/ -- when named /.php or /plugin.php. + 'sub-plugin.php', + 'plugin.php', + 'plugin-name.php', ]; if ( in_array( $file, $pass, true ) ) { return []; diff --git a/HM/Tests/Files/FunctionFileNameUnitTest/mu-plugins/nested/nested-plugin.php b/HM/Tests/Files/FunctionFileNameUnitTest/mu-plugins/nested/improperly-named.php similarity index 100% rename from HM/Tests/Files/FunctionFileNameUnitTest/mu-plugins/nested/nested-plugin.php rename to HM/Tests/Files/FunctionFileNameUnitTest/mu-plugins/nested/improperly-named.php diff --git a/HM/Tests/Files/FunctionFileNameUnitTest/mu-plugins/plugin-name/plugin-name.php b/HM/Tests/Files/FunctionFileNameUnitTest/mu-plugins/plugin-name/plugin-name.php new file mode 100644 index 00000000..4f1a4ffa --- /dev/null +++ b/HM/Tests/Files/FunctionFileNameUnitTest/mu-plugins/plugin-name/plugin-name.php @@ -0,0 +1,5 @@ +/.php or /plugin.php. + 'plugin.php', + 'plugin-name.php', ]; if ( in_array( $file, $pass, true ) ) { return []; diff --git a/HM/Tests/Files/NamespaceDirectoryNameUnitTest/mu-plugins/plugin-name/plugin-name.php b/HM/Tests/Files/NamespaceDirectoryNameUnitTest/mu-plugins/plugin-name/plugin-name.php new file mode 100644 index 00000000..09b061a7 --- /dev/null +++ b/HM/Tests/Files/NamespaceDirectoryNameUnitTest/mu-plugins/plugin-name/plugin-name.php @@ -0,0 +1,3 @@ +