Browse Source

Account for repeating namespace and nested app namespace.

ADmad 10 years ago
parent
commit
8f67104829
2 changed files with 32 additions and 2 deletions
  1. 11 2
      src/Core/App.php
  2. 21 0
      tests/TestCase/Core/AppTest.php

+ 11 - 2
src/Core/App.php

@@ -116,12 +116,21 @@ class App
     public static function shortName($class, $type, $suffix = '')
     {
         $class = str_replace('\\', '/', $class);
-        list($pluginName, $name) = explode('/' . $type . '/', $class);
+        $type = '/' . $type . '/';
+
+        $pos = strrpos($class, $type);
+        $pluginName = substr($class, 0, $pos);
+        $name = substr($class, $pos + strlen($type));
 
         if ($suffix) {
             $name = substr($name, 0, -strlen($suffix));
         }
-        if (in_array($pluginName, ['Cake', Configure::read('App.namespace')])) {
+
+        $nonPluginNamespaces = [
+            'Cake',
+            str_replace('\\', '/', Configure::read('App.namespace'))
+        ];
+        if (in_array($pluginName, $nonPluginNamespaces)) {
             return $name;
         }
 

+ 21 - 0
tests/TestCase/Core/AppTest.php

@@ -87,6 +87,25 @@ class AppTest extends TestCase
     }
 
     /**
+     * testShortNameWithNestedAppNamespace
+     *
+     * @return void
+     */
+    public function testShortNameWithNestedAppNamespace()
+    {
+        Configure::write('App.namespace', 'TestApp/Nested');
+
+        $return = TestApp::shortName(
+            'TestApp/Nested/Controller/PagesController',
+            'Controller',
+            'Controller'
+        );
+        $this->assertSame('Pages', $return);
+
+        Configure::write('App.namespace', 'TestApp');
+    }
+
+    /**
      * classnameProvider
      *
      * Return test permutations for testClassname method. Format:
@@ -180,6 +199,8 @@ class AppTest extends TestCase
             ['Cake\Exists\In\Subfolder\AlsoCake', 'Exists/In/Subfolder', 'Cake', 'Also'],
             ['Cake\Suffix\No', 'Suffix', '', 'No'],
 
+            ['Muffin\Webservice\Webservice\EndpointWebservice', 'Webservice', 'Webservice', 'Muffin/Webservice.Endpoint'],
+
             // Real examples returning classnames
             ['Cake\Core\App', 'Core', '', 'App'],
             ['Cake\Controller\Component\AuthComponent', 'Controller/Component', 'Component', 'Auth'],