CRM-16243 - CRM_Extension_Info - Parse `<requires>` tag
authorTim Otten <totten@civicrm.org>
Fri, 25 Mar 2016 03:44:08 +0000 (20:44 -0700)
committerJohn Kirk <accounts@civifirst.com>
Mon, 9 Oct 2017 18:27:50 +0000 (18:27 +0000)
CRM/Extension/Info.php
tests/phpunit/CRM/Extension/InfoTest.php

index 53aff153da9eff09805052f358c4fe385efdeeae..0f672d33bb0899d49fee17c71062c9e19e9f2a7e 100644 (file)
@@ -51,6 +51,12 @@ class CRM_Extension_Info {
    */
   public $classloader = array();
 
+  /**
+   * @var array
+   *   Each item is they key-name of an extension required by this extension.
+   */
+  public $requires = array();
+
   /**
    * Load extension info an XML file.
    *
@@ -90,6 +96,27 @@ class CRM_Extension_Info {
     return $instance;
   }
 
+  /**
+   * Build a reverse-dependency map.
+   *
+   * @param array $infos
+   *   The universe of available extensions.
+   *   Ex: $infos['org.civicrm.foobar'] = new CRM_Extension_Info().
+   * @return array
+   *   If "org.civicrm.api" is required by "org.civicrm.foo", then return
+   *   array('org.civicrm.api' => array(CRM_Extension_Info[org.civicrm.foo])).
+   *   Array(string $key => array $requiredBys).
+   */
+  public static function buildReverseMap($infos) {
+    $revMap = array();
+    foreach ($infos as $info) {
+      foreach ($info->requires as $key) {
+        $revMap[$key][] = $info;
+      }
+    }
+    return $revMap;
+  }
+
   /**
    * @param null $key
    * @param null $type
@@ -141,6 +168,12 @@ class CRM_Extension_Info {
           );
         }
       }
+      elseif ($attr === 'requires') {
+        $this->requires = array();
+        foreach ($val->ext as $ext) {
+          $this->requires[] = (string) $ext;
+        }
+      }
       else {
         $this->$attr = CRM_Utils_XML::xmlObjToArray($val);
       }
index 469b89546545d9eae20a0680a54360497fdb32ad..0ae7fba1c0a40946122162c44cead94a6c0e9706 100644 (file)
@@ -49,6 +49,22 @@ class CRM_Extension_InfoTest extends CiviUnitTestCase {
     $this->assertEquals('test.foo', $info->key);
     $this->assertEquals('foo', $info->file);
     $this->assertEquals('zamboni', $info->typeInfo['extra']);
+    $this->assertEquals(array(), $info->requires);
+  }
+
+  public function testGood_string_extras() {
+    $data = "<extension key='test.bar' type='module'><file>testbar</file>
+      <classloader><psr4 prefix=\"Civi\\\" path=\"Civi\"/></classloader>
+      <requires><ext>org.civicrm.a</ext><ext>org.civicrm.b</ext></requires>
+    </extension>
+    ";
+
+    $info = CRM_Extension_Info::loadFromString($data);
+    $this->assertEquals('test.bar', $info->key);
+    $this->assertEquals('testbar', $info->file);
+    $this->assertEquals('Civi\\', $info->classloader[0]['prefix']);
+    $this->assertEquals('Civi', $info->classloader[0]['path']);
+    $this->assertEquals(array('org.civicrm.a', 'org.civicrm.b'), $info->requires);
   }
 
   public function testBad_string() {