diff --git a/HM/Sniffs/Files/NamespaceDirectoryNameSniff.php b/HM/Sniffs/Files/NamespaceDirectoryNameSniff.php index 851f2588..18a767a0 100644 --- a/HM/Sniffs/Files/NamespaceDirectoryNameSniff.php +++ b/HM/Sniffs/Files/NamespaceDirectoryNameSniff.php @@ -62,6 +62,13 @@ public function process( File $phpcsFile, $stackPtr ) { return; } + if ( in_array( basename( dirname( $directory ) ), [ 'plugins', 'client-mu-plugins', 'mu-plugins' ], true ) ) { + if ( pathinfo( $filename, PATHINFO_FILENAME ) === basename( $directory ) ) { + // Allow plugin entrypoints named `plugin-name/plugin-name.php` instead of `plugin.php`. + return; + } + } + if ( ! preg_match( '#(?:.*)(?:/inc|/tests)(/.*)?#', $directory, $matches ) ) { $error = 'Namespaced classes and functions should live inside an inc directory.'; $phpcsFile->addError( $error, $stackPtr, 'NoIncDirectory' ); diff --git a/HM/Tests/Files/NamespaceDirectoryNameUnitTest.php b/HM/Tests/Files/NamespaceDirectoryNameUnitTest.php index f9ca7608..f3069f7a 100644 --- a/HM/Tests/Files/NamespaceDirectoryNameUnitTest.php +++ b/HM/Tests/Files/NamespaceDirectoryNameUnitTest.php @@ -55,6 +55,9 @@ public function getErrorList() { // Single-file mu-plugins are exempt from the directory structure rules. 'mu-plugin.php', 'client-mu-plugin.php', + // Plugin entrypoints should also allow namespace declarations. + 'mypluginname.php', + 'plugin.php', ]; if ( in_array( $file, $pass, true ) ) { return []; diff --git a/HM/Tests/Files/NamespaceDirectoryNameUnitTest/plugins/mypluginname/improperly-named.php b/HM/Tests/Files/NamespaceDirectoryNameUnitTest/plugins/mypluginname/improperly-named.php new file mode 100644 index 00000000..4c7542a5 --- /dev/null +++ b/HM/Tests/Files/NamespaceDirectoryNameUnitTest/plugins/mypluginname/improperly-named.php @@ -0,0 +1,3 @@ +