MDL-61875 core_component: new method to get full components list
authorJake Dallimore <jake@moodle.com>
Fri, 6 Apr 2018 02:09:05 +0000 (10:09 +0800)
committerJake Dallimore <jake@moodle.com>
Tue, 10 Apr 2018 00:44:40 +0000 (08:44 +0800)
lib/classes/component.php
lib/tests/component_test.php

index a7b804e..c21fce8 100644 (file)
@@ -1244,4 +1244,38 @@ $cache = '.var_export($cache, true).';
             }
         }
     }
+
+    /**
+     * Returns a list of frankenstyle component names and their paths, for all components (plugins and subsystems).
+     *
+     * E.g.
+     *  [
+     *      'mod' => [
+     *          'mod_forum' => FORUM_PLUGIN_PATH,
+     *          ...
+     *      ],
+     *      ...
+     *      'core' => [
+     *          'core_comment' => COMMENT_SUBSYSTEM_PATH,
+     *          ...
+     *      ]
+     * ]
+     *
+     * @return array an associative array of components and their corresponding paths.
+     */
+    public static function get_component_list() : array {
+        $components = [];
+        // Get all plugins.
+        foreach (self::get_plugin_types() as $plugintype => $typedir) {
+            $components[$plugintype] = [];
+            foreach (self::get_plugin_list($plugintype) as $pluginname => $plugindir) {
+                $components[$plugintype][$plugintype . '_' . $pluginname] = $plugindir;
+            }
+        }
+        // Get all subsystems.
+        foreach (self::get_core_subsystems() as $subsystemname => $subsystempath) {
+            $components['core']['core_' . $subsystemname] = $subsystempath;
+        }
+        return $components;
+    }
 }
index 78206a6..845419e 100644 (file)
@@ -779,4 +779,30 @@ class core_component_testcase extends advanced_testcase {
         $file = $psrclassloader->invokeArgs(null, array($classname, $prefix, $path, $separators));
         $this->assertEquals($result, $file);
     }
+
+    /**
+     * Confirm the get_component_list method contains an entry for every component.
+     */
+    public function test_get_component_list_contains_all_components() {
+        global $CFG;
+        $componentslist = \core_component::get_component_list();
+
+        // We should have an entry for each plugin type, and one additional for 'core'.
+        $plugintypes = \core_component::get_plugin_types();
+        $numelementsexpected = count($plugintypes) + 1;
+        $this->assertEquals($numelementsexpected, count($componentslist));
+
+        // And an entry for each of the plugin types.
+        foreach (array_keys($plugintypes) as $plugintype) {
+            $this->assertArrayHasKey($plugintype, $componentslist);
+        }
+
+        // And finally, one for 'core'.
+        $this->assertArrayHasKey('core', $componentslist);
+
+        // Check a few of the known plugin types to confirm their presence at their respective type index.
+        $this->assertEquals($componentslist['core']['core_comment'], $CFG->dirroot . '/comment');
+        $this->assertEquals($componentslist['mod']['mod_forum'], $CFG->dirroot . '/mod/forum');
+        $this->assertEquals($componentslist['tool']['tool_analytics'], $CFG->dirroot . '/admin/tool/analytics');
+    }
 }