public function testOnDemandResolver() { $xrefDep1 = new Xref('file', '/dep1.json'); $xrefDep1->setData(array('on-demand1' => '{{token1}}', 'on-demand2' => '{{token2}}'))->setResolved(true); $xrefMain = new Xref('file', '/main.json'); $xrefMain->setData(array('include' => array('xref' => array('dep1' => array('type' => 'file', 'src' => '/dep1.json', 'resolve' => array(array('type' => 'on-demand', 'options' => array('token-prefix' => '{{', 'token-suffix' => '}}'), 'values' => array())))), 'main' => array('dep1'))))->setResolved(true); $treeCompiler = new TreeCompiler(); $treeCompiler->getXrefs()->add($xrefDep1); $compiled = $treeCompiler->compileXref($xrefMain); $expected = array('on-demand1' => '{{token1}}', 'on-demand2' => '{{token2}}'); $this->assertEquals($expected, $compiled); $this->onDemandTokenValues = array('token1' => 'ok1', 'token2' => 'ok2'); $testListener = new TestEventListener(array($this, 'eventListenerCallback')); $eventManager = EventManager::getInstance(); $eventManager->register($testListener); $this->assertTrue($eventManager->hasListeners()); $compiled = $treeCompiler->compileXref($xrefMain); $expected = array('on-demand1' => 'ok1', 'on-demand2' => 'ok2'); $this->assertEquals($expected, $compiled); $eventManager->remove($testListener); $this->assertFalse($eventManager->hasListeners()); }
/** * @param string $xrefKey * @param string|array $xrefInfo * @param XrefTokenResolverCollection $xrefTokenResolvers * @param Xref[] $xrefPath * @return Xref|mixed * @throws TreeCompilerFormatException * @throws \Exception */ protected function parseXrefInfo($xrefKey, $xrefInfo, XrefTokenResolverCollection $xrefTokenResolvers = null, $xrefPath) { $xrefData = null; if (gettype($xrefInfo) == 'string') { list($xrefType, $xrefLocation) = Xref::parseDefinitionString($xrefInfo, $this->xrefTypeAndLocationDelimiter); } else { if (!is_array($xrefInfo)) { throw new TreeCompilerFormatException(sprintf('The Xref definition key "%s" must be a string with the format xref_type %s xref_location ' . 'or an associative array with the keys "%s" for type and "%s" for location.', $this->xrefTypeAndLocationDelimiter, $this->includeXrefTypeKey, $this->includeXrefLocationKey)); } $requiredKeyErrorMessage = 'The "%s" key is missing from the Xref definition with the key "%s".'; if (!isset($xrefInfo[$this->includeXrefTypeKey])) { throw new TreeCompilerFormatException(sprintf($requiredKeyErrorMessage, $this->includeXrefTypeKey, $xrefKey)); } $xrefType = $xrefInfo[$this->includeXrefTypeKey]; if ($xrefType == InlineXrefResolver::getType()) { if (!isset($xrefInfo[$this->includeXrefDataKey])) { throw new TreeCompilerFormatException(sprintf($requiredKeyErrorMessage, $this->includeXrefDataKey, $xrefKey)); } $xrefData = $xrefInfo[$this->includeXrefDataKey]; $xrefLocation = Xref::computeId($xrefType, serialize($xrefData)); } else { if (!isset($xrefInfo[$this->includeXrefLocationKey])) { throw new TreeCompilerFormatException(sprintf($requiredKeyErrorMessage, $this->includeXrefLocationKey, $xrefKey)); } $xrefLocation = $xrefInfo[$this->includeXrefLocationKey]; } } if (isset($xrefData)) { if (isset($xrefTokenResolvers)) { $xrefTokenResolvers->applyToArray($xrefData); } } else { if (isset($xrefTokenResolvers)) { $xrefLocation = $xrefTokenResolvers->applyToString($xrefLocation); } $xrefLocation = Xref::computeAbsoluteLocation($xrefType, $xrefLocation, $xrefPath); } $xrefId = Xref::computeId($xrefType, $xrefLocation); if ($this->xrefs->hasById($xrefId)) { return $this->xrefs[$xrefId]; } $xref = new Xref($xrefType, $xrefLocation); if (isset($xrefData)) { $xref->setData($xrefData)->setResolved(true); } return $xref; }
public function testTokensInValuesXrefLocation() { $xrefDep1 = new Xref('file', '/dep1.json'); $xrefDep1->setData(array('content' => 'dep1.json', 'dep1version' => '{{version}}'))->setResolved(true); $xrefDep2 = new Xref('file', '/dep2.json'); $xrefDep2->setData(array('include' => array('xref' => array('dep1' => array('type' => 'file', 'src' => '/dep1.json', 'resolve' => array(array('type' => 'registered', 'options' => array('token-prefix' => '{{', 'token-suffix' => '}}'), 'values-xref' => array('type' => 'file', 'src' => '/dep{{version}}.json'))))), 'main' => array('dep1'))))->setResolved(true); $xrefMain = new Xref('file', '/main.json'); $xrefMain->setData(array('include' => array('xref' => array('dep2' => array('type' => 'file', 'src' => '/dep2.json', 'resolve' => array(array('type' => 'registered', 'options' => array('token-prefix' => '{{', 'token-suffix' => '}}'), 'values' => array('version' => '1'))))), 'main' => array('dep2'))))->setResolved(true); $treeCompiler = new TreeCompiler(); $treeCompiler->getXrefs()->add($xrefDep1); $treeCompiler->getXrefs()->add($xrefDep2); $compiled = $treeCompiler->compileXref($xrefMain); $expected = array('content' => 'dep1.json', 'dep1version' => 1); $this->assertEquals($expected, $compiled); }