From 4b0558d911bfcbd81e1f5199b0eb0c837c7c8205 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Tue, 21 Jun 2022 02:39:53 -0700 Subject: [PATCH] mixin/scan-classes@1 - Allow extensions to opt-in to class scanning --- .../example/CRM/Shimmy/ShimmyMessage.php | 13 ++++ .../example/tests/mixin/ScanClassesTest.php | 41 ++++++++++++ mixin/scan-classes@1/mixin.php | 66 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 mixin/scan-classes@1/example/CRM/Shimmy/ShimmyMessage.php create mode 100644 mixin/scan-classes@1/example/tests/mixin/ScanClassesTest.php create mode 100644 mixin/scan-classes@1/mixin.php diff --git a/mixin/scan-classes@1/example/CRM/Shimmy/ShimmyMessage.php b/mixin/scan-classes@1/example/CRM/Shimmy/ShimmyMessage.php new file mode 100644 index 0000000000..8c6811ab16 --- /dev/null +++ b/mixin/scan-classes@1/example/CRM/Shimmy/ShimmyMessage.php @@ -0,0 +1,13 @@ +assertFileExists(static::getPath('/CRM/Shimmy/ShimmyMessage.php'), 'The shimmy extension must have example PHP files.'); + } + + public function testInstalled($cv) { + // Assert that WorkflowMessageInterface's are registered. + $items = $cv->api4('WorkflowMessage', 'get', ['where' => [['name', '=', 'shimmy_message_example']]]); + $this->assertEquals('CRM_Shimmy_ShimmyMessage', $items[0]['class']); + } + + public function testDisabled($cv) { + // Assert that WorkflowMessageInterface's are removed. + $items = $cv->api4('WorkflowMessage', 'get', ['where' => [['name', '=', 'shimmy_message_example']]]); + $this->assertEmpty($items); + } + + public function testUninstalled($cv) { + // Assert that WorkflowMessageInterface's are removed. + $items = $cv->api4('WorkflowMessage', 'get', ['where' => [['name', '=', 'shimmy_message_example']]]); + $this->assertEmpty($items); + } + + protected static function getPath($suffix = ''): string { + return dirname(__DIR__, 2) . $suffix; + } + +} diff --git a/mixin/scan-classes@1/mixin.php b/mixin/scan-classes@1/mixin.php new file mode 100644 index 0000000000..f23dabaf52 --- /dev/null +++ b/mixin/scan-classes@1/mixin.php @@ -0,0 +1,66 @@ +addListener('hook_civicrm_scanClasses', function ($event) use ($mixInfo) { + if (!$mixInfo->isActive()) { + return; + } + + $cache = \Civi\Core\ClassScanner::cache('structure'); + $cacheKey = $mixInfo->longName; + $all = $cache->get($cacheKey); + if ($all === NULL) { + $baseDir = CRM_Utils_File::addTrailingSlash($mixInfo->getPath()); + $all = []; + + \Civi\Core\ClassScanner::scanFolders($all, $baseDir, 'CRM', '_'); + \Civi\Core\ClassScanner::scanFolders($all, $baseDir, 'Civi', '\\'); + if (defined('CIVICRM_TEST')) { + \Civi\Core\ClassScanner::scanFolders($all, "$baseDir/tests/phpunit", 'CRM', '_'); + \Civi\Core\ClassScanner::scanFolders($all, "$baseDir/tests/phpunit", 'Civi', '\\'); + } + $cache->set($cacheKey, $all, \Civi\Core\ClassScanner::TTL); + } + + $event->classes = array_merge($event->classes, $all); + }); + +}; -- 2.25.1