diff --git a/app/code/Magento/Developer/Console/Command/XmlConverterCommand.php b/app/code/Magento/Developer/Console/Command/XmlConverterCommand.php index 14eeadcabbea6d495867b777c5bd90fbc3b5b9a2..6a818213412698a850e008dd09c76abd8095a514 100644 --- a/app/code/Magento/Developer/Console/Command/XmlConverterCommand.php +++ b/app/code/Magento/Developer/Console/Command/XmlConverterCommand.php @@ -39,19 +39,38 @@ class XmlConverterCommand extends Command */ private $formatter; + /** + * @var \DOMDocument + */ + private $domXml; + + /** + * @var \DOMDocument + */ + private $domXsl; + + /** + * @var \XSLTProcessor + */ + private $xsltProcessor; + /** * Inject dependencies * * @param Formatter $formatter + * @param \DOMDocument $domXml + * @param \DOMDocument $domXsl + * @param \XSLTProcessor $xsltProcessor */ public function __construct( Formatter $formatter, - \DOMDocument $dom, + \DOMDocument $domXml, + \DOMDocument $domXsl, \XSLTProcessor $xsltProcessor ) { $this->formatter = $formatter; - $this->domXml = clone $dom; - $this->domXsl = clone $dom; + $this->domXml = $domXml; + $this->domXsl = $domXsl; $this->xsltProcessor = $xsltProcessor; parent::__construct(); @@ -89,7 +108,6 @@ class XmlConverterCommand extends Command /** * {@inheritdoc} - * @throws \InvalidArgumentException */ protected function execute(InputInterface $input, OutputInterface $output) { @@ -110,13 +128,9 @@ class XmlConverterCommand extends Command file_put_contents($input->getArgument(self::XML_FILE_ARGUMENT), $result); $output->writeln("<info>You saved converted XML into $xmlFile</info>"); } else { - echo $result; + $output->write($result); } - return; - } catch (\Zend_Console_Getopt_Exception $e) { - $errorMessage = $e->getUsageMessage(); - $output->writeln("<error>$errorMessage</error>"); return; } catch (\Exception $exception) { $errorMessage = $exception->getMessage(); diff --git a/app/code/Magento/Developer/Test/Unit/Console/Command/XmlConverterCommandTest.php b/app/code/Magento/Developer/Test/Unit/Console/Command/XmlConverterCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b8bff32c3b30b72d1066591a4aa948ce885cef3b --- /dev/null +++ b/app/code/Magento/Developer/Test/Unit/Console/Command/XmlConverterCommandTest.php @@ -0,0 +1,77 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Developer\Test\Unit\Console\Command; + +use Magento\Developer\Console\Command\XmlConverterCommand; +use Symfony\Component\Console\Tester\CommandTester; +use Magento\Developer\Model\Tools\Formatter; + +class XmlConverterCommandTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Formatter|\PHPUnit_Framework_MockObject_MockObject + */ + private $formatter; + + /** + * @var XmlConverterCommand + */ + private $command; + + /** + * @var \DOMDocument|\PHPUnit_Framework_MockObject_MockObject + */ + private $domXml; + + /** + * @var \DOMDocument|\PHPUnit_Framework_MockObject_MockObject + */ + private $domXsl; + + /** + * @var \XSLTProcessor|\PHPUnit_Framework_MockObject_MockObject + */ + private $xsltProcessor; + + public function setUp() + { + $this->formatter = $this->getMock('Magento\Developer\Model\Tools\Formatter', [], [], '', false); + $this->domXml = $this->getMock('DOMDocument', [], [], '', false); + $this->domXsl = $this->getMock('DOMDocument', [], [], '', false); + $this->xsltProcessor = $this->getMock('XSLTProcessor', [], [], '', false); + $this->command = new XmlConverterCommand($this->formatter, $this->domXml, $this->domXsl, $this->xsltProcessor); + } + + public function testExecute() + { + $this->domXml->expects($this->once())->method('load')->with('file.xml'); + $this->domXsl->expects($this->once())->method('load')->with('file.xsl'); + + $this->xsltProcessor->expects($this->once())->method('transformToXml')->with($this->domXml)->willReturn('XML'); + + $this->formatter->expects($this->once())->method('format')->with('XML')->willReturn('result'); + + $commandTester = new CommandTester($this->command); + $commandTester->execute( + [ + XmlConverterCommand::XML_FILE_ARGUMENT => 'file.xml', + XmlConverterCommand::PROCESSOR_ARGUMENT => 'file.xsl' + ] + ); + $this->assertContains('result', $commandTester->getDisplay()); + } + + /** + * @expectedException \RuntimeException + * @expectedExceptionMessage Not enough arguments + */ + public function testWrongParameter() + { + $commandTester = new CommandTester($this->command); + $commandTester->execute([]); + } +} diff --git a/app/code/Magento/Developer/etc/di.xml b/app/code/Magento/Developer/etc/di.xml index 850b8c2f609f9a895374f3e402f7a3a8de9f00bc..e04c00e615f56f5fb52dfeb108545e2b690d66c3 100644 --- a/app/code/Magento/Developer/etc/di.xml +++ b/app/code/Magento/Developer/etc/di.xml @@ -35,4 +35,10 @@ </argument> </arguments> </type> + <type name="Magento\Developer\Console\Command\XmlConverterCommand"> + <arguments> + <argument name="domXml" xsi:type="object" shared="false">DOMDocument</argument> + <argument name="domXsl" xsi:type="object" shared="false">DOMDocument</argument> + </arguments> + </type> </config> diff --git a/dev/tools/Magento/Tools/Layout/Reference/Processor.php b/dev/tools/Magento/Tools/Layout/Reference/Processor.php deleted file mode 100644 index 4ca794104d8ad659bb0f35d4da2e568199d31b30..0000000000000000000000000000000000000000 --- a/dev/tools/Magento/Tools/Layout/Reference/Processor.php +++ /dev/null @@ -1,195 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Tools\Layout\Reference; - -use Magento\Tools\Layout\Formatter; - -/** - * Processor - */ -class Processor -{ - /** - * @var Formatter - */ - protected $_formatter; - - /** - * @var \SimpleXMLElement - */ - protected $_referenceList; - - /** - * @var string - */ - protected $_referencesFile; - - /** - * @var array - */ - protected $_referencePattern = [ - 'reference' => '//reference[@name]', - 'block' => '//block[@name]', - 'container' => '//container[@name]', - ]; - - /** - * @param Formatter $formatter - * @param string $referencesFile - */ - public function __construct(Formatter $formatter, $referencesFile) - { - $this->_formatter = $formatter; - $this->_referencesFile = $referencesFile; - $contents = '<list/>'; - if (file_exists($referencesFile)) { - $contents = file_get_contents($referencesFile); - } - $this->_referenceList = new \SimpleXMLElement($contents); - } - - /** - * Create list from array - * - * @param array $data - * @param string $type - * @return Processor - */ - protected function _addElements($data, $type) - { - array_walk_recursive( - $data, - function ($value) use ($type) { - if (!$this->_referenceList->xpath("//item[@type='{$type}' and @value='{$value}']")) { - $element = $this->_referenceList->addChild('item'); - $element->addAttribute('type', $type); - $element->addAttribute('value', $value); - } - } - ); - - return $this; - } - - /** - * Get layout file from Magento root directory - * - * @param string $path - * @return string[] - */ - public function getLayoutFiles($path) - { - $result = []; - $patterns = [ - '/app/design/*/*/*/layout/*.xml', - '/app/design/*/*/*/layout/*/*.xml', - '/app/design/*/*/*/layout/*/*/*/*.xml', - '/app/design/*/*/*/layout/*/*/*/*/*.xml', - '/app/design/*/*/*/layout/*/*/*/*/*/*.xml', - '/app/code/*/*/*/*/layout/*.xml', - '/app/code/*/*/*/*/layout/*/*.xml', - '/app/code/*/*/*/*/layout/*/*/*/*.xml', - '/app/code/*/*/*/*/layout/*/*/*/*/*.xml', - '/app/code/*/*/*/*/layout/*/*/*/*/*/*.xml', - ]; - - foreach ($patterns as $pattern) { - $result = array_merge($result, glob($path . $pattern)); - } - return $result; - } - - /** - * Retrieve references and referenced names from $layouts files and - * - * @param array $layouts - * @return Processor - * @throws \Exception - */ - public function getReferences($layouts) - { - if (empty($layouts)) { - throw new \Exception("No layouts found"); - } - $references = []; - foreach ($this->_referencePattern as $patternName => $xpath) { - $result = []; - foreach ($layouts as $layout) { - $xml = simplexml_load_file($layout); - $nodes = $xml->xpath($xpath); - foreach ($nodes as $node) { - $result[(string)$node['name']] = ''; - } - } - $resultPrint = array_keys($result); - sort($resultPrint); - $references[$patternName] = $resultPrint; - } - - $conflictReferences = $references['reference']; - foreach ($references as $key => $names) { - $this->_addElements($names, $key); - if ($key != 'reference') { - $conflictReferences = array_diff($conflictReferences, $names); - } - } - $this->_addElements($conflictReferences, 'conflictReferences'); - $this->_addElements(array_intersect($references['block'], $references['container']), 'conflictNames'); - return $this; - } - - /** - * Update layout files to new format of references using $processor - * - * @param array $layouts - * @param string $processor - * @param bool $overwrite - * @return void - */ - public function updateReferences($layouts, $processor = '', $overwrite = true) - { - if (empty($processor)) { - $processor = __DIR__ . '/../processors/layoutReferences.xsl'; - } - if (!file_exists($processor)) { - return; - } - $stylesheet = new \DOMDocument(); - $stylesheet->preserveWhiteSpace = true; - $stylesheet->load($processor); - - $xslt = new \XSLTProcessor(); - $xslt->registerPHPFunctions(); - $xslt->importStylesheet($stylesheet); - $xslt->setParameter('', 'referencesFile', str_replace('\\', '/', $this->_referencesFile)); - - foreach ($layouts as $layout) { - $doc = new \DOMDocument(); - $doc->preserveWhiteSpace = true; - $doc->load($layout); - - $transformedDoc = $xslt->transformToXml($doc); - $result = $this->_formatter->format($transformedDoc); - if ($overwrite) { - file_put_contents($layout, $result); - } else { - echo $result; - } - } - } - - /** - * Write reference list to the file - * - * @return Processor - */ - public function writeToFile() - { - $result = $this->_formatter->format($this->_referenceList->asXML()); - file_put_contents($this->_referencesFile, $result); - return $this; - } -} diff --git a/dev/tools/layout/processors/addItemRenderer.xsl b/dev/tools/Magento/Tools/Layout/processors/addItemRenderer.xsl similarity index 100% rename from dev/tools/layout/processors/addItemRenderer.xsl rename to dev/tools/Magento/Tools/Layout/processors/addItemRenderer.xsl diff --git a/dev/tools/layout/processors/headBlocks.xsl b/dev/tools/Magento/Tools/Layout/processors/headBlocks.xsl similarity index 100% rename from dev/tools/layout/processors/headBlocks.xsl rename to dev/tools/Magento/Tools/Layout/processors/headBlocks.xsl diff --git a/dev/tools/Magento/Tools/Layout/reference.php b/dev/tools/Magento/Tools/Layout/reference.php deleted file mode 100644 index 9c239f00993c3048121d3ca9a2c84e772211f397..0000000000000000000000000000000000000000 --- a/dev/tools/Magento/Tools/Layout/reference.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -require __DIR__ . '/../../../bootstrap.php'; -$rootDir = realpath(__DIR__ . '/../../../../../'); -use Magento\Tools\Layout\Formatter; -use Magento\Tools\Layout\Reference\Processor; - -try { - $opt = new \Zend_Console_Getopt( - [ - 'dir=s' => "Directory to process(optional, default {$rootDir})", - 'file|f=s' => 'File to process(optional)', - 'overwrite|o' => 'Overwrite file', - 'collect|c' => 'Collect names for a dictionary', - 'process|p' => 'Process references using dictionary', - 'dictionary|d=s' => 'Dictionary file (required)', - 'processor=s' => 'Processor file (optional)', - ] - ); - $opt->parse(); - - if ($opt->dir) { - $rootDir = realpath($opt->dir); - } - if (!file_exists($rootDir) || !is_dir($rootDir)) { - throw new \Exception("Directory to process ({$rootDir}) not found"); - } - if (empty($opt->dictionary)) { - throw new \Exception("Dictionary file is required"); - } - - if (!empty($opt->process) && empty($opt->file) && empty($opt->overwrite)) { - throw new \Exception("Overwrite option is required if you going to process multiple files"); - } - - if (!file_exists($opt->dictionary)) { - touch($opt->dictionary); - } - - $processor = new Processor(new Formatter(), realpath($opt->dictionary)); - - $layouts = []; - if (!empty($opt->file) && file_exists($opt->file)) { - $layouts = [realpath($opt->file)]; - } else { - $layouts = $processor->getLayoutFiles($rootDir); - } - - if ($opt->collect) { - $processor->getReferences($layouts)->writeToFile(); - } - - if ($opt->process) { - $processor->updateReferences($layouts, $opt->processor, $opt->overwrite); - } - - exit(0); -} catch (\Zend_Console_Getopt_Exception $e) { - echo $e->getUsageMessage(); - exit(255); -} catch (\Exception $e) { - echo $e, PHP_EOL; - exit(255); -} diff --git a/dev/tools/Magento/Tools/Layout/xmlUpdater.php b/dev/tools/Magento/Tools/Layout/xmlUpdater.php deleted file mode 100644 index 7233f568ef95b7e86dbdb7aa82211f2970330be8..0000000000000000000000000000000000000000 --- a/dev/tools/Magento/Tools/Layout/xmlUpdater.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -$basePath = realpath(__DIR__ . '/../../../../../'); -require_once $basePath . '/app/autoload.php'; -require __DIR__ . '/Formatter.php'; - -try { - $opt = new \Zend_Console_Getopt( - [ - 'file|f=s' => 'File to process(required)', - 'processor|p=s' => 'Processor file (required)', - 'overwrite|o' => 'Overwrite file', - ] - ); - $opt->parse(); - - $doc = new \DOMDocument(); - $doc->preserveWhiteSpace = true; - $doc->load($opt->file); - - $stylesheet = new \DOMDocument(); - $stylesheet->preserveWhiteSpace = true; - $stylesheet->load($opt->processor); - - $formater = new \Magento\Tools\Layout\Formatter(); - - $xslt = new XSLTProcessor(); - $xslt->registerPHPFunctions(); - $xslt->importStylesheet($stylesheet); - $transformedDoc = $xslt->transformToXml($doc); - $result = $formater->format($transformedDoc); - if ($opt->overwrite) { - file_put_contents($opt->file, $result); - } else { - echo $result; - } - exit(0); -} catch (\Zend_Console_Getopt_Exception $e) { - echo $e->getUsageMessage(); - exit(255); -} catch (\Exception $e) { - echo $e, PHP_EOL; - exit(255); -} diff --git a/dev/tools/layout/xml-updater.php b/dev/tools/layout/xml-updater.php deleted file mode 100644 index 700f28d45fcc3e2b164fe1839df2992adabbfa0e..0000000000000000000000000000000000000000 --- a/dev/tools/layout/xml-updater.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -$basePath = realpath(__DIR__ . '/../../../'); -require_once $basePath . '/app/autoload.php'; -require __DIR__ . '/Formatter.php'; - -try { - $opt = new Zend_Console_Getopt([ - 'file|f=s' => 'File to process(required)', - 'processor|p=s' => 'Processor file (required)', - 'overwrite|o' => 'Overwrite file', - ]); - $opt->parse(); - - $doc = new DOMDocument(); - $doc->preserveWhiteSpace = true; - $doc->load($opt->file); - - $stylesheet = new DOMDocument(); - $stylesheet->preserveWhiteSpace = true; - $stylesheet->load($opt->processor); - - $formater = new \Magento\Tools\Layout\Formatter(); - - $xslt = new XSLTProcessor(); - $xslt->registerPHPFunctions(); - $xslt->importStylesheet($stylesheet); - $transformedDoc = $xslt->transformToXml($doc); - $result = $formater->format($transformedDoc); - if ($opt->overwrite) { - file_put_contents($opt->file, $result); - } else { - echo $result; - } - exit(0); -} catch (Zend_Console_Getopt_Exception $e) { - echo $e->getUsageMessage(); - exit(255); -} catch (Exception $e) { - echo $e, PHP_EOL; - exit(255); -}