*/
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.
*
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
);
}
}
+ elseif ($attr === 'requires') {
+ $this->requires = array();
+ foreach ($val->ext as $ext) {
+ $this->requires[] = (string) $ext;
+ }
+ }
else {
$this->$attr = CRM_Utils_XML::xmlObjToArray($val);
}
$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() {