diff --git a/app/code/Magento/Backend/App/ConfigInterface.php b/app/code/Magento/Backend/App/ConfigInterface.php index 0d7de58ecc308299576e3a6820a0edbe96b33b51..9203f07ad552dd70ade305ba4af77b2251ceed83 100644 --- a/app/code/Magento/Backend/App/ConfigInterface.php +++ b/app/code/Magento/Backend/App/ConfigInterface.php @@ -17,6 +17,7 @@ interface ConfigInterface * * @param string $path * @return mixed + * @api */ public function getValue($path); @@ -26,6 +27,7 @@ interface ConfigInterface * @param string $path * @param mixed $value * @return void + * @api */ public function setValue($path, $value); @@ -34,6 +36,7 @@ interface ConfigInterface * * @param string $path * @return bool + * @api */ public function isSetFlag($path); } diff --git a/app/code/Magento/Backend/Block/Widget/Button/ContextInterface.php b/app/code/Magento/Backend/Block/Widget/Button/ContextInterface.php index 3828446f1a6abc7f4bf4cd1b319e32029bcf2439..0d75331f012cd6e5d1a568e3df2515e8807b631b 100644 --- a/app/code/Magento/Backend/Block/Widget/Button/ContextInterface.php +++ b/app/code/Magento/Backend/Block/Widget/Button/ContextInterface.php @@ -13,6 +13,7 @@ interface ContextInterface * * @param \Magento\Backend\Block\Widget\Button\Item $item * @return bool + * @api */ public function canRender(\Magento\Backend\Block\Widget\Button\Item $item); } diff --git a/app/code/Magento/Backend/Block/Widget/Button/ToolbarInterface.php b/app/code/Magento/Backend/Block/Widget/Button/ToolbarInterface.php index 4228d487bdce1e05c546a38948a80fb3965a6773..72410c676d14d5f9c74430dd39251ed10cd7e14b 100644 --- a/app/code/Magento/Backend/Block/Widget/Button/ToolbarInterface.php +++ b/app/code/Magento/Backend/Block/Widget/Button/ToolbarInterface.php @@ -14,6 +14,7 @@ interface ToolbarInterface * @param \Magento\Framework\View\Element\AbstractBlock $context * @param \Magento\Backend\Block\Widget\Button\ButtonList $buttonList * @return void + * @api */ public function pushButtons( \Magento\Framework\View\Element\AbstractBlock $context, diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Column/Filter/FilterInterface.php b/app/code/Magento/Backend/Block/Widget/Grid/Column/Filter/FilterInterface.php index 403e028997c56aa99e2a1852d7aeceb5a58d44dc..2f2720cae0ca723fb6cfaf66c4556eaf8b84fcda 100644 --- a/app/code/Magento/Backend/Block/Widget/Grid/Column/Filter/FilterInterface.php +++ b/app/code/Magento/Backend/Block/Widget/Grid/Column/Filter/FilterInterface.php @@ -16,17 +16,20 @@ interface FilterInterface { /** * @return Column + * @api */ public function getColumn(); /** * @param Column $column * @return AbstractFilter + * @api */ public function setColumn($column); /** * @return string + * @api */ public function getHtml(); } diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/RendererInterface.php b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/RendererInterface.php index 9b7e3d053b79e75ae28ae80cace94e3733352be1..5d8e5723954c582c921c76adae5e2a9fb1eabacf 100644 --- a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/RendererInterface.php +++ b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/RendererInterface.php @@ -20,6 +20,7 @@ interface RendererInterface * @param Column $column * @return void * @abstract + * @api */ public function setColumn($column); @@ -28,6 +29,7 @@ interface RendererInterface * * @abstract * @return void + * @api */ public function getColumn(); @@ -36,6 +38,7 @@ interface RendererInterface * * @param \Magento\Framework\Object $row * @return string + * @api */ public function render(\Magento\Framework\Object $row); } diff --git a/app/code/Magento/Backend/Block/Widget/Grid/ExportInterface.php b/app/code/Magento/Backend/Block/Widget/Grid/ExportInterface.php index 06a26faf108aa0fa28fae009facc7e320ee6f0a1..144ea5b43e7dc2857ef91d542d1324b97e7df61e 100644 --- a/app/code/Magento/Backend/Block/Widget/Grid/ExportInterface.php +++ b/app/code/Magento/Backend/Block/Widget/Grid/ExportInterface.php @@ -11,6 +11,7 @@ interface ExportInterface * Retrieve grid export types * * @return array|bool + * @api */ public function getExportTypes(); @@ -18,6 +19,7 @@ interface ExportInterface * Retrieve grid id * * @return string + * @api */ public function getId(); @@ -43,6 +45,7 @@ interface ExportInterface * Return array with keys type and value * * @return array + * @api */ public function getCsvFile(); @@ -50,6 +53,7 @@ interface ExportInterface * Retrieve Grid data as CSV * * @return string + * @api */ public function getCsv(); @@ -57,6 +61,7 @@ interface ExportInterface * Retrieve data in xml * * @return string + * @api */ public function getXml(); @@ -67,6 +72,7 @@ interface ExportInterface * * @param string $sheetName * @return array + * @api */ public function getExcelFile($sheetName = ''); @@ -74,6 +80,7 @@ interface ExportInterface * Retrieve grid data as MS Excel 2003 XML Document * * @return string + * @api */ public function getExcel(); } diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/Item/Additional/AdditionalInterface.php b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/Item/Additional/AdditionalInterface.php index a7430caa9a70c2747966d9c88b20f1e373870c46..1d84c61222f35524278e4a0454acf234160cecc2 100644 --- a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/Item/Additional/AdditionalInterface.php +++ b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/Item/Additional/AdditionalInterface.php @@ -15,6 +15,7 @@ interface AdditionalInterface /** * @param array $configuration * @return $this + * @api */ public function createFromConfiguration(array $configuration); } diff --git a/app/code/Magento/Backend/Block/Widget/Tab/TabInterface.php b/app/code/Magento/Backend/Block/Widget/Tab/TabInterface.php index b0f8e90d40664433aff18ae0800433f0cc70b8a6..8e32c0648ec581297602f38d8c86a8de5e969d7a 100644 --- a/app/code/Magento/Backend/Block/Widget/Tab/TabInterface.php +++ b/app/code/Magento/Backend/Block/Widget/Tab/TabInterface.php @@ -17,6 +17,7 @@ interface TabInterface * Return Tab label * * @return string + * @api */ public function getTabLabel(); @@ -24,6 +25,7 @@ interface TabInterface * Return Tab title * * @return string + * @api */ public function getTabTitle(); @@ -31,6 +33,7 @@ interface TabInterface * Can show tab in tabs * * @return boolean + * @api */ public function canShowTab(); @@ -38,6 +41,7 @@ interface TabInterface * Tab is hidden * * @return boolean + * @api */ public function isHidden(); } diff --git a/app/code/Magento/Backend/Helper/Dashboard/Data.php b/app/code/Magento/Backend/Helper/Dashboard/Data.php index efaf955675d592b7444f802db49e19047799387c..a7fbf36c8886386a26c1a91490acecc0295df265 100644 --- a/app/code/Magento/Backend/Helper/Dashboard/Data.php +++ b/app/code/Magento/Backend/Helper/Dashboard/Data.php @@ -14,7 +14,7 @@ use Magento\Framework\Config\ConfigOptionsListConstants; class Data extends \Magento\Framework\App\Helper\AbstractHelper { /** - * @var \MagentoFrameworkDataCollectionAbstractDb + * @var \Magento\Framework\Data\Collection\AbstractDb */ protected $_stores; @@ -48,7 +48,7 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper /** * Retrieve stores configured in system. * - * @return \MagentoFrameworkDataCollectionAbstractDb + * @return \Magento\Framework\Data\Collection\AbstractDb */ public function getStores() { diff --git a/app/code/Magento/Backend/Model/Auth/Credential/StorageInterface.php b/app/code/Magento/Backend/Model/Auth/Credential/StorageInterface.php index 2125c2387fca8405c1684f252b3a97702d603e6e..5b5958b01aec524d2b5ab9b6f2e36f1679d8c993 100644 --- a/app/code/Magento/Backend/Model/Auth/Credential/StorageInterface.php +++ b/app/code/Magento/Backend/Model/Auth/Credential/StorageInterface.php @@ -9,6 +9,7 @@ namespace Magento\Backend\Model\Auth\Credential; * Backend Auth Credential Storage interface * * @author Magento Core Team <core@magentocommerce.com> + * @api */ interface StorageInterface { diff --git a/app/code/Magento/Backend/Model/Auth/StorageInterface.php b/app/code/Magento/Backend/Model/Auth/StorageInterface.php index 156b1fac33a497251588ccc000822e775e6e6475..c031b74e6d66c99409a005b31cf30c74886996ec 100644 --- a/app/code/Magento/Backend/Model/Auth/StorageInterface.php +++ b/app/code/Magento/Backend/Model/Auth/StorageInterface.php @@ -15,6 +15,7 @@ interface StorageInterface * * @return $this * @abstract + * @api */ public function processLogin(); @@ -23,6 +24,7 @@ interface StorageInterface * * @return $this * @abstract + * @api */ public function processLogout(); @@ -31,6 +33,7 @@ interface StorageInterface * * @return bool * @abstract + * @api */ public function isLoggedIn(); @@ -39,6 +42,7 @@ interface StorageInterface * * @return void * @abstract + * @api */ public function prolong(); } diff --git a/app/code/Magento/Backend/Model/Widget/Grid/Row/GeneratorInterface.php b/app/code/Magento/Backend/Model/Widget/Grid/Row/GeneratorInterface.php index 025588f213d0fedbaaf942f19a8db380bfeb2254..7f1834f54d3c77013b584f90b1cad3c16c3491ee 100644 --- a/app/code/Magento/Backend/Model/Widget/Grid/Row/GeneratorInterface.php +++ b/app/code/Magento/Backend/Model/Widget/Grid/Row/GeneratorInterface.php @@ -12,6 +12,7 @@ interface GeneratorInterface /** * @param \Magento\Framework\Object $item * @return string + * @api */ public function getUrl($item); } diff --git a/app/code/Magento/Backend/Model/Widget/Grid/TotalsInterface.php b/app/code/Magento/Backend/Model/Widget/Grid/TotalsInterface.php index e0c07eb6c7e5eb293ccfe710de6e0ef27e0b0cb4..b7ec0d6a034e9f466c4e6e693d6fd1b136ce07de 100644 --- a/app/code/Magento/Backend/Model/Widget/Grid/TotalsInterface.php +++ b/app/code/Magento/Backend/Model/Widget/Grid/TotalsInterface.php @@ -13,6 +13,7 @@ interface TotalsInterface * @abstract * @param \Magento\Framework\Data\Collection $collection * @return \Magento\Framework\Object + * @api */ public function countTotals($collection); } diff --git a/app/code/Magento/Bundle/Model/Product/OptionList.php b/app/code/Magento/Bundle/Model/Product/OptionList.php index c90d6347e6015a036f1e20493b94197dad3e7803..7e26305be731befff28e27aceb55ee2ae06c06a3 100644 --- a/app/code/Magento/Bundle/Model/Product/OptionList.php +++ b/app/code/Magento/Bundle/Model/Product/OptionList.php @@ -28,22 +28,30 @@ class OptionList */ protected $dataObjectHelper; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $extensionAttributesJoinProcessor; + /** * @param Type $type * @param \Magento\Bundle\Api\Data\OptionInterfaceFactory $optionFactory * @param LinksList $linkList * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor */ public function __construct( \Magento\Bundle\Model\Product\Type $type, \Magento\Bundle\Api\Data\OptionInterfaceFactory $optionFactory, \Magento\Bundle\Model\Product\LinksList $linkList, - \Magento\Framework\Api\DataObjectHelper $dataObjectHelper + \Magento\Framework\Api\DataObjectHelper $dataObjectHelper, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->type = $type; $this->optionFactory = $optionFactory; $this->linkList = $linkList; $this->dataObjectHelper = $dataObjectHelper; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; } /** @@ -53,6 +61,7 @@ class OptionList public function getItems(\Magento\Catalog\Api\Data\ProductInterface $product) { $optionCollection = $this->type->getOptionsCollection($product); + $this->extensionAttributesJoinProcessor->process($optionCollection); $optionList = []; /** @var \Magento\Bundle\Model\Option $option */ foreach ($optionCollection as $option) { diff --git a/app/code/Magento/Bundle/Test/Unit/Model/Product/OptionListTest.php b/app/code/Magento/Bundle/Test/Unit/Model/Product/OptionListTest.php index 4827a7efd2fdad4bd1fd48897d1fa984e1dcf741..855c15bc06fd09d4d44513b445c0f4616cf94b02 100644 --- a/app/code/Magento/Bundle/Test/Unit/Model/Product/OptionListTest.php +++ b/app/code/Magento/Bundle/Test/Unit/Model/Product/OptionListTest.php @@ -33,6 +33,16 @@ class OptionListTest extends \PHPUnit_Framework_TestCase */ protected $dataObjectHelperMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $extensionAttributesFactoryMock; + + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + protected $objectManager; + protected function setUp() { $this->typeMock = $this->getMock('\Magento\Bundle\Model\Product\Type', [], [], '', false); @@ -43,15 +53,26 @@ class OptionListTest extends \PHPUnit_Framework_TestCase '', false ); - $this->dataObjectHelperMock = $this->getMockBuilder('\Magento\Framework\Api\DataObjectHelper') - ->disableOriginalConstructor() - ->getMock(); + $this->dataObjectHelperMock = $this->getMock('\Magento\Framework\Api\DataObjectHelper', [], [], '', false); $this->linkListMock = $this->getMock('\Magento\Bundle\Model\Product\LinksList', [], [], '', false); - $this->model = new \Magento\Bundle\Model\Product\OptionList( - $this->typeMock, - $this->optionFactoryMock, - $this->linkListMock, - $this->dataObjectHelperMock + $this->extensionAttributesFactoryMock = $this->getMock( + '\Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface', + [], + [], + '', + false + ); + + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->model = $this->objectManager->getObject( + 'Magento\Bundle\Model\Product\OptionList', + [ + 'type' => $this->typeMock, + 'optionFactory' => $this->optionFactoryMock, + 'linkList' => $this->linkListMock, + 'dataObjectHelper' => $this->dataObjectHelperMock, + 'extensionAttributesJoinProcessor' => $this->extensionAttributesFactoryMock + ] ); } @@ -71,8 +92,7 @@ class OptionListTest extends \PHPUnit_Framework_TestCase '', false ); - $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $optionsCollMock = $objectManager->getCollectionMock( + $optionsCollMock = $this->objectManager->getCollectionMock( 'Magento\Bundle\Model\Resource\Option\Collection', [$optionMock] ); diff --git a/app/code/Magento/Catalog/Api/Data/ProductCustomOptionInterface.php b/app/code/Magento/Catalog/Api/Data/ProductCustomOptionInterface.php index ee11f877129b632df5d709832841a37b075c89a7..f57491b950d3388c86c4e3774ff05cd7a22c9e3a 100644 --- a/app/code/Magento/Catalog/Api/Data/ProductCustomOptionInterface.php +++ b/app/code/Magento/Catalog/Api/Data/ProductCustomOptionInterface.php @@ -9,7 +9,7 @@ namespace Magento\Catalog\Api\Data; /** * @api */ -interface ProductCustomOptionInterface +interface ProductCustomOptionInterface extends \Magento\Framework\Api\ExtensibleDataInterface { /** * Get product SKU @@ -201,4 +201,21 @@ interface ProductCustomOptionInterface * @return $this */ public function setValues(array $values = null); + + /** + * Retrieve existing extension attributes object or create a new one. + * + * @return \Magento\Catalog\Api\Data\ProductCustomOptionExtensionInterface|null + */ + public function getExtensionAttributes(); + + /** + * Set an extension attributes object. + * + * @param \Magento\Catalog\Api\Data\ProductCustomOptionExtensionInterface $extensionAttributes + * @return $this + */ + public function setExtensionAttributes( + \Magento\Catalog\Api\Data\ProductCustomOptionExtensionInterface $extensionAttributes + ); } diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php index 32ad8cfb390d3bc95efb7b381b03fafaee0c2613..11ae8402ce6fb2e925b27218d953f3399ad756ce 100644 --- a/app/code/Magento/Catalog/Model/Product.php +++ b/app/code/Magento/Catalog/Model/Product.php @@ -317,6 +317,11 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements 'group_price', ]; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $joinProcessor; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -351,6 +356,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements * @param \Magento\Catalog\Api\Data\ProductLinkExtensionFactory $productLinkExtensionFactory * @param \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory $mediaGalleryEntryFactory * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor * @param array $data * * @SuppressWarnings(PHPMD.ExcessiveParameterList) @@ -389,6 +395,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements \Magento\Catalog\Api\Data\ProductLinkExtensionFactory $productLinkExtensionFactory, \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory $mediaGalleryEntryFactory, \Magento\Framework\Api\DataObjectHelper $dataObjectHelper, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor, array $data = [] ) { $this->metadataService = $metadataService; @@ -417,6 +424,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements $this->productLinkExtensionFactory = $productLinkExtensionFactory; $this->mediaGalleryEntryFactory = $mediaGalleryEntryFactory; $this->dataObjectHelper = $dataObjectHelper; + $this->joinProcessor = $joinProcessor; parent::__construct( $context, $registry, @@ -1961,7 +1969,9 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements public function getOptions() { if (empty($this->_options) && $this->getHasOptions() && !$this->optionsInitialized) { - foreach ($this->getProductOptionsCollection() as $option) { + $collection = $this->getProductOptionsCollection(); + $this->joinProcessor->process($collection); + foreach ($collection as $option) { $option->setProduct($this); $this->addOption($option); } diff --git a/app/code/Magento/Catalog/Model/Product/Option.php b/app/code/Magento/Catalog/Model/Product/Option.php index 8c5d3d25675d9f0b9b7f05df691d2b61334ade19..05ca2bbdf9c984250bdcfbfccd28754d7de88981 100644 --- a/app/code/Magento/Catalog/Model/Product/Option.php +++ b/app/code/Magento/Catalog/Model/Product/Option.php @@ -12,7 +12,6 @@ use Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface; use Magento\Catalog\Model\Product; use Magento\Catalog\Model\Resource\Product\Option\Value\Collection; use Magento\Catalog\Pricing\Price\BasePrice; -use Magento\Framework\Model\AbstractModel; use Magento\Framework\Exception\LocalizedException; /** @@ -26,7 +25,8 @@ use Magento\Framework\Exception\LocalizedException; * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.ExcessivePublicCount) */ -class Option extends AbstractModel implements \Magento\Catalog\Api\Data\ProductCustomOptionInterface +class Option extends \Magento\Framework\Model\AbstractExtensibleModel + implements \Magento\Catalog\Api\Data\ProductCustomOptionInterface { const OPTION_GROUP_TEXT = 'text'; @@ -116,6 +116,8 @@ class Option extends AbstractModel implements \Magento\Catalog\Api\Data\ProductC /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry + * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory + * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory * @param Option\Value $productOptionValue * @param Option\Type\Factory $optionFactory * @param \Magento\Framework\Stdlib\String $string @@ -128,6 +130,8 @@ class Option extends AbstractModel implements \Magento\Catalog\Api\Data\ProductC public function __construct( \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, + \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory, + \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory, Option\Value $productOptionValue, \Magento\Catalog\Model\Product\Option\Type\Factory $optionFactory, \Magento\Framework\Stdlib\String $string, @@ -143,6 +147,8 @@ class Option extends AbstractModel implements \Magento\Catalog\Api\Data\ProductC parent::__construct( $context, $registry, + $extensionFactory, + $customAttributeFactory, $resource, $resourceCollection, $data @@ -406,7 +412,7 @@ class Option extends AbstractModel implements \Magento\Catalog\Api\Data\ProductC } /** - * @return AbstractModel + * @return \Magento\Framework\Model\AbstractModel * @throws \Magento\Framework\Exception\LocalizedException */ public function afterSave() @@ -845,5 +851,27 @@ class Option extends AbstractModel implements \Magento\Catalog\Api\Data\ProductC $this->_values = $values; return $this; } + + /** + * {@inheritdoc} + * + * @return \Magento\Catalog\Api\Data\ProductCustomOptionExtensionInterface|null + */ + public function getExtensionAttributes() + { + return $this->_getExtensionAttributes(); + } + + /** + * {@inheritdoc} + * + * @param \Magento\Catalog\Api\Data\ProductCustomOptionExtensionInterface $extensionAttributes + * @return $this + */ + public function setExtensionAttributes( + \Magento\Catalog\Api\Data\ProductCustomOptionExtensionInterface $extensionAttributes + ) { + return $this->_setExtensionAttributes($extensionAttributes); + } //@codeCoverageIgnoreEnd } diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php index 79f26720fff4dd1adf6a8d4b5304e36804920174..33ef608575c92d502a064b88b6605b9cd235ed87 100644 --- a/app/code/Magento/Catalog/Model/ProductRepository.php +++ b/app/code/Magento/Catalog/Model/ProductRepository.php @@ -11,7 +11,6 @@ use Magento\Catalog\Model\Product\Gallery\MimeTypeExtensionMap; use Magento\Catalog\Model\Resource\Product\Collection; use Magento\Framework\Api\Data\ImageContentInterface; use Magento\Framework\Api\Data\ImageContentInterfaceFactory; -use Magento\Framework\Api\ExtensionAttributesFactory; use Magento\Framework\Api\ImageContentValidatorInterface; use Magento\Framework\Api\ImageProcessorInterface; use Magento\Framework\Api\SearchCriteriaInterface; @@ -137,9 +136,9 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa protected $imageProcessor; /** - * @var ExtensionAttributesFactory + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface */ - protected $extensionAttributesFactory; + protected $extensionAttributesJoinProcessor; /** * @param ProductFactory $productFactory @@ -149,20 +148,20 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository * @param Resource\Product $resourceModel - * @param \Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $linkInitializer - * @param \Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider - * @param \Magento\Store\Model\StoreManagerInterface $storeManager , + * @param Product\Initialization\Helper\ProductLinks $linkInitializer + * @param Product\LinkTypeProvider $linkTypeProvider + * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Framework\Api\FilterBuilder $filterBuilder * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataServiceInterface * @param \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter - * @param \Magento\Eav\Model\Config $eavConfig - * @param \Magento\Catalog\Model\Product\Option\Converter $optionConverter + * @param Product\Option\Converter $optionConverter * @param \Magento\Framework\Filesystem $fileSystem * @param ImageContentValidatorInterface $contentValidator * @param ImageContentInterfaceFactory $contentFactory * @param MimeTypeExtensionMap $mimeTypeExtensionMap + * @param \Magento\Eav\Model\Config $eavConfig * @param ImageProcessorInterface $imageProcessor - * @param ExtensionAttributesFactory $extensionAttributesFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -186,7 +185,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa MimeTypeExtensionMap $mimeTypeExtensionMap, \Magento\Eav\Model\Config $eavConfig, ImageProcessorInterface $imageProcessor, - ExtensionAttributesFactory $extensionAttributesFactory + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->productFactory = $productFactory; $this->collectionFactory = $collectionFactory; @@ -208,7 +207,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa $this->mimeTypeExtensionMap = $mimeTypeExtensionMap; $this->eavConfig = $eavConfig; $this->imageProcessor = $imageProcessor; - $this->extensionAttributesFactory = $extensionAttributesFactory; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; } /** @@ -649,6 +648,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa { /** @var \Magento\Catalog\Model\Resource\Product\Collection $collection */ $collection = $this->collectionFactory->create(); + $this->extensionAttributesJoinProcessor->process($collection); $defaultAttributeSetId = $this->eavConfig ->getEntityType(\Magento\Catalog\Api\Data\ProductAttributeInterface::ENTITY_TYPE_CODE) ->getDefaultAttributeSetId(); @@ -681,8 +681,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa } $collection->setCurPage($searchCriteria->getCurrentPage()); $collection->setPageSize($searchCriteria->getPageSize()); - $productDataClass = 'Magento\Catalog\Model\Product'; - $this->extensionAttributesFactory->process($collection, $productDataClass); $collection->load(); $searchResult = $this->searchResultsFactory->create(); diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php index 545c8d990ed9580c42850b9aa45fdd9ee16f8951..da842214bbd80eaab75333079478b7f7b7e01352 100755 --- a/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php @@ -1277,7 +1277,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase public function testGetOptions() { - $optionInstanceMock = $this->getMockBuilder('\Magento\Catalog\Model\Product\Option') + $optionInstanceMock = $this->getMockBuilder('Magento\Catalog\Model\Product\Option') + ->disableOriginalConstructor() + ->getMock(); + $joinProcessorMock = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface') ->disableOriginalConstructor() ->getMock(); @@ -1286,6 +1289,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase 'Magento\Catalog\Model\Product', [ 'catalogProductOption' => $optionInstanceMock, + 'joinProcessor' => $joinProcessorMock ] ); $productModel->setHasOptions(true); @@ -1315,12 +1319,19 @@ class ProductTest extends \PHPUnit_Framework_TestCase ->method('setProduct') ->with($productModel) ->willReturn($option1Id); - $options = [$optionMock1, $optionMock2]; + $optionColl = $this->objectManagerHelper->getCollectionMock( + 'Magento\Catalog\Model\Resource\Product\Option\Collection', + [$optionMock1, $optionMock2] + ); $optionInstanceMock->expects($this->once()) ->method('getProductOptionCollection') ->with($productModel) - ->willReturn($options); + ->willReturn($optionColl); + + $joinProcessorMock->expects($this->once()) + ->method('process') + ->with($this->isInstanceOf('Magento\Catalog\Model\Resource\Product\Option\Collection')); $expectedOptions = [ $option1Id => $optionMock1, diff --git a/app/code/Magento/CheckoutAgreements/Api/Data/AgreementInterface.php b/app/code/Magento/CheckoutAgreements/Api/Data/AgreementInterface.php index 90a67c71146c56b849a550bcb75f4b0cc1a5bd9e..299e027ac248a70210d49d65b400d0f7a6fa7d14 100644 --- a/app/code/Magento/CheckoutAgreements/Api/Data/AgreementInterface.php +++ b/app/code/Magento/CheckoutAgreements/Api/Data/AgreementInterface.php @@ -5,7 +5,7 @@ */ namespace Magento\CheckoutAgreements\Api\Data; -interface AgreementInterface +interface AgreementInterface extends \Magento\Framework\Api\ExtensibleDataInterface { /**#@+ * Constants for keys of data array. Identical to the name of the getter in snake case @@ -128,4 +128,21 @@ interface AgreementInterface * @return $this */ public function setIsHtml($isHtml); + + /** + * Retrieve existing extension attributes object or create a new one. + * + * @return \Magento\CheckoutAgreements\Api\Data\AgreementExtensionInterface|null + */ + public function getExtensionAttributes(); + + /** + * Set an extension attributes object. + * + * @param \Magento\CheckoutAgreements\Api\Data\AgreementExtensionInterface $extensionAttributes + * @return $this + */ + public function setExtensionAttributes( + \Magento\CheckoutAgreements\Api\Data\AgreementExtensionInterface $extensionAttributes + ); } diff --git a/app/code/Magento/CheckoutAgreements/Model/Agreement.php b/app/code/Magento/CheckoutAgreements/Model/Agreement.php index 6f951c12d5b629bc304cb0d80933030654598d1b..98b1b36b153c100955c8d7d4dd71b1196f629fcd 100644 --- a/app/code/Magento/CheckoutAgreements/Model/Agreement.php +++ b/app/code/Magento/CheckoutAgreements/Model/Agreement.php @@ -8,7 +8,7 @@ namespace Magento\CheckoutAgreements\Model; use Magento\CheckoutAgreements\Api\Data\AgreementInterface; use Magento\Framework\Model\AbstractModel; -class Agreement extends AbstractModel implements AgreementInterface +class Agreement extends \Magento\Framework\Model\AbstractExtensibleModel implements AgreementInterface { /** * Allowed CSS units for height field @@ -176,5 +176,27 @@ class Agreement extends AbstractModel implements AgreementInterface { return $this->setData(self::IS_HTML, $isHtml); } + + /** + * {@inheritdoc} + * + * @return \Magento\CheckoutAgreements\Api\Data\AgreementExtensionInterface|null + */ + public function getExtensionAttributes() + { + return $this->_getExtensionAttributes(); + } + + /** + * {@inheritdoc} + * + * @param \Magento\CheckoutAgreements\Api\Data\AgreementExtensionInterface $extensionAttributes + * @return $this + */ + public function setExtensionAttributes( + \Magento\CheckoutAgreements\Api\Data\AgreementExtensionInterface $extensionAttributes + ) { + return $this->_setExtensionAttributes($extensionAttributes); + } //@codeCoverageIgnoreEnd } diff --git a/app/code/Magento/CheckoutAgreements/Model/CheckoutAgreementsRepository.php b/app/code/Magento/CheckoutAgreements/Model/CheckoutAgreementsRepository.php index eae3f09c667a9f825270ce9d87c23d8065ec788c..845bb2a9d2c742f1232e9a5ebfeb23ec9b85780f 100644 --- a/app/code/Magento/CheckoutAgreements/Model/CheckoutAgreementsRepository.php +++ b/app/code/Magento/CheckoutAgreements/Model/CheckoutAgreementsRepository.php @@ -10,6 +10,7 @@ namespace Magento\CheckoutAgreements\Model; use Magento\CheckoutAgreements\Model\Resource\Agreement\CollectionFactory as AgreementCollectionFactory; use Magento\CheckoutAgreements\Model\Resource\Agreement\Collection as AgreementCollection; +use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Store\Model\StoreManagerInterface; use Magento\Store\Model\ScopeInterface; @@ -56,6 +57,11 @@ class CheckoutAgreementsRepository implements CheckoutAgreementsRepositoryInterf */ private $agreementFactory; + /** + * @var JoinProcessorInterface + */ + private $extensionAttributesJoinProcessor; + /** * Constructs a checkout agreement data object. * @@ -64,19 +70,22 @@ class CheckoutAgreementsRepository implements CheckoutAgreementsRepositoryInterf * @param ScopeConfigInterface $scopeConfig Scope config. * @param AgreementResource $agreementResource * @param AgreementFactory $agreementFactory + * @param JoinProcessorInterface $extensionAttributesJoinProcessor */ public function __construct( AgreementCollectionFactory $collectionFactory, StoreManagerInterface $storeManager, ScopeConfigInterface $scopeConfig, AgreementResource $agreementResource, - AgreementFactory $agreementFactory + AgreementFactory $agreementFactory, + JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->collectionFactory = $collectionFactory; $this->storeManager = $storeManager; $this->scopeConfig = $scopeConfig; $this->resourceModel = $agreementResource; $this->agreementFactory = $agreementFactory; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; } /** @@ -92,9 +101,9 @@ class CheckoutAgreementsRepository implements CheckoutAgreementsRepositoryInterf $storeId = $this->storeManager->getStore()->getId(); /** @var $agreementCollection AgreementCollection */ $agreementCollection = $this->collectionFactory->create(); + $this->extensionAttributesJoinProcessor->process($agreementCollection); $agreementCollection->addStoreFilter($storeId); $agreementCollection->addFieldToFilter('is_active', 1); - $agreementDataObjects = []; foreach ($agreementCollection as $agreement) { $agreementDataObjects[] = $agreement; diff --git a/app/code/Magento/CheckoutAgreements/Test/Unit/Model/CheckoutAgreementsRepositoryTest.php b/app/code/Magento/CheckoutAgreements/Test/Unit/Model/CheckoutAgreementsRepositoryTest.php index 9d27e3e471e23e8825b6b557635e5ebd59d565cb..04543777e3470676e9406bf57f32e91fea02dfab 100644 --- a/app/code/Magento/CheckoutAgreements/Test/Unit/Model/CheckoutAgreementsRepositoryTest.php +++ b/app/code/Magento/CheckoutAgreements/Test/Unit/Model/CheckoutAgreementsRepositoryTest.php @@ -56,6 +56,11 @@ class CheckoutAgreementsRepositoryTest extends \PHPUnit_Framework_TestCase */ private $storeMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $extensionAttributesJoinProcessorMock; + protected function setUp() { $this->objectManager = new ObjectManager($this); @@ -81,17 +86,28 @@ class CheckoutAgreementsRepositoryTest extends \PHPUnit_Framework_TestCase $this->agreementMock = $this->getMock('\Magento\CheckoutAgreements\Model\Agreement', $methods, [], '', false); $this->storeMock = $this->getMock('Magento\Store\Model\Store', [], [], '', false); + $this->extensionAttributesJoinProcessorMock = $this->getMock( + '\Magento\Framework\Api\ExtensionAttribute\JoinProcessor', + ['process'], + [], + '', + false + ); + $this->model = new \Magento\CheckoutAgreements\Model\CheckoutAgreementsRepository( $this->factoryMock, $this->storeManagerMock, $this->scopeConfigMock, $this->resourceMock, - $this->agrFactoryMock + $this->agrFactoryMock, + $this->extensionAttributesJoinProcessorMock ); } public function testGetListReturnsEmptyListIfCheckoutAgreementsAreDisabledOnFrontend() { + $this->extensionAttributesJoinProcessorMock->expects($this->never()) + ->method('process'); $this->scopeConfigMock->expects($this->once()) ->method('isSetFlag') ->with('checkout/options/enable_agreements', ScopeInterface::SCOPE_STORE, null) @@ -102,6 +118,10 @@ class CheckoutAgreementsRepositoryTest extends \PHPUnit_Framework_TestCase public function testGetListReturnsTheListOfActiveCheckoutAgreements() { + $this->extensionAttributesJoinProcessorMock->expects($this->once()) + ->method('process') + ->with($this->isInstanceOf('Magento\CheckoutAgreements\Model\Resource\Agreement\Collection')); + $this->scopeConfigMock->expects($this->once()) ->method('isSetFlag') ->with('checkout/options/enable_agreements', ScopeInterface::SCOPE_STORE, null) diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php index c1fb0b41ef427e758954ee9728084e67eb9c5bed..20d861e695135aabf4c445eea2d4bfdd0eaa0680 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php @@ -158,6 +158,11 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType */ protected $jsonHelper; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $extensionAttributesJoinProcessor; + /** * @codingStandardsIgnoreStart/End * @@ -181,6 +186,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType * @param \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable $catalogProductTypeConfigurable * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param \Magento\Catalog\Model\ProductFactory $productFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -205,7 +211,8 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable $catalogProductTypeConfigurable, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\CatalogInventory\Api\StockConfigurationInterface $stockConfiguration, - \Magento\Catalog\Model\ProductFactory $productFactory + \Magento\Catalog\Model\ProductFactory $productFactory, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->_typeConfigurableFactory = $typeConfigurableFactory; $this->_entityFactory = $entityFactory; @@ -218,6 +225,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType $this->_scopeConfig = $scopeConfig; $this->stockConfiguration = $stockConfiguration; $this->jsonHelper = $jsonHelper; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; parent::__construct( $catalogProductOption, $eavConfig, @@ -370,7 +378,9 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType ['group' => 'CONFIGURABLE', 'method' => __METHOD__] ); if (!$product->hasData($this->_configurableAttributes)) { - $configurableAttributes = $this->getConfigurableAttributeCollection($product)->orderByPosition()->load(); + $configurableAttributes = $this->getConfigurableAttributeCollection($product); + $this->extensionAttributesJoinProcessor->process($configurableAttributes); + $configurableAttributes->orderByPosition()->load(); $product->setData($this->_configurableAttributes, $configurableAttributes); } \Magento\Framework\Profiler::stop('CONFIGURABLE:' . __METHOD__); diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php index 4ca090adef44b5e3786bd066067c7c6aaa03ac53..a4fcb50da0362d438aa999dc67a57fd7c75ddad9 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php @@ -83,6 +83,11 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase */ protected $_objectHelper; + /** + * @var JoinProcessorInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $extensionAttributesJoinProcessorMock; + /** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ @@ -169,6 +174,14 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase '', false ); + $this->extensionAttributesJoinProcessorMock = $this->getMock( + 'Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface', + [], + [], + '', + false + ); + $this->_model = $this->_objectHelper->getObject( 'Magento\ConfigurableProduct\Model\Product\Type\Configurable', [ @@ -186,7 +199,8 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase 'filesystem' => $filesystem, 'coreRegistry' => $coreRegistry, 'logger' => $logger, - 'stockConfiguration' => $this->_stockConfiguration + 'stockConfiguration' => $this->_stockConfiguration, + 'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock ] ); } @@ -202,9 +216,20 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase public function testSave() { $product = $this->getMockBuilder('\Magento\Catalog\Model\Product') - ->setMethods(['getIsDuplicate', 'dataHasChangedFor', 'getConfigurableAttributesData', 'getStoreId', - 'getId', 'getData', 'hasData', 'getAssociatedProductIds', '__wakeup', '__sleep', - ])->disableOriginalConstructor() + ->setMethods( + [ + 'getIsDuplicate', + 'dataHasChangedFor', + 'getConfigurableAttributesData', + 'getStoreId', + 'getId', + 'getData', + 'hasData', + 'getAssociatedProductIds', + '__wakeup', + '__sleep', + ] + )->disableOriginalConstructor() ->getMock(); $product->expects($this->any())->method('dataHasChangedFor')->will($this->returnValue('false')); $product->expects($this->any())->method('getConfigurableAttributesData') @@ -297,9 +322,19 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase $this->_attributeCollectionFactory->expects($this->any())->method('create') ->will($this->returnValue($attributeCollection)); $product = $this->getMockBuilder('\Magento\Catalog\Model\Product') - ->setMethods(['dataHasChangedFor', 'getConfigurableAttributesData', 'getStoreId', - 'getId', 'getData', 'hasData', 'getAssociatedProductIds', '__wakeup', '__sleep', - ])->disableOriginalConstructor() + ->setMethods( + [ + 'dataHasChangedFor', + 'getConfigurableAttributesData', + 'getStoreId', + 'getId', + 'getData', + 'hasData', + 'getAssociatedProductIds', + '__wakeup', + '__sleep', + ] + )->disableOriginalConstructor() ->getMock(); $product->expects($this->any())->method('getConfigurableAttributesData') ->will($this->returnValue($this->attributeData)); @@ -307,18 +342,28 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase $product->expects($this->any())->method('getId')->will($this->returnValue(1)); $product->expects($this->any())->method('getAssociatedProductIds')->will($this->returnValue([2])); $product->expects($this->any())->method('hasData') - ->will($this->returnValueMap([ - ['_cache_instance_used_product_attribute_ids', 1], - ['_cache_instance_products', 0], - ['_cache_instance_configurable_attributes', 1], - ])); + ->will( + $this->returnValueMap( + [ + ['_cache_instance_used_product_attribute_ids', 1], + ['_cache_instance_products', 0], + ['_cache_instance_configurable_attributes', 1], + ] + ) + ); $product->expects($this->any())->method('getData') ->will($this->returnValue(1)); $productCollection = $this->getMockBuilder( 'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\Collection' )->setMethods( - ['setFlag', 'setProductFilter', 'addStoreFilter', 'addAttributeToSelect', 'addFilterByRequiredOptions', - 'setStoreId', ] + [ + 'setFlag', + 'setProductFilter', + 'addStoreFilter', + 'addAttributeToSelect', + 'addFilterByRequiredOptions', + 'setStoreId', + ] )->disableOriginalConstructor() ->getMock(); $productCollection->expects($this->any())->method('addAttributeToSelect')->will($this->returnSelf()); @@ -385,13 +430,21 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase ->getMock(); $product->expects($this->any())->method('getStoreId')->will($this->returnValue($productStore)); $product->expects($this->any())->method('hasData') - ->will($this->returnValueMap([ - ['_cache_instance_configurable_attributes', 1], - ])); + ->will( + $this->returnValueMap( + [ + ['_cache_instance_configurable_attributes', 1], + ] + ) + ); $product->expects($this->any())->method('getData') - ->will($this->returnValueMap([ - ['_cache_instance_configurable_attributes', null, [$attribute]], - ])); + ->will( + $this->returnValueMap( + [ + ['_cache_instance_configurable_attributes', null, [$attribute]], + ] + ) + ); $result = $this->_model->getConfigurableAttributesAsArray($product); $this->assertCount(1, $result); @@ -408,6 +461,41 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase ]; } + public function testGetConfigurableAttributes() + { + $expectedData = [1]; + $configurableAttributes = '_cache_instance_configurable_attributes'; + + /** @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject $product */ + $product = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->setMethods(['getData', 'hasData', 'setData']) + ->disableOriginalConstructor() + ->getMock(); + $product->expects($this->once())->method('hasData')->with($configurableAttributes)->willReturn(false); + $product->expects($this->once())->method('setData')->willReturnSelf(); + $product->expects($this->once())->method('getData')->with($configurableAttributes)->willReturn($expectedData); + + $attributeCollection = $this->getMockBuilder( + 'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection' + ) + ->setMethods(['setProductFilter', 'orderByPosition', 'load']) + ->disableOriginalConstructor() + ->getMock(); + $attributeCollection->expects($this->any())->method('setProductFilter')->will($this->returnSelf()); + $attributeCollection->expects($this->any())->method('orderByPosition')->will($this->returnSelf()); + $this->_attributeCollectionFactory->expects($this->any())->method('create')->willReturn($attributeCollection); + + $this->extensionAttributesJoinProcessorMock->expects($this->once()) + ->method('process') + ->with( + $this->isInstanceOf( + 'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection' + ) + ); + + $this->assertEquals($expectedData, $this->_model->getConfigurableAttributes($product)); + } + public function testResetConfigurableAttributes() { $product = $this->getMockBuilder('\Magento\Catalog\Model\Product') diff --git a/app/code/Magento/Customer/Model/Resource/AddressRepository.php b/app/code/Magento/Customer/Model/Resource/AddressRepository.php index 1a97ba112fbcfc322511f704150bbf282b7327a5..833cf68fd70b8250e0e0a717d349f43b045620ac 100644 --- a/app/code/Magento/Customer/Model/Resource/AddressRepository.php +++ b/app/code/Magento/Customer/Model/Resource/AddressRepository.php @@ -56,6 +56,11 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf */ protected $addressCollectionFactory; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $extensionAttributesJoinProcessor; + /** * @param \Magento\Customer\Model\AddressFactory $addressFactory * @param \Magento\Customer\Model\AddressRegistry $addressRegistry @@ -64,6 +69,7 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf * @param \Magento\Directory\Helper\Data $directoryData * @param \Magento\Customer\Api\Data\AddressSearchResultsInterfaceFactory $addressSearchResultsFactory * @param \Magento\Customer\Model\Resource\Address\CollectionFactory $addressCollectionFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor */ public function __construct( \Magento\Customer\Model\AddressFactory $addressFactory, @@ -72,7 +78,8 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf \Magento\Customer\Model\Resource\Address $addressResourceModel, \Magento\Directory\Helper\Data $directoryData, \Magento\Customer\Api\Data\AddressSearchResultsInterfaceFactory $addressSearchResultsFactory, - \Magento\Customer\Model\Resource\Address\CollectionFactory $addressCollectionFactory + \Magento\Customer\Model\Resource\Address\CollectionFactory $addressCollectionFactory, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->addressFactory = $addressFactory; $this->addressRegistry = $addressRegistry; @@ -81,6 +88,7 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf $this->directoryData = $directoryData; $this->addressSearchResultsFactory = $addressSearchResultsFactory; $this->addressCollectionFactory = $addressCollectionFactory; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; } /** @@ -146,6 +154,7 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf /** @var Collection $collection */ $collection = $this->addressCollectionFactory->create(); + $this->extensionAttributesJoinProcessor->process($collection, 'Magento\Customer\Api\Data\AddressInterface'); // Add filters from root filter group to the collection foreach ($searchCriteria->getFilterGroups() as $group) { $this->addFilterGroupToCollection($group, $collection); diff --git a/app/code/Magento/Customer/Model/Resource/CustomerRepository.php b/app/code/Magento/Customer/Model/Resource/CustomerRepository.php index b20ce2bb0d5994139764b85e4406050b39c05a46..bd3064d2f9317d00d62c974f03a899588b4ff180 100644 --- a/app/code/Magento/Customer/Model/Resource/CustomerRepository.php +++ b/app/code/Magento/Customer/Model/Resource/CustomerRepository.php @@ -13,7 +13,6 @@ use Magento\Framework\Api\ImageProcessorInterface; use Magento\Framework\Api\SearchCriteriaInterface; use Magento\Framework\Exception\InputException; use Magento\Framework\Exception\NoSuchEntityException; -use Magento\Framework\Api\ExtensionAttributesFactory; /** * Customer repository. @@ -82,9 +81,9 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte protected $imageProcessor; /** - * @var ExtensionAttributesFactory + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface */ - protected $extensionAttributesFactory; + protected $extensionAttributesJoinProcessor; /** * @param \Magento\Customer\Model\CustomerFactory $customerFactory @@ -99,7 +98,7 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte * @param \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter * @param DataObjectHelper $dataObjectHelper * @param ImageProcessorInterface $imageProcessor - * @param ExtensionAttributesFactory $extensionAttributesFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -115,7 +114,7 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter, DataObjectHelper $dataObjectHelper, ImageProcessorInterface $imageProcessor, - ExtensionAttributesFactory $extensionAttributesFactory + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->customerFactory = $customerFactory; $this->customerSecureFactory = $customerSecureFactory; @@ -129,7 +128,7 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte $this->extensibleDataObjectConverter = $extensibleDataObjectConverter; $this->dataObjectHelper = $dataObjectHelper; $this->imageProcessor = $imageProcessor; - $this->extensionAttributesFactory = $extensionAttributesFactory; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; } /** @@ -250,6 +249,7 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte $searchResults->setSearchCriteria($searchCriteria); /** @var \Magento\Customer\Model\Resource\Customer\Collection $collection */ $collection = $this->customerFactory->create()->getCollection(); + $this->extensionAttributesJoinProcessor->process($collection, 'Magento\Customer\Api\Data\CustomerInterface'); // This is needed to make sure all the attributes are properly loaded foreach ($this->customerMetadata->getAllAttributesMetadata() as $metadata) { $collection->addAttributeToSelect($metadata->getAttributeCode()); @@ -279,7 +279,6 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte } $collection->setCurPage($searchCriteria->getCurrentPage()); $collection->setPageSize($searchCriteria->getPageSize()); - $this->extensionAttributesFactory->process($collection, 'Magento\Customer\Model\Data\Customer'); $customers = []; /** @var \Magento\Customer\Model\Customer $customerModel */ foreach ($collection as $customerModel) { diff --git a/app/code/Magento/Customer/Model/Resource/GroupRepository.php b/app/code/Magento/Customer/Model/Resource/GroupRepository.php index fe0d52ca471ef7a45f563a5529657d4a189a2b03..2b87df95a55bd9454e9c51bf81f013f535335c3c 100644 --- a/app/code/Magento/Customer/Model/Resource/GroupRepository.php +++ b/app/code/Magento/Customer/Model/Resource/GroupRepository.php @@ -14,6 +14,8 @@ use Magento\Framework\Exception\InputException; use Magento\Framework\Exception\State\InvalidTransitionException; use Magento\Tax\Api\Data\TaxClassInterface; use Magento\Tax\Api\TaxClassManagementInterface; +use Magento\Framework\Api\ExtensibleDataInterface; +use Magento\Customer\Api\Data\GroupExtensionInterface; /** * Customer group CRUD class @@ -62,6 +64,11 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface */ private $taxClassRepository; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $extensionAttributesJoinProcessor; + /** * @param \Magento\Customer\Model\GroupRegistry $groupRegistry * @param \Magento\Customer\Model\GroupFactory $groupFactory @@ -70,6 +77,7 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface * @param \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor * @param \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory $searchResultsFactory * @param \Magento\Tax\Api\TaxClassRepositoryInterface $taxClassRepositoryInterface + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor */ public function __construct( \Magento\Customer\Model\GroupRegistry $groupRegistry, @@ -78,7 +86,8 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface \Magento\Customer\Model\Resource\Group $groupResourceModel, \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor, \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory $searchResultsFactory, - \Magento\Tax\Api\TaxClassRepositoryInterface $taxClassRepositoryInterface + \Magento\Tax\Api\TaxClassRepositoryInterface $taxClassRepositoryInterface, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->groupRegistry = $groupRegistry; $this->groupFactory = $groupFactory; @@ -87,6 +96,7 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface $this->dataObjectProcessor = $dataObjectProcessor; $this->searchResultsFactory = $searchResultsFactory; $this->taxClassRepository = $taxClassRepositoryInterface; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; } /** @@ -164,6 +174,8 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface /** @var \Magento\Customer\Model\Resource\Group\Collection $collection */ $collection = $this->groupFactory->create()->getCollection(); + $groupInterfaceName = 'Magento\Customer\Api\Data\GroupInterface'; + $this->extensionAttributesJoinProcessor->process($collection, $groupInterfaceName); $collection->addTaxClass(); //Add filters from root filter group to the collection @@ -171,7 +183,6 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface foreach ($searchCriteria->getFilterGroups() as $group) { $this->addFilterGroupToCollection($group, $collection); } - $searchResults->setTotalCount($collection->getSize()); $sortOrders = $searchCriteria->getSortOrders(); /** @var \Magento\Framework\Api\SortOrder $sortOrder */ if ($sortOrders) { @@ -182,6 +193,11 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface ($sortOrder->getDirection() == SearchCriteriaInterface::SORT_ASC) ? 'ASC' : 'DESC' ); } + } else { + // set a default sorting order since this method is used constantly in many + // different blocks + $field = $this->translateField('id'); + $collection->addOrder($field, 'ASC'); } $collection->setCurPage($searchCriteria->getCurrentPage()); $collection->setPageSize($searchCriteria->getPageSize()); @@ -190,13 +206,22 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface $groups = []; /** @var \Magento\Customer\Model\Group $group */ foreach ($collection as $group) { + /** @var \Magento\Customer\Api\Data\GroupInterface $groupDataObject */ $groupDataObject = $this->groupDataFactory->create() ->setId($group->getId()) ->setCode($group->getCode()) ->setTaxClassId($group->getTaxClassId()) ->setTaxClassName($group->getTaxClassName()); + $data = $group->getData(); + $data = $this->extensionAttributesJoinProcessor->extractExtensionAttributes($groupInterfaceName, $data); + if (isset($data[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]) + && ($data[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY] instanceof GroupExtensionInterface) + ) { + $groupDataObject->setExtensionAttributes($data[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]); + } $groups[] = $groupDataObject; } + $searchResults->setTotalCount($collection->getSize()); return $searchResults->setItems($groups); } diff --git a/app/code/Magento/Downloadable/Model/Product/Type.php b/app/code/Magento/Downloadable/Model/Product/Type.php index c25d6886e20abf83fa79d1274a475d7a65d611f1..e34c9bdf1b576e15bcca0db72e60b3485b1cdd62 100644 --- a/app/code/Magento/Downloadable/Model/Product/Type.php +++ b/app/code/Magento/Downloadable/Model/Product/Type.php @@ -6,6 +6,7 @@ namespace Magento\Downloadable\Model\Product; use Magento\Catalog\Api\ProductRepositoryInterface; +use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; /** * Downloadable product type model @@ -59,6 +60,11 @@ class Type extends \Magento\Catalog\Model\Product\Type\Virtual */ private $typeHandler; + /** + * @var JoinProcessorInterface + */ + private $extensionAttributesJoinProcessor; + /** * Construct * @@ -78,6 +84,7 @@ class Type extends \Magento\Catalog\Model\Product\Type\Virtual * @param \Magento\Downloadable\Model\SampleFactory $sampleFactory * @param \Magento\Downloadable\Model\LinkFactory $linkFactory * @param TypeHandler\TypeHandlerInterface $typeHandler + * @param JoinProcessorInterface $extensionAttributesJoinProcessor * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -96,7 +103,8 @@ class Type extends \Magento\Catalog\Model\Product\Type\Virtual \Magento\Downloadable\Model\Resource\Sample\CollectionFactory $samplesFactory, \Magento\Downloadable\Model\SampleFactory $sampleFactory, \Magento\Downloadable\Model\LinkFactory $linkFactory, - \Magento\Downloadable\Model\Product\TypeHandler\TypeHandlerInterface $typeHandler + \Magento\Downloadable\Model\Product\TypeHandler\TypeHandlerInterface $typeHandler, + JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->_sampleResFactory = $sampleResFactory; $this->_linkResource = $linkResource; @@ -105,6 +113,7 @@ class Type extends \Magento\Catalog\Model\Product\Type\Virtual $this->_sampleFactory = $sampleFactory; $this->_linkFactory = $linkFactory; $this->typeHandler = $typeHandler; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; parent::__construct( $catalogProductOption, $eavConfig, @@ -127,17 +136,18 @@ class Type extends \Magento\Catalog\Model\Product\Type\Virtual public function getLinks($product) { if ($product->getDownloadableLinks() === null) { - $_linkCollection = $this->_linksFactory->create()->addProductToFilter( + /** @var \Magento\Downloadable\Model\Resource\Link\Collection $linkCollection */ + $linkCollection = $this->_linksFactory->create()->addProductToFilter( $product->getId() )->addTitleToResult( $product->getStoreId() )->addPriceToResult( $product->getStore()->getWebsiteId() ); + $this->extensionAttributesJoinProcessor->process($linkCollection); $linksCollectionById = []; - foreach ($_linkCollection as $link) { + foreach ($linkCollection as $link) { /* @var \Magento\Downloadable\Model\Link $link */ - $link->setProduct($product); $linksCollectionById[$link->getId()] = $link; } @@ -203,12 +213,13 @@ class Type extends \Magento\Catalog\Model\Product\Type\Virtual public function getSamples($product) { if ($product->getDownloadableSamples() === null) { - $_sampleCollection = $this->_samplesFactory->create()->addProductToFilter( + $sampleCollection = $this->_samplesFactory->create()->addProductToFilter( $product->getId() )->addTitleToResult( $product->getStoreId() ); - $product->setDownloadableSamples($_sampleCollection); + $this->extensionAttributesJoinProcessor->process($sampleCollection); + $product->setDownloadableSamples($sampleCollection); } return $product->getDownloadableSamples(); diff --git a/app/code/Magento/Eav/Model/Attribute/GroupRepository.php b/app/code/Magento/Eav/Model/Attribute/GroupRepository.php index 5b1b7d539d930520b1c118b01f405cc07aa1c171..bfa5952bdbfc65104a21c4b4ed99b5234ab8d2d9 100644 --- a/app/code/Magento/Eav/Model/Attribute/GroupRepository.php +++ b/app/code/Magento/Eav/Model/Attribute/GroupRepository.php @@ -37,25 +37,33 @@ class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterf */ protected $searchResultsFactory; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $joinProcessor; + /** * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group $groupResource * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $groupListFactory * @param \Magento\Eav\Model\Entity\Attribute\GroupFactory $groupFactory * @param \Magento\Eav\Api\AttributeSetRepositoryInterface $setRepository * @param \Magento\Eav\Api\Data\AttributeGroupSearchResultsInterfaceFactory $searchResultsFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor */ public function __construct( \Magento\Eav\Model\Resource\Entity\Attribute\Group $groupResource, \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $groupListFactory, \Magento\Eav\Model\Entity\Attribute\GroupFactory $groupFactory, \Magento\Eav\Api\AttributeSetRepositoryInterface $setRepository, - \Magento\Eav\Api\Data\AttributeGroupSearchResultsInterfaceFactory $searchResultsFactory + \Magento\Eav\Api\Data\AttributeGroupSearchResultsInterfaceFactory $searchResultsFactory, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor ) { $this->groupResource = $groupResource; $this->groupListFactory = $groupListFactory; $this->groupFactory = $groupFactory; $this->setRepository = $setRepository; $this->searchResultsFactory = $searchResultsFactory; + $this->joinProcessor = $joinProcessor; } /** @@ -108,6 +116,7 @@ class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterf } $collection = $this->groupListFactory->create(); + $this->joinProcessor->process($collection); $collection->setAttributeSetFilter($attributeSetId); $collection->setSortOrder(); diff --git a/app/code/Magento/Eav/Model/AttributeRepository.php b/app/code/Magento/Eav/Model/AttributeRepository.php index e325fea2f4717844fc93a076076fb13731b3407a..a308bcf630f49c7302d7133a69be447378ba923d 100644 --- a/app/code/Magento/Eav/Model/AttributeRepository.php +++ b/app/code/Magento/Eav/Model/AttributeRepository.php @@ -42,25 +42,33 @@ class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterfa */ protected $attributeFactory; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $joinProcessor; + /** * @param Config $eavConfig * @param Resource\Entity\Attribute $eavResource * @param Resource\Entity\Attribute\CollectionFactory $attributeCollectionFactory * @param \Magento\Eav\Api\Data\AttributeSearchResultsInterfaceFactory $searchResultsFactory * @param Entity\AttributeFactory $attributeFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor */ public function __construct( \Magento\Eav\Model\Config $eavConfig, \Magento\Eav\Model\Resource\Entity\Attribute $eavResource, \Magento\Eav\Model\Resource\Entity\Attribute\CollectionFactory $attributeCollectionFactory, \Magento\Eav\Api\Data\AttributeSearchResultsInterfaceFactory $searchResultsFactory, - \Magento\Eav\Model\Entity\AttributeFactory $attributeFactory + \Magento\Eav\Model\Entity\AttributeFactory $attributeFactory, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor ) { $this->eavConfig = $eavConfig; $this->eavResource = $eavResource; $this->attributeCollectionFactory = $attributeCollectionFactory; $this->searchResultsFactory = $searchResultsFactory; $this->attributeFactory = $attributeFactory; + $this->joinProcessor = $joinProcessor; } /** @@ -87,6 +95,7 @@ class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterfa /** @var \Magento\Eav\Model\Resource\Entity\Attribute\Collection $attributeCollection */ $attributeCollection = $this->attributeCollectionFactory->create(); + $this->joinProcessor->process($attributeCollection); $attributeCollection->addFieldToFilter('entity_type_code', ['eq' => $entityTypeCode]); $attributeCollection->join( ['entity_type' => $attributeCollection->getTable('eav_entity_type')], diff --git a/app/code/Magento/Eav/Model/AttributeSetRepository.php b/app/code/Magento/Eav/Model/AttributeSetRepository.php index 2e0d4457eb293bc21e19fce8a9f94e19486f65f1..3cc9a46867910453e6499d82123b7afd76f9804e 100644 --- a/app/code/Magento/Eav/Model/AttributeSetRepository.php +++ b/app/code/Magento/Eav/Model/AttributeSetRepository.php @@ -46,25 +46,33 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface */ private $searchResultsFactory; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $joinProcessor; + /** * @param AttributeSetResource $attributeSetResource * @param AttributeSetFactory $attributeSetFactory * @param CollectionFactory $collectionFactory * @param Config $eavConfig * @param \Magento\Eav\Api\Data\AttributeSetSearchResultsInterfaceFactory $searchResultFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor */ public function __construct( AttributeSetResource $attributeSetResource, AttributeSetFactory $attributeSetFactory, CollectionFactory $collectionFactory, EavConfig $eavConfig, - \Magento\Eav\Api\Data\AttributeSetSearchResultsInterfaceFactory $searchResultFactory + \Magento\Eav\Api\Data\AttributeSetSearchResultsInterfaceFactory $searchResultFactory, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor ) { $this->attributeSetResource = $attributeSetResource; $this->attributeSetFactory = $attributeSetFactory; $this->collectionFactory = $collectionFactory; $this->eavConfig = $eavConfig; $this->searchResultsFactory = $searchResultFactory; + $this->joinProcessor = $joinProcessor; } /** @@ -87,6 +95,7 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface { /** @var \Magento\Eav\Model\Resource\Entity\Attribute\Set\Collection $collection */ $collection = $this->collectionFactory->create(); + $this->joinProcessor->process($collection); /** The only possible/meaningful search criteria for attribute set is entity type code */ $entityTypeCode = $this->getEntityTypeCode($searchCriteria); diff --git a/app/code/Magento/Eav/Test/Unit/Model/AttributeSetRepositoryTest.php b/app/code/Magento/Eav/Test/Unit/Model/AttributeSetRepositoryTest.php index 5975bf3b5f422e39a24faf4c58e8c4d3354bc50b..56d56b6035d2309134dbd9070f6bb2046ab7a6ee 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/AttributeSetRepositoryTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/AttributeSetRepositoryTest.php @@ -42,6 +42,11 @@ class AttributeSetRepositoryTest extends \PHPUnit_Framework_TestCase */ private $resultFactoryMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $extensionAttributesJoinProcessorMock; + /** * @return void */ @@ -76,12 +81,20 @@ class AttributeSetRepositoryTest extends \PHPUnit_Framework_TestCase '', false ); + $this->extensionAttributesJoinProcessorMock = $this->getMock( + '\Magento\Framework\Api\ExtensionAttribute\JoinProcessor', + ['process'], + [], + '', + false + ); $this->model = new \Magento\Eav\Model\AttributeSetRepository( $this->resourceMock, $this->setFactoryMock, $this->collectionFactoryMock, $this->eavConfigMock, - $this->resultFactoryMock + $this->resultFactoryMock, + $this->extensionAttributesJoinProcessorMock ); } diff --git a/app/code/Magento/Log/Model/Log.php b/app/code/Magento/Log/Model/Log.php index 3ef8615027d8264d3d50ebe1673aaa24a2920193..6f744ba0f5ecfb33e636eb5982bf2dce09118872 100644 --- a/app/code/Magento/Log/Model/Log.php +++ b/app/code/Magento/Log/Model/Log.php @@ -81,6 +81,7 @@ class Log extends \Magento\Framework\Model\AbstractModel * Clean Logs * * @return $this + * @api */ public function clean() { diff --git a/app/code/Magento/Log/Model/Resource/Visitor/Collection.php b/app/code/Magento/Log/Model/Resource/Visitor/Collection.php index f149fb739db213787702f779bd7a5b62df8baf13..662118f055731365066493dd5ed5f606abd577bd 100644 --- a/app/code/Magento/Log/Model/Resource/Visitor/Collection.php +++ b/app/code/Magento/Log/Model/Resource/Visitor/Collection.php @@ -111,6 +111,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac * Filter for customers only * * @return $this + * @api */ public function showCustomersOnly() { @@ -174,6 +175,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) + * @api */ public function getIsOnlineFilterUsed() { @@ -185,6 +187,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac * * @param int[]|int $storeIds * @return void + * @api */ public function addVisitorStoreFilter($storeIds) { diff --git a/app/code/Magento/Log/Model/Resource/Visitor/Online/Collection.php b/app/code/Magento/Log/Model/Resource/Visitor/Online/Collection.php index bb3fbe5d7a726dbfcd941b966e9b742b151f0e35..eb64fde9f3323ba90f8898177192740a6cdb4a97 100644 --- a/app/code/Magento/Log/Model/Resource/Visitor/Online/Collection.php +++ b/app/code/Magento/Log/Model/Resource/Visitor/Online/Collection.php @@ -87,6 +87,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac * * @param int|int[] $websiteIds * @return $this + * @api */ public function addWebsiteFilter($websiteIds) { diff --git a/app/code/Magento/PageCache/Model/Config.php b/app/code/Magento/PageCache/Model/Config.php index 56d46f7111fcc0cc2006e59aeaf3a72d20b05b65..7ffeeddbe18b9a55142e9ffbae899ac2483ec812 100644 --- a/app/code/Magento/PageCache/Model/Config.php +++ b/app/code/Magento/PageCache/Model/Config.php @@ -87,6 +87,7 @@ class Config * Return currently selected cache type: built in or varnish * * @return int + * @api */ public function getType() { @@ -97,6 +98,7 @@ class Config * Return page lifetime * * @return int + * @api */ public function getTtl() { @@ -108,6 +110,7 @@ class Config * * @param string $vclTemplatePath * @return string + * @api */ public function getVclFile($vclTemplatePath) { @@ -202,6 +205,7 @@ class Config * Whether a cache type is enabled in Cache Management Grid * * @return bool + * @api */ public function isEnabled() { diff --git a/app/code/Magento/PageCache/Model/DepersonalizeChecker.php b/app/code/Magento/PageCache/Model/DepersonalizeChecker.php index 5837cccbc7d0924daf7185f0d428d0f0f6eabf2e..14b1ee4424aab3e07a8d6aa4e26cedc7a69b7517 100644 --- a/app/code/Magento/PageCache/Model/DepersonalizeChecker.php +++ b/app/code/Magento/PageCache/Model/DepersonalizeChecker.php @@ -51,6 +51,7 @@ class DepersonalizeChecker * * @param \Magento\Framework\View\LayoutInterface $subject * @return bool + * @api */ public function checkIfDepersonalize(\Magento\Framework\View\LayoutInterface $subject) { diff --git a/app/code/Magento/Quote/Model/Quote.php b/app/code/Magento/Quote/Model/Quote.php index 9cc216d09012c88f121e7e80c35db7e165e505b5..95fa91f6c6c5c29de29ac69cdb491cacef11ee76 100644 --- a/app/code/Magento/Quote/Model/Quote.php +++ b/app/code/Magento/Quote/Model/Quote.php @@ -16,6 +16,7 @@ use Magento\Quote\Model\Quote\Address; use Magento\Sales\Model\Resource; use Magento\Sales\Model\Status; use Magento\Framework\Api\AttributeValueFactory; +use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; /** * Quote model @@ -322,6 +323,11 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C */ protected $dataObjectHelper; + /** + * @var JoinProcessorInterface + */ + protected $extensionAttributesJoinProcessor; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -355,6 +361,7 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper * @param \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter * @param Cart\CurrencyFactory $currencyFactory + * @param JoinProcessorInterface $extensionAttributesJoinProcessor * @param \Magento\Framework\Model\Resource\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data @@ -393,6 +400,7 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C \Magento\Framework\Api\DataObjectHelper $dataObjectHelper, \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter, \Magento\Quote\Model\Cart\CurrencyFactory $currencyFactory, + JoinProcessorInterface $extensionAttributesJoinProcessor, \Magento\Framework\Model\Resource\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] @@ -425,6 +433,7 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C $this->dataObjectHelper = $dataObjectHelper; $this->extensibleDataObjectConverter = $extensibleDataObjectConverter; $this->currencyFactory = $currencyFactory; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; parent::__construct( $context, $registry, @@ -1323,6 +1332,7 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C } if (null === $this->_items) { $this->_items = $this->_quoteItemCollectionFactory->create(); + $this->extensionAttributesJoinProcessor->process($this->_items); $this->_items->setQuote($this); } return $this->_items; diff --git a/app/code/Magento/Quote/Model/QuoteRepository.php b/app/code/Magento/Quote/Model/QuoteRepository.php index b54652e7fd8ed7e33d7c991ee9d1a1496f590ff6..6fa9bca5e4e3323a886ffda19833abf2262c098b 100644 --- a/app/code/Magento/Quote/Model/QuoteRepository.php +++ b/app/code/Magento/Quote/Model/QuoteRepository.php @@ -12,6 +12,7 @@ use Magento\Framework\Api\SearchCriteria; use Magento\Framework\Api\Search\FilterGroup; use Magento\Quote\Model\Resource\Quote\Collection as QuoteCollection; use Magento\Framework\Exception\InputException; +use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; class QuoteRepository implements \Magento\Quote\Api\CartRepositoryInterface { @@ -45,22 +46,30 @@ class QuoteRepository implements \Magento\Quote\Api\CartRepositoryInterface */ protected $searchResultsDataFactory; + /** + * @var JoinProcessorInterface + */ + private $extensionAttributesJoinProcessor; + /** * @param QuoteFactory $quoteFactory * @param StoreManagerInterface $storeManager * @param \Magento\Quote\Model\Resource\Quote\Collection $quoteCollection * @param \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory $searchResultsDataFactory + * @param JoinProcessorInterface $extensionAttributesJoinProcessor */ public function __construct( QuoteFactory $quoteFactory, StoreManagerInterface $storeManager, \Magento\Quote\Model\Resource\Quote\Collection $quoteCollection, - \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory $searchResultsDataFactory + \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory $searchResultsDataFactory, + JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->quoteFactory = $quoteFactory; $this->storeManager = $storeManager; $this->searchResultsDataFactory = $searchResultsDataFactory; $this->quoteCollection = $quoteCollection; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; } /** @@ -220,6 +229,7 @@ class QuoteRepository implements \Magento\Quote\Api\CartRepositoryInterface } $this->quoteCollection->setCurPage($searchCriteria->getCurrentPage()); $this->quoteCollection->setPageSize($searchCriteria->getPageSize()); + $this->extensionAttributesJoinProcessor->process($this->quoteCollection); $searchData->setItems($this->quoteCollection->getItems()); diff --git a/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php b/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php index 3690aa6cbf310d91baac0599a3438a69748e3e81..872cfa989fbdaf24a559265014aa37c6f650de5b 100644 --- a/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php +++ b/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php @@ -10,6 +10,7 @@ namespace Magento\Quote\Test\Unit\Model; use \Magento\Quote\Model\QuoteRepository; use Magento\Framework\Api\SearchCriteria; +use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase { @@ -19,35 +20,40 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase protected $model; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Quote\Model\QuoteFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $quoteFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $storeManagerMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject */ protected $storeMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Quote\Model\Quote|\PHPUnit_Framework_MockObject_MockObject */ protected $quoteMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $searchResultsDataFactory; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Quote\Model\Resource\Quote\Collection|\PHPUnit_Framework_MockObject_MockObject */ protected $quoteCollectionMock; + /** + * @var JoinProcessorInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $extensionAttributesJoinProcessorMock; + protected function setUp() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -56,8 +62,17 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface'); $this->quoteMock = $this->getMock( '\Magento\Quote\Model\Quote', - ['load', 'loadByCustomer', 'getIsActive', 'getId', '__wakeup', 'setSharedStoreIds', 'save', 'delete', - 'getCustomerId'], + [ + 'load', + 'loadByCustomer', + 'getIsActive', + 'getId', + '__wakeup', + 'setSharedStoreIds', + 'save', + 'delete', + 'getCustomerId' + ], [], '', false @@ -73,6 +88,14 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteCollectionMock = $this->getMock('Magento\Quote\Model\Resource\Quote\Collection', [], [], '', false); + $this->extensionAttributesJoinProcessorMock = $this->getMock( + 'Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface', + [], + [], + '', + false + ); + $this->model = $objectManager->getObject( 'Magento\Quote\Model\QuoteRepository', [ @@ -80,6 +103,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase 'storeManager' => $this->storeManagerMock, 'searchResultsDataFactory' => $this->searchResultsDataFactory, 'quoteCollection' => $this->quoteCollectionMock, + 'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock ] ); } @@ -362,6 +386,11 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteCollectionMock->expects($this->once())->method('setCurPage')->with(1); $this->quoteCollectionMock->expects($this->once())->method('setPageSize')->with(10); + $this->extensionAttributesJoinProcessorMock->expects($this->once()) + ->method('process') + ->with( + $this->isInstanceOf('\Magento\Quote\Model\Resource\Quote\Collection') + ); $this->quoteCollectionMock->expects($this->once())->method('getItems')->willReturn([$cartMock]); $searchResult->expects($this->once())->method('setItems')->with([$cartMock]); diff --git a/app/code/Magento/Quote/Test/Unit/Model/QuoteTest.php b/app/code/Magento/Quote/Test/Unit/Model/QuoteTest.php index 96815ef257fa1a8ea02280dd0043d0125ec74378..4412f8fc3669e409d7218fd2d1c297f3e738c0d3 100644 --- a/app/code/Magento/Quote/Test/Unit/Model/QuoteTest.php +++ b/app/code/Magento/Quote/Test/Unit/Model/QuoteTest.php @@ -12,6 +12,7 @@ use Magento\Quote\Model\Quote\Address; use Magento\Store\Model\ScopeInterface; use Magento\Quote\Api\Data\CartInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; /** * Test class for \Magento\Quote\Model @@ -131,6 +132,11 @@ class QuoteTest extends \PHPUnit_Framework_TestCase */ protected $objectCopyServiceMock; + /** + * @var JoinProcessorInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $extensionAttributesJoinProcessorMock; + /** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ @@ -260,6 +266,14 @@ class QuoteTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); + $this->extensionAttributesJoinProcessorMock = $this->getMock( + 'Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface', + [], + [], + '', + false + ); + $this->quote = (new ObjectManager($this)) ->getObject( 'Magento\Quote\Model\Quote', @@ -280,7 +294,8 @@ class QuoteTest extends \PHPUnit_Framework_TestCase 'scopeConfig' => $this->scopeConfig, 'extensibleDataObjectConverter' => $this->extensibleDataObjectConverterMock, 'customerRepository' => $this->customerRepositoryMock, - 'objectCopyService' => $this->objectCopyServiceMock + 'objectCopyService' => $this->objectCopyServiceMock, + 'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock ] ); } @@ -1123,7 +1138,6 @@ class QuoteTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expected, $this->quote->getDataByKey(CartInterface::KEY_IS_VIRTUAL)); } - /** * @return array */ @@ -1137,4 +1151,24 @@ class QuoteTest extends \PHPUnit_Framework_TestCase [[false, false], 0] ]; } + + public function testGetItemsCollection() + { + $itemCollectionMock = $this->getMockBuilder('Magento\Quote\Model\Resource\Quote\Collection') + ->disableOriginalConstructor() + ->setMethods(['setQuote']) + ->getMock(); + $this->quoteItemCollectionFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($itemCollectionMock); + + $this->extensionAttributesJoinProcessorMock->expects($this->once()) + ->method('process') + ->with( + $this->isInstanceOf('Magento\Quote\Model\Resource\Quote\Collection') + ); + $itemCollectionMock->expects($this->once())->method('setQuote')->with($this->quote); + + $this->quote->getItemsCollection(); + } } diff --git a/app/code/Magento/Sales/Api/Data/OrderSearchResultInterface.php b/app/code/Magento/Sales/Api/Data/OrderSearchResultInterface.php index b11a2c04de8d3b776d732da083bc8521241a9b54..a7c67652dd7a427b2f3379b516699516a55eb28c 100644 --- a/app/code/Magento/Sales/Api/Data/OrderSearchResultInterface.php +++ b/app/code/Magento/Sales/Api/Data/OrderSearchResultInterface.php @@ -18,7 +18,7 @@ interface OrderSearchResultInterface /** * Gets collection items. * - * @return \Magento\Sales\Api\Data\OrderSearchResultInterface[] Array of collection items. + * @return \Magento\Sales\Api\Data\OrderInterface[] Array of collection items. */ public function getItems(); } diff --git a/app/code/Magento/Sales/Api/InvoiceCommentRepositoryInterface.php b/app/code/Magento/Sales/Api/InvoiceCommentRepositoryInterface.php index c7e2d8cfb759c7b9831a9becca5fa7fec54da83d..f256bb88af2ab2fd0f57dc8c7603c7eea67ebeda 100644 --- a/app/code/Magento/Sales/Api/InvoiceCommentRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/InvoiceCommentRepositoryInterface.php @@ -18,7 +18,7 @@ interface InvoiceCommentRepositoryInterface * Lists invoice comments that match specified search criteria. * * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. - * @return \Magento\Sales\Api\Data\InvoiceSearchResultInterface Invoice search result interface. + * @return \Magento\Sales\Api\Data\InvoiceCommentSearchResultInterface Invoice search result interface. */ public function getList(\Magento\Framework\Api\SearchCriteria $criteria); diff --git a/app/code/Magento/Tax/Model/Calculation/RateRepository.php b/app/code/Magento/Tax/Model/Calculation/RateRepository.php index 6f099ea27ae35038fac754ea19d97066355c7b47..d124469768d16ba5a596c80e87a189f70cb94ce0 100644 --- a/app/code/Magento/Tax/Model/Calculation/RateRepository.php +++ b/app/code/Magento/Tax/Model/Calculation/RateRepository.php @@ -65,6 +65,11 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface */ protected $resourceModel; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $joinProcessor; + /** * @param Converter $converter * @param RateRegistry $rateRegistry @@ -73,6 +78,7 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface * @param CountryFactory $countryFactory * @param RegionFactory $regionFactory * @param \Magento\Tax\Model\Resource\Calculation\Rate $rateResource + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor */ public function __construct( Converter $converter, @@ -81,7 +87,8 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface RateFactory $rateFactory, CountryFactory $countryFactory, RegionFactory $regionFactory, - \Magento\Tax\Model\Resource\Calculation\Rate $rateResource + \Magento\Tax\Model\Resource\Calculation\Rate $rateResource, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor ) { $this->converter = $converter; $this->rateRegistry = $rateRegistry; @@ -90,6 +97,7 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface $this->countryFactory = $countryFactory; $this->regionFactory = $regionFactory; $this->resourceModel = $rateResource; + $this->joinProcessor = $joinProcessor; } /** @@ -146,6 +154,7 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface { /** @var \Magento\Tax\Model\Resource\Calculation\Rate\Collection $collection */ $collection = $this->rateFactory->create()->getCollection(); + $this->joinProcessor->process($collection); $collection->joinRegionTable(); //Add filters from root filter group to the collection diff --git a/app/code/Magento/Tax/Model/TaxClass/Repository.php b/app/code/Magento/Tax/Model/TaxClass/Repository.php index 01dd656b0d5e51d5b64e22c8fd4d80e937d19e2b..54b92c00c6633d82065d21e342ebe081eba192fc 100644 --- a/app/code/Magento/Tax/Model/TaxClass/Repository.php +++ b/app/code/Magento/Tax/Model/TaxClass/Repository.php @@ -62,6 +62,11 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface */ protected $taxClassResource; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $joinProcessor; + /** * @param SearchCriteriaBuilder $searchCriteriaBuilder * @param FilterBuilder $filterBuilder @@ -69,6 +74,7 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface * @param \Magento\Tax\Api\Data\TaxClassSearchResultsInterfaceFactory $searchResultsFactory * @param ClassModelRegistry $classModelRegistry * @param \Magento\Tax\Model\Resource\TaxClass $taxClassResource + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor */ public function __construct( SearchCriteriaBuilder $searchCriteriaBuilder, @@ -76,7 +82,8 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface TaxClassCollectionFactory $taxClassCollectionFactory, \Magento\Tax\Api\Data\TaxClassSearchResultsInterfaceFactory $searchResultsFactory, ClassModelRegistry $classModelRegistry, - \Magento\Tax\Model\Resource\TaxClass $taxClassResource + \Magento\Tax\Model\Resource\TaxClass $taxClassResource, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor ) { $this->searchCriteriaBuilder = $searchCriteriaBuilder; $this->filterBuilder = $filterBuilder; @@ -84,6 +91,7 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface $this->searchResultsFactory = $searchResultsFactory; $this->classModelRegistry = $classModelRegistry; $this->taxClassResource = $taxClassResource; + $this->joinProcessor = $joinProcessor; } /** @@ -195,6 +203,7 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface $searchResults->setSearchCriteria($searchCriteria); /** @var TaxClassCollection $collection */ $collection = $this->taxClassCollectionFactory->create(); + $this->joinProcessor->process($collection); foreach ($searchCriteria->getFilterGroups() as $group) { $this->addFilterGroupToCollection($group, $collection); } diff --git a/app/code/Magento/Tax/Model/TaxRuleRepository.php b/app/code/Magento/Tax/Model/TaxRuleRepository.php index d186c79b562aa9e44c5e1a9a2f83bae2ee866ea4..28ff8015b9a66581f310fa30588f5195185fd5a6 100644 --- a/app/code/Magento/Tax/Model/TaxRuleRepository.php +++ b/app/code/Magento/Tax/Model/TaxRuleRepository.php @@ -52,25 +52,33 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface */ protected $resource; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $joinProcessor; + /** * @param TaxRuleRegistry $taxRuleRegistry * @param TaxRuleSearchResultsInterfaceFactory $searchResultsFactory * @param RuleFactory $ruleFactory * @param CollectionFactory $collectionFactory * @param Resource $resource + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor */ public function __construct( TaxRuleRegistry $taxRuleRegistry, TaxRuleSearchResultsInterfaceFactory $searchResultsFactory, RuleFactory $ruleFactory, CollectionFactory $collectionFactory, - Resource $resource + Resource $resource, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor ) { $this->taxRuleRegistry = $taxRuleRegistry; $this->taxRuleSearchResultsFactory = $searchResultsFactory; $this->taxRuleModelFactory = $ruleFactory; $this->collectionFactory = $collectionFactory; $this->resource = $resource; + $this->joinProcessor = $joinProcessor; } /** @@ -133,6 +141,7 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface $fields = []; $collection = $this->collectionFactory->create(); + $this->joinProcessor->process($collection); //Add filters from root filter group to the collection foreach ($searchCriteria->getFilterGroups() as $group) { diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php index 7feff54990150d92bc3806f1399109e9410d4145..f2d8b4b17d1646147e9143c797e83f8041f3102b 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php +++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php @@ -59,6 +59,11 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase */ private $rateResourceMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $joinProcessorMock; + public function setUp() { $this->rateConverterMock = $this->getMock( @@ -117,6 +122,13 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase '', false ); + $this->joinProcessorMock = $this->getMock( + 'Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface', + [], + [], + '', + false + ); $this->model = new RateRepository( $this->rateConverterMock, $this->rateRegistryMock, @@ -124,7 +136,8 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase $this->rateFactoryMock, $this->countryFactoryMock, $this->regionFactoryMock, - $this->rateResourceMock + $this->rateResourceMock, + $this->joinProcessorMock ); } @@ -256,6 +269,8 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase ->willReturnSelf(); $this->searchResultFactory->expects($this->once())->method('create')->willReturn($this->searchResultMock); + $this->joinProcessorMock->expects($this->once())->method('process')->with($collectionMock); + $this->model->getList($searchCriteriaMock); } @@ -402,6 +417,8 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase ->willReturnSelf(); $this->searchResultFactory->expects($this->once())->method('create')->willReturn($this->searchResultMock); + $this->joinProcessorMock->expects($this->once())->method('process')->with($collectionMock); + $this->model->getList($searchCriteriaMock); } diff --git a/app/code/Magento/Tax/Test/Unit/Model/TaxClass/RepositoryTest.php b/app/code/Magento/Tax/Test/Unit/Model/TaxClass/RepositoryTest.php index 80894cab62e2a22b77480e6f851031b07da9d144..bfab6b77acc7f50349e1dbd409a9c88512385da9 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/TaxClass/RepositoryTest.php +++ b/app/code/Magento/Tax/Test/Unit/Model/TaxClass/RepositoryTest.php @@ -47,6 +47,11 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase */ protected $taxClassCollectionFactory; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $extensionAttributesJoinProcessorMock; + /** * @return void */ @@ -85,13 +90,23 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase ); $this->taxClassResourceMock = $this->getMock('\Magento\Tax\Model\Resource\TaxClass', [], [], '', false); + + $this->extensionAttributesJoinProcessorMock = $this->getMock( + '\Magento\Framework\Api\ExtensionAttribute\JoinProcessor', + ['process'], + [], + '', + false + ); + $this->model = $this->objectManager->getObject( 'Magento\Tax\Model\TaxClass\Repository', [ 'classModelRegistry' => $this->classModelRegistryMock, 'taxClassResource' => $this->taxClassResourceMock, 'searchResultsFactory' => $this->searchResultFactory, - 'taxClassCollectionFactory' => $this->taxClassCollectionFactory + 'taxClassCollectionFactory' => $this->taxClassCollectionFactory, + 'joinProcessor' => $this->extensionAttributesJoinProcessorMock ] ); } @@ -187,6 +202,10 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase $collection = $this->getMock('\Magento\Tax\Model\Resource\TaxClass\Collection', [], [], '', false); $sortOrder = $this->getMock('\Magento\Framework\Api\SortOrder', [], [], '', false); + $this->extensionAttributesJoinProcessorMock->expects($this->once()) + ->method('process') + ->with($collection); + $searchCriteria->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroup]); $filterGroup->expects($this->once())->method('getFilters')->willReturn([$filter]); $filter->expects($this->atLeastOnce())->method('getConditionType')->willReturn('eq'); diff --git a/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php b/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php index 435fa82bbe9e41c33f6fc7779bdca58eb418eb89..3225be5242f8ace8b4e4bece353df61c02a8bb78 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php +++ b/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php @@ -46,6 +46,11 @@ class TaxRuleRepositoryTest extends \PHPUnit_Framework_TestCase */ protected $resource; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $extensionAttributesJoinProcessorMock; + /** * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ @@ -78,13 +83,21 @@ class TaxRuleRepositoryTest extends \PHPUnit_Framework_TestCase false ); $this->resource = $this->getMock('\Magento\Tax\Model\Resource\Calculation\Rule', [], [], '', false); + $this->extensionAttributesJoinProcessorMock = $this->getMock( + '\Magento\Framework\Api\ExtensionAttribute\JoinProcessor', + ['process'], + [], + '', + false + ); $this->model = new TaxRuleRepository( $this->taxRuleRegistry, $this->searchResultFactory, $this->ruleFactory, $this->collectionFactory, - $this->resource + $this->resource, + $this->extensionAttributesJoinProcessorMock ); } @@ -181,6 +194,10 @@ class TaxRuleRepositoryTest extends \PHPUnit_Framework_TestCase $filterMock = $this->getMock('\Magento\Framework\Api\Filter', [], [], '', false); $sortOrderMock = $this->getMock('\Magento\Framework\Api\SortOrder', [], [], '', false); + $this->extensionAttributesJoinProcessorMock->expects($this->once()) + ->method('process') + ->with($collectionMock); + $this->searchResultsMock->expects($this->once())->method('setSearchCriteria')->with($searchCriteriaMock); $this->collectionFactory->expects($this->once())->method('create')->willReturn($collectionMock); $searchCriteriaMock->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroupMock]); diff --git a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php new file mode 100644 index 0000000000000000000000000000000000000000..2f62bc394b3b3e7ccdd0926c90b84843a7e958c9 --- /dev/null +++ b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php @@ -0,0 +1,407 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Theme\Console\Command; + +use Magento\Framework\App\Area; +use Magento\Framework\App\Cache; +use Magento\Framework\App\MaintenanceMode; +use Magento\Framework\App\State\CleanupFiles; +use Magento\Framework\Composer\ComposerInformation; +use Magento\Framework\Composer\DependencyChecker; +use Magento\Framework\Composer\Remove; +use Magento\Framework\Filesystem; +use Magento\Theme\Model\Theme\Data\Collection; +use Magento\Theme\Model\Theme\ThemeProvider; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Input\InputArgument; +use Magento\Framework\Setup\BackupRollbackFactory; +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Exception\LocalizedException; +use Magento\Theme\Model\ThemeValidator; + +/** + * Command for uninstalling theme and backup-code feature + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ +class ThemeUninstallCommand extends Command +{ + /** + * Names of input arguments or options + */ + const INPUT_KEY_BACKUP_CODE = 'backup-code'; + const INPUT_KEY_THEMES = 'theme'; + const INPUT_KEY_CLEAR_STATIC_CONTENT = 'clear-static-content'; + + /** + * Maintenance Mode + * + * @var MaintenanceMode + */ + private $maintenanceMode; + + /** + * Composer general dependency checker + * + * @var DependencyChecker + */ + private $dependencyChecker; + + /** + * Root composer.json information + * + * @var ComposerInformation + */ + private $composer; + + /** + * File operation to read theme directory + * + * @var Filesystem + */ + private $filesystem; + + /** + * Code remover + * + * @var Remove + */ + private $remove; + + /** + * Theme collection in filesystem + * + * @var Collection + */ + private $themeCollection; + + /** + * Provider for themes registered in db + * + * @var ThemeProvider + */ + private $themeProvider; + + /** + * System cache model + * + * @var Cache + */ + private $cache; + + /** + * Cleaning up application state service + * + * @var CleanupFiles + */ + private $cleanupFiles; + + /** + * BackupRollback factory + * + * @var BackupRollbackFactory + */ + private $backupRollbackFactory; + + /** + * Theme Validator + * + * @var ThemeValidator + */ + private $themeValidator; + + /** + * Constructor + * + * @param Cache $cache + * @param CleanupFiles $cleanupFiles + * @param ComposerInformation $composer + * @param MaintenanceMode $maintenanceMode + * @param Filesystem $filesystem + * @param DependencyChecker $dependencyChecker + * @param Collection $themeCollection + * @param ThemeProvider $themeProvider + * @param Remove $remove + * @param BackupRollbackFactory $backupRollbackFactory + * @param ThemeValidator $themeValidator + * @throws LocalizedException + */ + public function __construct( + Cache $cache, + CleanupFiles $cleanupFiles, + ComposerInformation $composer, + MaintenanceMode $maintenanceMode, + Filesystem $filesystem, + DependencyChecker $dependencyChecker, + Collection $themeCollection, + ThemeProvider $themeProvider, + Remove $remove, + BackupRollbackFactory $backupRollbackFactory, + ThemeValidator $themeValidator + ) { + $this->cache = $cache; + $this->cleanupFiles = $cleanupFiles; + $this->composer = $composer; + $this->maintenanceMode = $maintenanceMode; + $this->filesystem = $filesystem; + $this->dependencyChecker = $dependencyChecker; + $this->remove = $remove; + $this->themeCollection = $themeCollection; + $this->themeProvider = $themeProvider; + $this->backupRollbackFactory = $backupRollbackFactory; + $this->themeValidator = $themeValidator; + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('theme:uninstall'); + $this->setDescription('Uninstalls theme'); + $this->addOption( + self::INPUT_KEY_BACKUP_CODE, + null, + InputOption::VALUE_NONE, + 'Take code backup (excluding temporary files)' + ); + $this->addArgument( + self::INPUT_KEY_THEMES, + InputArgument::IS_ARRAY | InputArgument::REQUIRED, + 'Path of the theme. Theme path should be specified as full path which is area/vendor/name.' + . ' For example, frontend/Magento/blank' + ); + $this->addOption( + self::INPUT_KEY_CLEAR_STATIC_CONTENT, + 'c', + InputOption::VALUE_NONE, + 'Clear generated static view files.' + ); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $themePaths = $input->getArgument(self::INPUT_KEY_THEMES); + $validationMessages = $this->validate($themePaths); + if (!empty($validationMessages)) { + $output->writeln($validationMessages); + return; + } + $isThemeInUseMessages = $this->themeValidator->validateIsThemeInUse($themePaths); + if (!empty($isThemeInUseMessages)) { + $output->writeln($isThemeInUseMessages); + return; + } + $childThemeCheckMessages = $this->checkChildTheme($themePaths); + if (!empty($childThemeCheckMessages)) { + $output->writeln($childThemeCheckMessages); + return; + } + $dependencyMessages = $this->checkDependencies($themePaths); + if (!empty($dependencyMessages)) { + $output->writeln($dependencyMessages); + return; + } + + try { + $output->writeln('<info>Enabling maintenance mode</info>'); + $this->maintenanceMode->set(true); + if ($input->getOption(self::INPUT_KEY_BACKUP_CODE)) { + $time = time(); + $codeBackup = $this->backupRollbackFactory->create($output); + $codeBackup->codeBackup($time); + } + $output->writeln('<info>Removing ' . implode(', ', $themePaths) . ' from database'); + $this->removeFromDb($themePaths); + $output->writeln('<info>Removing ' . implode(', ', $themePaths) . ' from Magento codebase'); + $themePackages = []; + foreach ($themePaths as $themePath) { + $themePackages[] = $this->getPackageName($themePath); + } + $this->remove->remove($themePackages); + $this->cleanup($input, $output); + $output->writeln('<info>Disabling maintenance mode</info>'); + $this->maintenanceMode->set(false); + } catch (\Exception $e) { + $output->writeln('<error>' . $e->getMessage() . '</error>'); + $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>'); + } + } + + /** + * Validate given full theme paths + * + * @param string[] $themePaths + * @return string[] + */ + private function validate($themePaths) + { + $messages = []; + $unknownPackages = []; + $unknownThemes = []; + $installedPackages = $this->composer->getRootRequiredPackages(); + foreach ($themePaths as $themePath) { + if (array_search($this->getPackageName($themePath), $installedPackages) === false) { + $unknownPackages[] = $themePath; + } + if (!$this->themeCollection->hasTheme($this->themeCollection->getThemeByFullPath($themePath))) { + $unknownThemes[] = $themePath; + } + } + $unknownPackages = array_diff($unknownPackages, $unknownThemes); + if (!empty($unknownPackages)) { + $text = count($unknownPackages) > 1 ? + ' are not installed Composer packages' : ' is not an installed Composer package'; + $messages[] = '<error>' . implode(', ', $unknownPackages) . $text . '</error>'; + } + if (!empty($unknownThemes)) { + $messages[] = '<error>Unknown theme(s): ' . implode(', ', $unknownThemes) . '</error>'; + } + return $messages; + } + + /** + * Check dependencies to given full theme paths + * + * @param string[] $themePaths + * @return string[] + */ + private function checkDependencies($themePaths) + { + $messages = []; + $packageToPath = []; + foreach ($themePaths as $themePath) { + $packageToPath[$this->getPackageName($themePath)] = $themePath; + } + $dependencies = $this->dependencyChecker->checkDependencies(array_keys($packageToPath), true); + foreach ($dependencies as $package => $dependingPackages) { + if (!empty($dependingPackages)) { + $messages[] = + '<error>Cannot uninstall ' . $packageToPath[$package] . + " because the following package(s) depend on it:</error>" . + PHP_EOL . "\t<error>" . implode('</error>' . PHP_EOL . "\t<error>", $dependingPackages) + . "</error>"; + } + } + return $messages; + } + + /** + * Check theme if has child virtual and physical theme + * + * @param string[] $themePaths + * @return string[] $messages + */ + private function checkChildTheme($themePaths) + { + $messages = []; + $themeHasVirtualChildren = []; + $themeHasPhysicalChildren = []; + $parentChildMap = $this->getParentChildThemeMap(); + foreach ($themePaths as $themePath) { + $theme = $this->themeProvider->getThemeByFullPath($themePath); + if ($theme->hasChildThemes()) { + $themeHasVirtualChildren[] = $themePath; + } + if (isset($parentChildMap[$themePath])) { + $themeHasPhysicalChildren[] = $themePath; + } + } + if (!empty($themeHasVirtualChildren)) { + $text = count($themeHasVirtualChildren) > 1 ? ' are parents of' : ' is a parent of'; + $messages[] = '<error>Unable to uninstall. ' + . implode(', ', $themeHasVirtualChildren) . $text . ' virtual theme</error>'; + } + if (!empty($themeHasPhysicalChildren)) { + $text = count($themeHasPhysicalChildren) > 1 ? ' are parents of' : ' is a parent of'; + $messages[] = '<error>Unable to uninstall. ' + . implode(', ', $themeHasPhysicalChildren) . $text . ' physical theme</error>'; + } + return $messages; + } + + /** + * Obtain a parent theme -> children themes map from the filesystem + * + * @return array + */ + private function getParentChildThemeMap() + { + $map = []; + $this->themeCollection->addDefaultPattern('*'); + /** @var \Magento\Theme\Model\Theme\Data $theme */ + foreach ($this->themeCollection as $theme) { + if ($theme->getParentTheme()) { + $map[$theme->getParentTheme()->getFullPath()][] = $theme->getFullPath(); + } + } + return $map; + } + + /** + * Get package name of a theme by its full theme path + * + * @param string $themePath + * @return string + * @throws \Zend_Json_Exception + */ + private function getPackageName($themePath) + { + $themesDirRead = $this->filesystem->getDirectoryRead(DirectoryList::THEMES); + if ($themesDirRead->isExist($themePath . '/composer.json')) { + $rawData = \Zend_Json::decode($themesDirRead->readFile($themePath . '/composer.json')); + return isset($rawData['name']) ? $rawData['name'] : ''; + } + return ''; + } + + /** + * Cleanup after updated modules status + * + * @param InputInterface $input + * @param OutputInterface $output + * @return void + */ + private function cleanup(InputInterface $input, OutputInterface $output) + { + $this->cache->clean(); + $output->writeln('<info>Cache cleared successfully.</info>'); + + if ($input->getOption(self::INPUT_KEY_CLEAR_STATIC_CONTENT)) { + $this->cleanupFiles->clearMaterializedViewFiles(); + $output->writeln('<info>Generated static view files cleared successfully.</info>'); + } else { + $output->writeln( + '<error>Alert: Generated static view files were not cleared.' + . ' You can clear them using the --' . self::INPUT_KEY_CLEAR_STATIC_CONTENT . ' option.' + . ' Failure to clear static view files might cause display issues in the Admin and storefront.</error>' + ); + } + } + + /** + * Remove all records related to the theme(s) in the database + * + * @param string[] $themePaths + * @return void + */ + private function removeFromDb(array $themePaths) + { + foreach ($themePaths as $themePath) { + $this->themeProvider->getThemeByFullPath($themePath)->delete(); + } + } +} diff --git a/app/code/Magento/Theme/Model/ThemeValidator.php b/app/code/Magento/Theme/Model/ThemeValidator.php new file mode 100644 index 0000000000000000000000000000000000000000..6f8b0ddda264fec695f8a03d194eaed3fb6a5899 --- /dev/null +++ b/app/code/Magento/Theme/Model/ThemeValidator.php @@ -0,0 +1,92 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Theme\Model; + +use Magento\Store\Model\StoreManagerInterface; +use Magento\Framework\View\DesignInterface; +use Magento\Framework\View\Design\Theme\ThemeProviderInterface; +use Magento\Framework\App\Config\ValueInterface; +use Magento\Store\Model\ScopeInterface; + +/** + * Class ThemeValidator + */ +class ThemeValidator +{ + + /** + * Store Manager + * + * @var StoreManagerInterface $storeManager + */ + private $storeManager; + + /** + * Provider for themes registered in db + * + * @var ThemeProviderInterface $themeProvider + */ + private $themeProvider; + + /** + * Configuration Data + * + * @var ValueInterface $configData + */ + private $configData; + + + /** + * @param StoreManagerInterface $storeManager + * @param ThemeProviderInterface $themeProvider + * @param ValueInterface $configData + */ + public function __construct( + StoreManagerInterface $storeManager, + ThemeProviderInterface $themeProvider, + ValueInterface $configData + ) { + $this->storeManager = $storeManager; + $this->themeProvider = $themeProvider; + $this->configData = $configData; + } + + /** + * Validate the theme if being in use in default, website, or store. + * + * @param string[] $themePaths + * @return array + */ + public function validateIsThemeInUse($themePaths) + { + $messages = []; + $themesById = []; + foreach ($themePaths as $themePath) { + $theme = $this->themeProvider->getThemeByFullPath($themePath); + $themesById[$theme->getId()] = $themePath; + } + $configData = $this->configData + ->getCollection() + ->addFieldToFilter('path', DesignInterface::XML_PATH_THEME_ID) + ->addFieldToFilter('value', ['in' => array_keys($themesById)]); + foreach ($configData as $row) { + switch($row['scope']) { + case 'default': + $messages[] = $themesById[$row['value']] . ' is in use in default config'; + break; + case ScopeInterface::SCOPE_WEBSITES: + $messages[] = $themesById[$row['value']] . ' is in use in website ' + . $this->storeManager->getWebsite($row['scope_id'])->getName(); + break; + case ScopeInterface::SCOPE_STORES: + $messages[] = $themesById[$row['value']] . ' is in use in store ' + . $this->storeManager->getStore($row['scope_id'])->getName(); + break; + } + } + return $messages; + } +} diff --git a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..c8c8f92a1b6c0b218a217e1aa7897410559a72a5 --- /dev/null +++ b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php @@ -0,0 +1,409 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Theme\Test\Unit\Console\Command; + +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Theme\Console\Command\ThemeUninstallCommand; +use Symfony\Component\Console\Tester\CommandTester; +use Magento\Framework\Setup\BackupRollbackFactory; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\App\MaintenanceMode|\PHPUnit_Framework_MockObject_MockObject + */ + private $maintenanceMode; + + /** + * @var \Magento\Framework\Filesystem|\PHPUnit_Framework_MockObject_MockObject + */ + private $filesystem; + + /** + * @var \Magento\Framework\Composer\DependencyChecker|\PHPUnit_Framework_MockObject_MockObject + */ + private $dependencyChecker; + + /** + * @var \Magento\Theme\Model\Theme\Data\Collection|\PHPUnit_Framework_MockObject_MockObject + */ + private $collection; + + /** + * @var \Magento\Framework\Composer\Remove|\PHPUnit_Framework_MockObject_MockObject + */ + private $remove; + + /** + * @var \Magento\Framework\App\Cache|\PHPUnit_Framework_MockObject_MockObject + */ + private $cache; + + /** + * @var \Magento\Framework\App\State\CleanupFiles|\PHPUnit_Framework_MockObject_MockObject + */ + private $cleanupFiles; + + /** + * @var \Magento\Theme\Model\Theme\ThemeProvider|\PHPUnit_Framework_MockObject_MockObject + */ + private $themeProvider; + + /** + * @var ThemeUninstallCommand + */ + private $command; + + /** + * @var BackupRollbackFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $backupRollbackFactory; + + /** + * Theme Validator + * + * @var ThemeValidator|\PHPUnit_Framework_MockObject_MockObject + */ + private $themeValidator; + + /** + * @var CommandTester + */ + private $tester; + + public function setUp() + { + $this->maintenanceMode = $this->getMock('Magento\Framework\App\MaintenanceMode', [], [], '', false); + $composerInformation = $this->getMock('Magento\Framework\Composer\ComposerInformation', [], [], '', false); + $composerInformation->expects($this->any()) + ->method('getRootRequiredPackages') + ->willReturn(['magento/theme-a', 'magento/theme-b', 'magento/theme-c']); + $this->filesystem = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); + $this->dependencyChecker = $this->getMock( + 'Magento\Framework\Composer\DependencyChecker', + [], + [], + '', + false + ); + $this->collection = $this->getMock('Magento\Theme\Model\Theme\Data\Collection', [], [], '', false); + $this->remove = $this->getMock('Magento\Framework\Composer\Remove', [], [], '', false); + $this->cache = $this->getMock('Magento\Framework\App\Cache', [], [], '', false); + $this->cleanupFiles = $this->getMock('Magento\Framework\App\State\CleanupFiles', [], [], '', false); + $this->themeProvider = $this->getMock('Magento\Theme\Model\Theme\ThemeProvider', [], [], '', false); + $this->backupRollbackFactory = $this->getMock( + 'Magento\Framework\Setup\BackupRollbackFactory', + [], + [], + '', + false + ); + $this->themeValidator = $this->getMock('Magento\Theme\Model\ThemeValidator', [], [], '', false); + $this->command = new ThemeUninstallCommand( + $this->cache, + $this->cleanupFiles, + $composerInformation, + $this->maintenanceMode, + $this->filesystem, + $this->dependencyChecker, + $this->collection, + $this->themeProvider, + $this->remove, + $this->backupRollbackFactory, + $this->themeValidator + ); + $this->tester = new CommandTester($this->command); + } + + public function testExecuteFailedValidationNotPackage() + { + $dirRead = $this->getMock('Magento\Framework\Filesystem\Directory\Read', [], [], '', false); + // package name "dummy" is not in root composer.json file + $dirRead->expects($this->any()) + ->method('readFile') + ->will($this->returnValueMap( + [ + ['test1/composer.json', null, null, '{"name": "dummy"}'], + ['test2/composer.json', null, null, '{"name": "magento/theme-a"}'] + ] + )); + $dirRead->expects($this->any())->method('isExist')->willReturn(true); + $this->filesystem->expects($this->any()) + ->method('getDirectoryRead') + ->with(DirectoryList::THEMES) + ->willReturn($dirRead); + $this->collection->expects($this->any()) + ->method('getThemeByFullPath') + ->willReturn($this->getMockForAbstractClass('Magento\Framework\View\Design\ThemeInterface', [], '', false)); + $this->collection->expects($this->any())->method('hasTheme')->willReturn(true); + $this->tester->execute(['theme' => ['test1', 'test2']]); + $this->assertContains( + 'test1 is not an installed Composer package', + $this->tester->getDisplay() + ); + $this->assertNotContains( + 'test2 is not an installed Composer package', + $this->tester->getDisplay() + ); + } + + public function testExecuteFailedValidationNotTheme() + { + $dirRead = $this->getMock('Magento\Framework\Filesystem\Directory\Read', [], [], '', false); + $dirRead->expects($this->any())->method('isExist')->willReturn(false); + $this->filesystem->expects($this->any()) + ->method('getDirectoryRead') + ->with(DirectoryList::THEMES) + ->willReturn($dirRead); + $this->collection->expects($this->any()) + ->method('getThemeByFullPath') + ->willReturn($this->getMockForAbstractClass('Magento\Framework\View\Design\ThemeInterface', [], '', false)); + $this->collection->expects($this->any())->method('hasTheme')->willReturn(false); + $this->tester->execute(['theme' => ['test1', 'test2']]); + $this->assertContains( + 'Unknown theme(s): test1, test2' . PHP_EOL, + $this->tester->getDisplay() + ); + } + + public function testExecuteFailedValidationMixed() + { + $dirRead = $this->getMock('Magento\Framework\Filesystem\Directory\Read', [], [], '', false); + // package name "dummy" is not in root composer.json file + $dirRead->expects($this->any()) + ->method('readFile') + ->will($this->returnValueMap( + [ + ['test1/composer.json', null, null, '{"name": "dummy1"}'], + ['test2/composer.json', null, null, '{"name": "magento/theme-b"}'], + ['test4/composer.json', null, null, '{"name": "dummy2"}'] + ] + )); + $dirRead->expects($this->any()) + ->method('isExist') + ->will($this->returnValueMap( + [ + ['test1/composer.json', true], + ['test2/composer.json', true], + ['test3/composer.json', false], + ['test4/composer.json', true] + ] + )); + $this->collection->expects($this->any()) + ->method('getThemeByFullPath') + ->willReturn($this->getMockForAbstractClass('Magento\Framework\View\Design\ThemeInterface', [], '', false)); + $this->collection->expects($this->at(1))->method('hasTheme')->willReturn(true); + $this->collection->expects($this->at(3))->method('hasTheme')->willReturn(true); + $this->collection->expects($this->at(5))->method('hasTheme')->willReturn(false); + $this->collection->expects($this->at(7))->method('hasTheme')->willReturn(true); + $this->filesystem->expects($this->any()) + ->method('getDirectoryRead') + ->with(DirectoryList::THEMES) + ->willReturn($dirRead); + $this->tester->execute(['theme' => ['test1', 'test2', 'test3', 'test4']]); + $this->assertContains( + 'test1, test4 are not installed Composer packages', + $this->tester->getDisplay() + ); + $this->assertNotContains( + 'test2 is not an installed Composer package', + $this->tester->getDisplay() + ); + $this->assertContains( + 'Unknown theme(s): test3' . PHP_EOL, + $this->tester->getDisplay() + ); + } + + public function setUpPassValidation() + { + $dirRead = $this->getMock('Magento\Framework\Filesystem\Directory\Read', [], [], '', false); + // package name "dummy" is not in root composer.json file + $dirRead->expects($this->any()) + ->method('readFile') + ->willReturn('{"name": "magento/theme-a"}'); + $dirRead->expects($this->any()) + ->method('isExist') + ->willReturn(true); + $this->filesystem->expects($this->any()) + ->method('getDirectoryRead') + ->with(DirectoryList::THEMES) + ->willReturn($dirRead); + $this->collection->expects($this->any()) + ->method('getThemeByFullPath') + ->willReturn($this->getMockForAbstractClass('Magento\Framework\View\Design\ThemeInterface', [], '', false)); + $this->collection->expects($this->any())->method('hasTheme')->willReturn(true); + } + + public function setupPassChildThemeCheck() + { + $theme = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); + $theme->expects($this->any())->method('hasChildThemes')->willReturn(false); + $this->themeProvider->expects($this->any())->method('getThemeByFullPath')->willReturn($theme); + $this->collection->expects($this->any())->method('getIterator')->willReturn(new \ArrayIterator([])); + } + + /** + * @dataProvider executeFailedChildThemeCheckDataProvider + * @param bool $hasVirtual + * @param bool $hasPhysical + * @param array $input + * @param string $expected + * @return void + */ + public function testExecuteFailedChildThemeCheck($hasVirtual, $hasPhysical, array $input, $expected) + { + $this->setUpPassValidation(); + $theme = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); + $theme->expects($this->any())->method('hasChildThemes')->willReturn($hasVirtual); + $parentThemeA = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); + $parentThemeA->expects($this->any())->method('getFullPath')->willReturn('frontend/Magento/a'); + $parentThemeB = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); + $parentThemeB->expects($this->any())->method('getFullPath')->willReturn('frontend/Magento/b'); + $childThemeC = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); + $childThemeC->expects($this->any())->method('getFullPath')->willReturn('frontend/Magento/c'); + $childThemeD = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); + $childThemeD->expects($this->any())->method('getFullPath')->willReturn('frontend/Magento/d'); + + if ($hasPhysical) { + $childThemeC->expects($this->any())->method('getParentTheme')->willReturn($parentThemeA); + $childThemeD->expects($this->any())->method('getParentTheme')->willReturn($parentThemeB); + } + + $this->themeProvider->expects($this->any())->method('getThemeByFullPath')->willReturn($theme); + $this->collection->expects($this->any()) + ->method('getIterator') + ->willReturn(new \ArrayIterator([$childThemeC, $childThemeD])); + $this->tester->execute($input); + $this->assertContains( + $expected, + $this->tester->getDisplay() + ); + } + + /** + * @return array + */ + public function executeFailedChildThemeCheckDataProvider() + { + return [ + [ + true, + false, + ['theme' => ['frontend/Magento/a']], + 'Unable to uninstall. frontend/Magento/a is a parent of virtual theme' + ], + [ + true, + false, + ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], + 'Unable to uninstall. frontend/Magento/a, frontend/Magento/b are parents of virtual theme' + ], + [ + false, + true, + ['theme' => ['frontend/Magento/a']], + 'Unable to uninstall. frontend/Magento/a is a parent of physical theme' + ], + [ + false, + true, + ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], + 'Unable to uninstall. frontend/Magento/a, frontend/Magento/b are parents of physical theme' + ], + [ + true, + true, + ['theme' => ['frontend/Magento/a']], + 'Unable to uninstall. frontend/Magento/a is a parent of virtual theme' . PHP_EOL . + 'Unable to uninstall. frontend/Magento/a is a parent of physical theme' + ], + [ + true, + true, + ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], + 'Unable to uninstall. frontend/Magento/a, frontend/Magento/b are parents of virtual theme' . PHP_EOL . + 'Unable to uninstall. frontend/Magento/a, frontend/Magento/b are parents of physical theme' + ], + ]; + } + + public function testExecuteFailedThemeInUseCheck() + { + $this->setUpPassValidation(); + $this->themeValidator + ->expects($this->once()) + ->method('validateIsThemeInUse') + ->willReturn(['frontend/Magento/a is in use in default config']); + $this->tester->execute(['theme' => ['frontend/Magento/a']]); + $this->assertEquals('frontend/Magento/a is in use in default config' . PHP_EOL, $this->tester->getDisplay()); + } + + public function testExecuteFailedDependencyCheck() + { + $this->setUpPassValidation(); + $this->setupPassChildThemeCheck(); + $this->dependencyChecker->expects($this->once()) + ->method('checkDependencies') + ->willReturn(['magento/theme-a' => ['magento/theme-b', 'magento/theme-c']]); + $this->tester->execute(['theme' => ['frontend/Magento/a']]); + $this->assertContains( + 'Cannot uninstall frontend/Magento/a because the following package(s) ' . + 'depend on it:' . PHP_EOL . "\tmagento/theme-b" . PHP_EOL . "\tmagento/theme-c", + $this->tester->getDisplay() + ); + } + + public function setUpExecute() + { + $this->setUpPassValidation(); + $this->setupPassChildThemeCheck(); + $this->dependencyChecker->expects($this->once())->method('checkDependencies')->willReturn([]); + $this->remove->expects($this->once())->method('remove'); + $this->cache->expects($this->once())->method('clean'); + $theme = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); + $this->themeProvider->expects($this->any()) + ->method('getThemeByFullPath') + ->willReturn($theme); + } + + public function testExecuteWithBackupCode() + { + $this->setUpExecute(); + $backupRollback = $this->getMock('Magento\Framework\Setup\BackupRollback', [], [], '', false); + $this->backupRollbackFactory->expects($this->once()) + ->method('create') + ->willReturn($backupRollback); + $this->tester->execute(['theme' => ['test'], '--backup-code' => true]); + $this->tester->getDisplay(); + } + + public function testExecute() + { + $this->setUpExecute(); + $this->cleanupFiles->expects($this->never())->method('clearMaterializedViewFiles'); + $this->tester->execute(['theme' => ['test']]); + $this->assertContains('Enabling maintenance mode', $this->tester->getDisplay()); + $this->assertContains('Disabling maintenance mode', $this->tester->getDisplay()); + $this->assertContains('Alert: Generated static view files were not cleared.', $this->tester->getDisplay()); + $this->assertNotContains('Generated static view files cleared successfully', $this->tester->getDisplay()); + } + + public function testExecuteCleanStaticFiles() + { + $this->setUpExecute(); + $this->cleanupFiles->expects($this->once())->method('clearMaterializedViewFiles'); + $this->tester->execute(['theme' => ['test'], '-c' => true]); + $this->assertContains('Enabling maintenance mode', $this->tester->getDisplay()); + $this->assertContains('Disabling maintenance mode', $this->tester->getDisplay()); + $this->assertNotContains('Alert: Generated static view files were not cleared.', $this->tester->getDisplay()); + $this->assertContains('Generated static view files cleared successfully', $this->tester->getDisplay()); + } +} diff --git a/app/code/Magento/Theme/Test/Unit/Model/ThemeValidatorTest.php b/app/code/Magento/Theme/Test/Unit/Model/ThemeValidatorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d6fc5f272f5315d71f74bbb896e187ce90b53cbc --- /dev/null +++ b/app/code/Magento/Theme/Test/Unit/Model/ThemeValidatorTest.php @@ -0,0 +1,91 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** + * Test theme model + */ +namespace Magento\Theme\Test\Unit\Model; + +class ThemeValidatorTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Theme\Model\ThemeValidator + */ + protected $themeValidator; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManager; + + /** + * @var \Magento\Framework\View\Design\Theme\ThemeProviderInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $themeProvider; + + /** + * @var \Magento\Framework\App\Config\Value|\PHPUnit_Framework_MockObject_MockObject + */ + protected $configData; + + protected function setUp() + { + $this->storeManager = $this->getMock('Magento\Store\Model\StoreManagerInterface', [], [], '', false); + $this->themeProvider = $this->getMock( + 'Magento\Framework\View\Design\Theme\ThemeProviderInterface', + [], + [], + '', + false + ); + $this->configData = $this->getMock( + 'Magento\Framework\App\Config\Value', + ['getCollection', 'addFieldToFilter'], + [], + '', + false + ); + $this->themeValidator = new \Magento\Theme\Model\ThemeValidator( + $this->storeManager, + $this->themeProvider, + $this->configData + ); + } + + public function testValidateIsThemeInUse() + { + $theme = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); + $theme->expects($this->once())->method('getId')->willReturn(6); + $defaultEntity = new \Magento\Framework\Object(['value' => 6, 'scope' => 'default', 'scope_id' => 8]); + $websitesEntity = new \Magento\Framework\Object(['value' => 6, 'scope' => 'websites', 'scope_id' => 8]); + $storesEntity = new \Magento\Framework\Object(['value' => 6, 'scope' => 'stores', 'scope_id' => 8]); + $this->themeProvider->expects($this->once())->method('getThemeByFullPath')->willReturn($theme); + $this->configData->expects($this->once())->method('getCollection')->willReturn($this->configData); + $this->configData + ->expects($this->at(1)) + ->method('addFieldToFilter') + ->willReturn($this->configData); + $this->configData + ->expects($this->at(2)) + ->method('addFieldToFilter') + ->willReturn([$defaultEntity, $websitesEntity, $storesEntity]); + $website = $this->getMock('Magento\Store\Model\Website', ['getName'], [], '', false); + $website->expects($this->once())->method('getName')->willReturn('websiteA'); + $store = $this->getMock('Magento\Store\Model\Store', ['getName'], [], '', false); + $store->expects($this->once())->method('getName')->willReturn('storeA'); + $this->storeManager->expects($this->once())->method('getWebsite')->willReturn($website); + $this->storeManager->expects($this->once())->method('getStore')->willReturn($store); + $result = $this->themeValidator->validateIsThemeInUse(['frontend/Magento/a']); + $this->assertEquals( + [ + 'frontend/Magento/a is in use in default config', + 'frontend/Magento/a is in use in website websiteA', + 'frontend/Magento/a is in use in store storeA' + ], + $result + ); + } +} diff --git a/app/code/Magento/Theme/etc/di.xml b/app/code/Magento/Theme/etc/di.xml index e93a6426de508c617f91f4f0e2ed24045fe94096..dd4bbed76b7a9b6f06e298651b6b785fdbb7743b 100644 --- a/app/code/Magento/Theme/etc/di.xml +++ b/app/code/Magento/Theme/etc/di.xml @@ -75,5 +75,12 @@ <argument name="design" xsi:type="object">Magento\Theme\Model\Design\Proxy</argument> </arguments> </type> + <type name="Magento\Framework\Console\CommandList"> + <arguments> + <argument name="commands" xsi:type="array"> + <item name="theme_uninstall" xsi:type="object">Magento\Theme\Console\Command\ThemeUninstallCommand</item> + </argument> + </arguments> + </type> <preference for="Magento\Framework\View\Model\PageLayout\Config\BuilderInterface" type="Magento\Theme\Model\PageLayout\Config\Builder"/> </config> diff --git a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php new file mode 100644 index 0000000000000000000000000000000000000000..b84237bb2cd32233a96cabb23f16ebf6ea0d06b4 --- /dev/null +++ b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php @@ -0,0 +1,162 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Translation\Console\Command; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Magento\Framework\Composer\DependencyChecker; +use Magento\Framework\Composer\Remove; +use Magento\Framework\Composer\ComposerInformation; +use Magento\Framework\App\Cache; +use Magento\Framework\Setup\BackupRollbackFactory; + +/** + * Command for uninstalling language and backup-code feature + */ +class UninstallLanguageCommand extends Command +{ + /** + * Language code argument name + */ + const PACKAGE_ARGUMENT = 'package'; + + /** + * Backup-code option name + */ + const BACKUP_CODE_OPTION = 'backup-code'; + + /** + * @var DependencyChecker + */ + private $dependencyChecker; + + /** + * @var Remove + */ + private $remove; + + /** + * @var ComposerInformation + */ + private $composerInfo; + + /** + * @var Cache + */ + private $cache; + + /** + * @var BackupRollbackFactory + */ + private $backupRollbackFactory; + + /** + * Inject dependencies + * + * @param DependencyChecker $dependencyChecker + * @param Remove $remove + * @param ComposerInformation $composerInfo + * @param Cache $cache + * @param BackupRollbackFactory $backupRollbackFactory + */ + public function __construct( + DependencyChecker $dependencyChecker, + Remove $remove, + ComposerInformation $composerInfo, + Cache $cache, + BackupRollbackFactory $backupRollbackFactory + ) { + $this->dependencyChecker = $dependencyChecker; + $this->remove = $remove; + $this->composerInfo = $composerInfo; + $this->cache = $cache; + $this->backupRollbackFactory = $backupRollbackFactory; + + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('i18n:uninstall') + ->setDescription('Uninstalls language packages') + ->setDefinition([ + new InputArgument( + self::PACKAGE_ARGUMENT, + InputArgument::IS_ARRAY | InputArgument::REQUIRED, + 'Language package name' + ), + new InputOption( + self::BACKUP_CODE_OPTION, + '-b', + InputOption::VALUE_NONE, + 'Take code and configuration files backup (excluding temporary files)' + ), + ]); + + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $languages = $input->getArgument(self::PACKAGE_ARGUMENT); + $packagesToRemove = []; + $dependencies = $this->dependencyChecker->checkDependencies($languages, true); + + foreach ($languages as $package) { + if (!$this->validate($package)) { + $output->writeln("<info>Package $package is not a Magento language and will be skipped.</info>"); + } else { + if (sizeof($dependencies[$package]) > 0) { + $output->writeln("<info>Package $package has dependencies and will be skipped.</info>"); + } else { + $packagesToRemove[] = $package; + } + } + } + + if ($packagesToRemove !== []) { + if ($input->getOption(self::BACKUP_CODE_OPTION)) { + $backupRestore = $this->backupRollbackFactory->create($output); + $backupRestore->codeBackup(time()); + } else { + $output->writeln('<info>You are removing language package without a code backup.</info>'); + } + + $this->remove->remove($packagesToRemove); + $this->cache->clean(); + } else { + $output->writeln('<info>Nothing is removed.</info>'); + } + } + + /** + * Validates user input + * + * @param string $package + * + * @return bool + */ + private function validate($package) + { + $installedPackages = $this->composerInfo->getRootRequiredPackagesAndTypes(); + + if (isset($installedPackages[$package]) && $installedPackages[$package] === 'magento2-language') { + return true; + } + + return false; + } +} diff --git a/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php b/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2f0cd02c6c9ea0f0e58128c6a999c6d86136fdf7 --- /dev/null +++ b/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php @@ -0,0 +1,198 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Translation\Test\Unit\Console\Command; + +use Magento\Framework\Composer\DependencyChecker; +use Magento\Framework\Composer\Remove; +use Magento\Framework\Composer\ComposerInformation; +use Magento\Framework\App\Cache; +use Symfony\Component\Console\Tester\CommandTester; +use Magento\Translation\Console\Command\UninstallLanguageCommand; +use Magento\Framework\Setup\BackupRollbackFactory; + +class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var DependencyChecker|\PHPUnit_Framework_MockObject_MockObject + */ + private $dependencyChecker; + + /** + * @var Remove|\PHPUnit_Framework_MockObject_MockObject + */ + private $remove; + + /** + * @var ComposerInformation|\PHPUnit_Framework_MockObject_MockObject + */ + private $composerInfo; + + /** + * @var Cache|\PHPUnit_Framework_MockObject_MockObject + */ + private $cache; + + /** + * @var BackupRollbackFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $backupRollbackFactory; + + /** + * @var UninstallLanguageCommand + */ + private $command; + + /** + * @var CommandTester + */ + private $tester; + + public function setUp() + { + $this->dependencyChecker = $this->getMock( + 'Magento\Framework\Composer\DependencyChecker', + [], + [], + '', + false + ); + $this->remove = $this->getMock('Magento\Framework\Composer\Remove', [], [], '', false); + $this->composerInfo = $this->getMock('Magento\Framework\Composer\ComposerInformation', [], [], '', false); + $this->cache = $this->getMock('Magento\Framework\App\Cache', [], [], '', false); + $this->backupRollbackFactory = $this->getMock( + 'Magento\Framework\Setup\BackupRollbackFactory', + [], + [], + '', + false + ); + + + $this->command = new UninstallLanguageCommand( + $this->dependencyChecker, + $this->remove, + $this->composerInfo, + $this->cache, + $this->backupRollbackFactory + ); + + $this->tester = new CommandTester($this->command); + } + + public function testExecute() + { + $dependencies['vendor/language-ua_ua'] = []; + + $this->dependencyChecker->expects($this->once()) + ->method('checkDependencies') + ->with(['vendor/language-ua_ua']) + ->willReturn($dependencies); + + $this->composerInfo->expects($this->once()) + ->method('getRootRequiredPackagesAndTypes') + ->willReturn( + [ + 'vendor/language-ua_ua' => 'magento2-language' + ] + ); + + $backupRollback = $this->getMock('Magento\Framework\Setup\BackupRollback', [], [], '', false); + $backupRollback->expects($this->once())->method('codeBackup'); + + $this->backupRollbackFactory->expects($this->once()) + ->method('create') + ->willReturn($backupRollback); + + $this->remove->expects($this->once())->method('remove'); + $this->cache->expects($this->once())->method('clean'); + + $this->tester->execute(['package' => ['vendor/language-ua_ua'], '--backup-code' => true]); + } + + public function testExecuteNoBackupOption() + { + $dependencies['vendor/language-ua_ua'] = []; + + $this->dependencyChecker->expects($this->once()) + ->method('checkDependencies') + ->with(['vendor/language-ua_ua']) + ->willReturn($dependencies); + + $this->composerInfo->expects($this->once()) + ->method('getRootRequiredPackagesAndTypes') + ->willReturn( + [ + 'vendor/language-ua_ua' => 'magento2-language' + ] + ); + + $this->backupRollbackFactory->expects($this->never())->method('create'); + $this->remove->expects($this->once())->method('remove'); + $this->cache->expects($this->once())->method('clean'); + + $this->tester->execute(['package' => ['vendor/language-ua_ua']]); + $this->assertContains('You are removing language package without a code backup.', $this->tester->getDisplay()); + } + + public function testExecutePackageHasDependency() + { + $dependencies['vendor/language-ua_ua'] = ['some/dependency']; + + $this->dependencyChecker->expects($this->once()) + ->method('checkDependencies') + ->with(['vendor/language-ua_ua']) + ->willReturn($dependencies); + + $this->composerInfo->expects($this->once()) + ->method('getRootRequiredPackagesAndTypes') + ->willReturn( + [ + 'vendor/language-ua_ua' => 'magento2-language' + ] + ); + + $this->remove->expects($this->never())->method('remove'); + $this->cache->expects($this->never())->method('clean'); + + $this->tester->execute(['package' => ['vendor/language-ua_ua']]); + $this->assertContains( + 'Package vendor/language-ua_ua has dependencies and will be skipped', + $this->tester->getDisplay() + ); + $this->assertContains('Nothing is removed.', $this->tester->getDisplay()); + } + + + + public function testExecutePackageNoLanguage() + { + $dependencies['vendor/language-ua_ua'] = []; + + $this->dependencyChecker->expects($this->once()) + ->method('checkDependencies') + ->with(['vendor/language-ua_ua']) + ->willReturn($dependencies); + + $this->composerInfo->expects($this->once()) + ->method('getRootRequiredPackagesAndTypes') + ->willReturn( + [ + 'vendor/language-ua_ua' => 'library' + ] + ); + + $this->remove->expects($this->never())->method('remove'); + $this->cache->expects($this->never())->method('clean'); + + $this->tester->execute(['package' => ['vendor/language-ua_ua']]); + $this->assertContains( + 'Package vendor/language-ua_ua is not a Magento language and will be skipped', + $this->tester->getDisplay() + ); + $this->assertContains('Nothing is removed.', $this->tester->getDisplay()); + } +} diff --git a/app/code/Magento/Translation/etc/di.xml b/app/code/Magento/Translation/etc/di.xml index c411e653425d197cc7fc4096d6426113ccd94aa1..0c1b01ddd6a136c8c0e3a0b1116891f958fd2165 100644 --- a/app/code/Magento/Translation/etc/di.xml +++ b/app/code/Magento/Translation/etc/di.xml @@ -77,4 +77,11 @@ </argument> </arguments> </type> + <type name="Magento\Framework\Console\CommandList"> + <arguments> + <argument name="commands" xsi:type="array"> + <item name="uninstall_language" xsi:type="object">Magento\Translation\Console\Command\UninstallLanguageCommand</item> + </argument> + </arguments> + </type> </config> diff --git a/app/code/Magento/User/Model/UserInterface.php b/app/code/Magento/User/Api/Data/UserInterface.php similarity index 91% rename from app/code/Magento/User/Model/UserInterface.php rename to app/code/Magento/User/Api/Data/UserInterface.php index 4b4cecf569a0141995307e21b9afcda647383e2e..c5de7bd1bc5e8b6b24b9ea2c4fcfb1e4c6167bb9 100644 --- a/app/code/Magento/User/Model/UserInterface.php +++ b/app/code/Magento/User/Api/Data/UserInterface.php @@ -3,7 +3,7 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\User\Model; +namespace Magento\User\Api\Data; /** * Admin user interface. @@ -14,119 +14,119 @@ interface UserInterface { /** * Get ID. - * + * * @return int */ public function getId(); - + /** * Set ID. - * + * * @param int $id * @return $this */ public function setId($id); - + /** * Get first name. - * + * * @return string */ public function getFirstName(); - + /** * Set first name. - * + * * @param string $firstName * @return $this */ public function setFirstName($firstName); - + /** * Get last name. - * + * * @return string */ public function getLastName(); - + /** * Set last name. - * + * * @param string $lastName * @return $this */ public function setLastName($lastName); - + /** * Get email. - * + * * @return string */ public function getEmail(); - + /** * Set email. - * + * * @param string $email * @return $this */ public function setEmail($email); - + /** * Get user name. - * + * * @return string */ public function getUserName(); - + /** * Set user name. - * + * * @param string $userName * @return $this */ public function setUserName($userName); - + /** * Get password or password hash. - * + * * @return string */ public function getPassword(); - + /** * Set password or password hash. - * + * * @param string $password * @return $this */ public function setPassword($password); - + /** * Get user record creation date. - * + * * @return string */ public function getCreated(); - + /** * Set user record creation date. - * + * * @param string $created * @return $this */ public function setCreated($created); - + /** * Get user record modification date. - * + * * @return string */ public function getModified(); - + /** * Set user record modification date. - * + * * @param string $modified * @return $this */ diff --git a/app/code/Magento/User/Model/User.php b/app/code/Magento/User/Model/User.php index 9ab8a1039fcfba15ddc0e486a674098a6435878a..b152509226ddb7602511f4c53240ccddb7008e95 100644 --- a/app/code/Magento/User/Model/User.php +++ b/app/code/Magento/User/Model/User.php @@ -8,6 +8,7 @@ namespace Magento\User\Model; use Magento\Backend\Model\Auth\Credential\StorageInterface; use Magento\Framework\Model\AbstractModel; use Magento\Framework\Exception\AuthenticationException; +use Magento\User\Api\Data\UserInterface; /** * Admin user model diff --git a/app/code/Magento/User/etc/di.xml b/app/code/Magento/User/etc/di.xml index f76198da27e609b2a67a8542713ca1f3d1db275a..962ccc2aa632a968ec83f007587c661eb81447cd 100644 --- a/app/code/Magento/User/etc/di.xml +++ b/app/code/Magento/User/etc/di.xml @@ -14,5 +14,5 @@ <type name="Magento\Authorization\Model\Role"> <plugin name="updateRoleUsersAcl" type="Magento\User\Model\Plugin\AuthorizationRole" sortOrder="20"/> </type> - <preference for="Magento\User\Model\UserInterface" type="Magento\User\Model\User" /> + <preference for="Magento\User\Api\Data\UserInterface" type="Magento\User\Model\User" /> </config> diff --git a/app/etc/di.xml b/app/etc/di.xml index 02cd1c358cb7e8dc35047c83454ac62ef6ff0e59..87986caa2ba5a6c7d4ef52c9de211d4b269ab96c 100644 --- a/app/etc/di.xml +++ b/app/etc/di.xml @@ -34,6 +34,8 @@ <argument name="currencyInstalled" xsi:type="string">system/currency/installed</argument> </arguments> </type> + <preference for="Magento\Framework\Api\ExtensionAttribute\JoinDataInterface" type="Magento\Framework\Api\ExtensionAttribute\JoinData" /> + <preference for="Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface" type="Magento\Framework\Api\ExtensionAttribute\JoinProcessor" /> <preference for="Magento\Framework\Locale\ConfigInterface" type="Magento\Framework\Locale\Config" /> <preference for="Magento\Framework\Notification\NotifierInterface" type="Magento\Framework\Notification\NotifierPool" /> <preference for="Magento\Framework\UrlInterface" type="Magento\Framework\Url" /> diff --git a/composer.json b/composer.json index 1879c7e9d60a5286dc36cb420766b99cd5c9b492..a62e8ac4890d7f482ea330efd803bc451ea1ed8f 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "oyejorge/less.php": "1.7.0.3", "tubalmartin/cssmin": "2.4.8-p4", "magento/magento-composer-installer": "*", - "symfony/console": "~2.3" + "symfony/console": "~2.3 <2.7" }, "require-dev": { "phpunit/phpunit": "4.1.0", diff --git a/composer.lock b/composer.lock index 2436cff71f1c366b3f281cc5a8c44a59a25762f5..beefd078b4aef16f33d39fdb819c7bb8aa06aef3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "55186e4b1650ca5f2ad865799800f636", + "hash": "a62e70bed8efa22bebb0fedf63b51925", "packages": [ { "name": "composer/composer", @@ -49,7 +49,7 @@ "Composer": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -76,20 +76,20 @@ }, { "name": "justinrainbow/json-schema", - "version": "1.4.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3" + "reference": "7dfe4f1db8a62be3dd35710efce663537d515653" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2465fe486c864e30badaa4d005ebdf89dbc503f3", - "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/7dfe4f1db8a62be3dd35710efce663537d515653", + "reference": "7dfe4f1db8a62be3dd35710efce663537d515653", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.3.2" }, "require-dev": { "json-schema/json-schema-test-suite": "1.1.0", @@ -110,7 +110,7 @@ "JsonSchema": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -138,7 +138,7 @@ "json", "schema" ], - "time": "2015-03-27 16:41:39" + "time": "2015-06-14 20:01:28" }, { "name": "magento/magento-composer-installer", @@ -178,7 +178,7 @@ "MagentoHackathon\\Composer\\Magento": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "OSL-3.0" ], @@ -248,7 +248,7 @@ "Zend_": "library/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "include-path": [ "library/" ], @@ -315,7 +315,7 @@ "Monolog\\": "src/Monolog" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -364,7 +364,7 @@ "lessc.inc.php" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], @@ -414,7 +414,7 @@ "Psr\\Log\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -458,7 +458,7 @@ "Seld\\JsonLint\\": "src/Seld/JsonLint/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -480,20 +480,21 @@ }, { "name": "symfony/console", - "version": "v2.7.1", + "version": "v2.6.9", + "target-dir": "Symfony/Component/Console", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "564398bc1f33faf92fc2ec86859983d30eb81806" + "reference": "b5ec0c11a204718f2b656357f5505a8e578f30dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/564398bc1f33faf92fc2ec86859983d30eb81806", - "reference": "564398bc1f33faf92fc2ec86859983d30eb81806", + "url": "https://api.github.com/repos/symfony/Console/zipball/b5ec0c11a204718f2b656357f5505a8e578f30dd", + "reference": "b5ec0c11a204718f2b656357f5505a8e578f30dd", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.3.3" }, "require-dev": { "psr/log": "~1.0", @@ -509,15 +510,15 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.6-dev" } }, "autoload": { - "psr-4": { + "psr-0": { "Symfony\\Component\\Console\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -533,7 +534,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-06-10 15:30:22" + "time": "2015-05-29 14:42:58" }, { "name": "symfony/finder", @@ -566,7 +567,7 @@ "Symfony\\Component\\Finder\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -615,7 +616,7 @@ "Symfony\\Component\\Process\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -656,7 +657,7 @@ "cssmin.php" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -683,12 +684,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-code.git", - "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140" + "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-code/zipball/0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", - "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", + "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3", "shasum": "" }, "require": { @@ -697,9 +698,6 @@ }, "require-dev": { "doctrine/common": ">=2.1", - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-stdlib": "self.version" }, "suggest": { @@ -715,20 +713,20 @@ }, "autoload": { "psr-4": { - "Zend\\Code\\": "src/" + "Zend\\Code\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides facilities to generate arbitrary code using an object oriented interface", - "homepage": "https://github.com/zendframework/zend-code", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "code", "zf2" ], - "time": "2015-03-31 15:39:14" + "time": "2015-04-01 17:59:08" }, { "name": "zendframework/zend-config", @@ -736,12 +734,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-config.git", - "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d" + "reference": "8682fe4e2923b383bb6472fc84b5796a07589163" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-config/zipball/95f3a4b3fa85d49e6f060183122de4596fa6d29d", - "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d", + "reference": "8682fe4e2923b383bb6472fc84b5796a07589163", "shasum": "" }, "require": { @@ -749,9 +747,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-filter": "self.version", "zendframework/zend-i18n": "self.version", "zendframework/zend-json": "self.version", @@ -772,20 +767,20 @@ }, "autoload": { "psr-4": { - "Zend\\Config\\": "src/" + "Zend\\Config\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides a nested object property based user interface for accessing this configuration data within application code", - "homepage": "https://github.com/zendframework/zend-config", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "config", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 17:59:31" }, { "name": "zendframework/zend-console", @@ -793,23 +788,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-console.git", - "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7" + "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-console/zipball/54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", - "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", + "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca", "shasum": "" }, "require": { "php": ">=5.3.23", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "suggest": { "zendframework/zend-filter": "To support DefaultRouteMatcher usage", "zendframework/zend-validator": "To support DefaultRouteMatcher usage" @@ -823,19 +813,19 @@ }, "autoload": { "psr-4": { - "Zend\\Console\\": "src/" + "Zend\\Console\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-console", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "console", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 17:59:48" }, { "name": "zendframework/zend-di", @@ -843,12 +833,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-di.git", - "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2" + "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-di/zipball/b9f8de081adecf71a003a569e9ba76c0a4c00bf2", - "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2", + "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190", "shasum": "" }, "require": { @@ -857,9 +847,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -874,19 +861,19 @@ }, "autoload": { "psr-4": { - "Zend\\Di\\": "src/" + "Zend\\Di\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-di", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "di", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:01:30" }, { "name": "zendframework/zend-escaper", @@ -894,22 +881,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-escaper.git", - "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97" + "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/15e5769e4fcdb4bf07ebd76500810e7070e23a97", - "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97", + "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -919,19 +901,19 @@ }, "autoload": { "psr-4": { - "Zend\\Escaper\\": "src/" + "Zend\\Escaper\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-escaper", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "escaper", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:02:07" }, { "name": "zendframework/zend-eventmanager", @@ -939,23 +921,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "58d21c95c7005a527262fd536499195f104e83f9" + "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/58d21c95c7005a527262fd536499195f104e83f9", - "reference": "58d21c95c7005a527262fd536499195f104e83f9", + "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695", "shasum": "" }, "require": { "php": ">=5.3.23", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -965,19 +942,19 @@ }, "autoload": { "psr-4": { - "Zend\\EventManager\\": "src/" + "Zend\\EventManager\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-event-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "eventmanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:05:26" }, { "name": "zendframework/zend-filter", @@ -985,12 +962,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-filter.git", - "reference": "6d8aed2da81b62a04747346c4370562cdbe34595" + "reference": "b13741a88553351fc52472de529b57b580b8f6f1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/6d8aed2da81b62a04747346c4370562cdbe34595", - "reference": "6d8aed2da81b62a04747346c4370562cdbe34595", + "reference": "b13741a88553351fc52472de529b57b580b8f6f1", "shasum": "" }, "require": { @@ -998,9 +975,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-crypt": "self.version", "zendframework/zend-servicemanager": "self.version", "zendframework/zend-uri": "self.version" @@ -1020,20 +994,20 @@ }, "autoload": { "psr-4": { - "Zend\\Filter\\": "src/" + "Zend\\Filter\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides a set of commonly needed data filters", - "homepage": "https://github.com/zendframework/zend-filter", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "filter", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-form", @@ -1041,12 +1015,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-form.git", - "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3" + "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-form/zipball/bca0db55718355d25c2c10fdd41a83561f1c94b3", - "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3", + "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3", "shasum": "" }, "require": { @@ -1055,9 +1029,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-captcha": "self.version", "zendframework/zend-code": "self.version", "zendframework/zend-eventmanager": "self.version", @@ -1088,19 +1059,19 @@ }, "autoload": { "psr-4": { - "Zend\\Form\\": "src/" + "Zend\\Form\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-form", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "form", "zf2" ], - "time": "2015-03-28 20:29:18" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-http", @@ -1108,12 +1079,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-http.git", - "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb" + "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-http/zipball/9c6047a0bdb3094d3ea07a215ff929cc47de4deb", - "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb", + "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5", "shasum": "" }, "require": { @@ -1123,11 +1094,6 @@ "zendframework/zend-uri": "self.version", "zendframework/zend-validator": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1137,20 +1103,20 @@ }, "autoload": { "psr-4": { - "Zend\\Http\\": "src/" + "Zend\\Http\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", - "homepage": "https://github.com/zendframework/zend-http", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "http", "zf2" ], - "time": "2015-03-27 15:46:30" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-i18n", @@ -1158,12 +1124,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-i18n.git", - "reference": "9aebc5287373a802540d75fe5508417f866c2e52" + "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/9aebc5287373a802540d75fe5508417f866c2e52", - "reference": "9aebc5287373a802540d75fe5508417f866c2e52", + "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd", "shasum": "" }, "require": { @@ -1171,9 +1137,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-cache": "self.version", "zendframework/zend-config": "self.version", "zendframework/zend-eventmanager": "self.version", @@ -1202,19 +1165,19 @@ }, "autoload": { "psr-4": { - "Zend\\I18n\\": "src/" + "Zend\\I18n\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-i18n", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "i18n", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-inputfilter", @@ -1222,12 +1185,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-inputfilter.git", - "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93" + "reference": "16856fec61f285e41e5492235220a4dec06ab90f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/4b1398f3635fae3cc5e873c5bb067274f3d10a93", - "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93", + "reference": "16856fec61f285e41e5492235220a4dec06ab90f", "shasum": "" }, "require": { @@ -1237,9 +1200,6 @@ "zendframework/zend-validator": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -1254,19 +1214,19 @@ }, "autoload": { "psr-4": { - "Zend\\InputFilter\\": "src/" + "Zend\\InputFilter\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-input-filter", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "inputfilter", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-json", @@ -1274,12 +1234,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-json.git", - "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f" + "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-json/zipball/2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", - "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", + "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c", "shasum": "" }, "require": { @@ -1287,9 +1247,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-http": "self.version", "zendframework/zend-server": "self.version" }, @@ -1307,20 +1264,20 @@ }, "autoload": { "psr-4": { - "Zend\\Json\\": "src/" + "Zend\\Json\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", - "homepage": "https://github.com/zendframework/zend-json", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "json", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-loader", @@ -1328,22 +1285,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-loader.git", - "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4" + "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-loader/zipball/65de2c7a56f8eee633c6bf1cfab73e45648880d4", - "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4", + "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1353,19 +1305,19 @@ }, "autoload": { "psr-4": { - "Zend\\Loader\\": "src/" + "Zend\\Loader\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-loader", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "loader", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-log", @@ -1373,12 +1325,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-log.git", - "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd" + "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-log/zipball/002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", - "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", + "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e", "shasum": "" }, "require": { @@ -1387,9 +1339,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-console": "self.version", "zendframework/zend-db": "self.version", "zendframework/zend-escaper": "self.version", @@ -1413,21 +1362,21 @@ }, "autoload": { "psr-4": { - "Zend\\Log\\": "src/" + "Zend\\Log\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "component for general purpose logging", - "homepage": "https://github.com/zendframework/zend-log", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "log", "logging", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-math", @@ -1435,22 +1384,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-math.git", - "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73" + "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-math/zipball/f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", - "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", + "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "suggest": { "ext-bcmath": "If using the bcmath functionality", "ext-gmp": "If using the gmp functionality", @@ -1466,19 +1410,19 @@ }, "autoload": { "psr-4": { - "Zend\\Math\\": "src/" + "Zend\\Math\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-math", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "math", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-modulemanager", @@ -1486,12 +1430,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-modulemanager.git", - "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f" + "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-modulemanager/zipball/af7ae3cd29a1efb73cc66ae1081e606039d5c20f", - "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f", + "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf", "shasum": "" }, "require": { @@ -1500,9 +1444,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-config": "self.version", "zendframework/zend-console": "self.version", "zendframework/zend-loader": "self.version", @@ -1524,19 +1465,19 @@ }, "autoload": { "psr-4": { - "Zend\\ModuleManager\\": "src/" + "Zend\\ModuleManager\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-module-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "modulemanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-mvc", @@ -1544,12 +1485,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-mvc.git", - "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431" + "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-mvc/zipball/0b4a4a829b30be510a3f215c4ff00c703ee8b431", - "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431", + "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412", "shasum": "" }, "require": { @@ -1560,9 +1501,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-authentication": "self.version", "zendframework/zend-console": "self.version", "zendframework/zend-di": "self.version", @@ -1611,19 +1549,19 @@ }, "autoload": { "psr-4": { - "Zend\\Mvc\\": "src/" + "Zend\\Mvc\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-mvc", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "mvc", "zf2" ], - "time": "2015-03-26 18:55:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-serializer", @@ -1631,12 +1569,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-serializer.git", - "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09" + "reference": "a46960854d6326f0036d98c9abc7a79e36e25928" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/3c531789a9882a5deb721356a7bd2642b65d4b09", - "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09", + "reference": "a46960854d6326f0036d98c9abc7a79e36e25928", "shasum": "" }, "require": { @@ -1646,9 +1584,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -1663,20 +1598,20 @@ }, "autoload": { "psr-4": { - "Zend\\Serializer\\": "src/" + "Zend\\Serializer\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", - "homepage": "https://github.com/zendframework/zend-serializer", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "serializer", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-server", @@ -1684,12 +1619,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-server.git", - "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49" + "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-server/zipball/d11ff0bd529d202022823d4accf5983cbd50fc49", - "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49", + "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e", "shasum": "" }, "require": { @@ -1697,11 +1632,6 @@ "zendframework/zend-code": "self.version", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1711,19 +1641,19 @@ }, "autoload": { "psr-4": { - "Zend\\Server\\": "src/" + "Zend\\Server\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-server", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "server", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-servicemanager", @@ -1731,21 +1661,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-servicemanager.git", - "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083" + "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/57cf99fa5ac08c05a135a8d0d676c52a5e450083", - "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083", + "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9", "shasum": "" }, "require": { "php": ">=5.3.23" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-di": "self.version" }, "suggest": { @@ -1761,19 +1688,19 @@ }, "autoload": { "psr-4": { - "Zend\\ServiceManager\\": "src/" + "Zend\\ServiceManager\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-service-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "servicemanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-soap", @@ -1781,12 +1708,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-soap.git", - "reference": "a599463aba97ce247faf3fb443e3c7858b46449b" + "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-soap/zipball/a599463aba97ce247faf3fb443e3c7858b46449b", - "reference": "a599463aba97ce247faf3fb443e3c7858b46449b", + "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f", "shasum": "" }, "require": { @@ -1796,9 +1723,6 @@ "zendframework/zend-uri": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-http": "self.version" }, "suggest": { @@ -1813,19 +1737,19 @@ }, "autoload": { "psr-4": { - "Zend\\Soap\\": "src/" + "Zend\\Soap\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-soap", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "soap", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-stdlib", @@ -1833,21 +1757,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-stdlib.git", - "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3" + "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cf05c5ba75606e47ffee91cedc72778da46f74c3", - "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3", + "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030", "shasum": "" }, "require": { "php": ">=5.3.23" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-eventmanager": "self.version", "zendframework/zend-filter": "self.version", "zendframework/zend-serializer": "self.version", @@ -1868,19 +1789,19 @@ }, "autoload": { "psr-4": { - "Zend\\Stdlib\\": "src/" + "Zend\\Stdlib\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-stdlib", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "stdlib", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-text", @@ -1888,12 +1809,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-text.git", - "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7" + "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-text/zipball/d962ea25647b20527f3ca34ae225bbc885dabfc7", - "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7", + "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2", "shasum": "" }, "require": { @@ -1901,11 +1822,6 @@ "zendframework/zend-servicemanager": "self.version", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1915,19 +1831,19 @@ }, "autoload": { "psr-4": { - "Zend\\Text\\": "src/" + "Zend\\Text\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-text", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "text", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-uri", @@ -1935,12 +1851,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-uri.git", - "reference": "bd9e625639415376f6a82551c73328448d7bc7d1" + "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-uri/zipball/bd9e625639415376f6a82551c73328448d7bc7d1", - "reference": "bd9e625639415376f6a82551c73328448d7bc7d1", + "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16", "shasum": "" }, "require": { @@ -1948,11 +1864,6 @@ "zendframework/zend-escaper": "self.version", "zendframework/zend-validator": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1962,20 +1873,20 @@ }, "autoload": { "psr-4": { - "Zend\\Uri\\": "src/" + "Zend\\Uri\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", - "homepage": "https://github.com/zendframework/zend-uri", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "uri", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-validator", @@ -1983,12 +1894,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-validator.git", - "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f" + "reference": "eb678d20256f120a72ca27276bbb2875841701ab" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-validator/zipball/45fac2545a0f2eb66d71cb7966feee481e7c475f", - "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f", + "reference": "eb678d20256f120a72ca27276bbb2875841701ab", "shasum": "" }, "require": { @@ -1996,9 +1907,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-db": "self.version", "zendframework/zend-filter": "self.version", "zendframework/zend-i18n": "self.version", @@ -2026,20 +1934,20 @@ }, "autoload": { "psr-4": { - "Zend\\Validator\\": "src/" + "Zend\\Validator\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides a set of commonly needed validators", - "homepage": "https://github.com/zendframework/zend-validator", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "validator", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:30" }, { "name": "zendframework/zend-view", @@ -2047,12 +1955,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-view.git", - "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9" + "reference": "e119b4b5f082af58a96eb206e782b62c193227bf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-view/zipball/37beb1ad46e530f627b4b6c3716efd728e976ba9", - "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9", + "reference": "e119b4b5f082af58a96eb206e782b62c193227bf", "shasum": "" }, "require": { @@ -2062,9 +1970,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-authentication": "self.version", "zendframework/zend-escaper": "self.version", "zendframework/zend-feed": "self.version", @@ -2103,35 +2008,35 @@ }, "autoload": { "psr-4": { - "Zend\\View\\": "src/" + "Zend\\View\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides a system of helpers, output filters, and variable escaping", - "homepage": "https://github.com/zendframework/zend-view", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "view", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:30" } ], "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.0.4", + "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", "shasum": "" }, "require": { @@ -2142,7 +2047,7 @@ "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "2.0.*@ALPHA" + "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { @@ -2151,11 +2056,11 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\Instantiator\\": "src" + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2172,20 +2077,20 @@ "constructor", "instantiate" ], - "time": "2014-10-13 12:58:55" + "time": "2015-06-14 21:17:01" }, { "name": "fabpot/php-cs-fixer", - "version": "v1.8.1", + "version": "v1.9", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "c1e28e95a978e967dade5469a4bf88162faa67bf" + "reference": "ef528b9d3f1dd66197baabf8f77c8402c62bb9fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c1e28e95a978e967dade5469a4bf88162faa67bf", - "reference": "c1e28e95a978e967dade5469a4bf88162faa67bf", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/ef528b9d3f1dd66197baabf8f77c8402c62bb9fc", + "reference": "ef528b9d3f1dd66197baabf8f77c8402c62bb9fc", "shasum": "" }, "require": { @@ -2211,7 +2116,7 @@ "Symfony\\CS\\": "Symfony/CS/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2226,7 +2131,7 @@ } ], "description": "A tool to automatically fix PHP code style", - "time": "2015-05-29 06:10:12" + "time": "2015-06-13 09:30:19" }, { "name": "league/climate", @@ -2255,7 +2160,7 @@ "League\\CLImate\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2316,7 +2221,7 @@ "OAuth\\Unit": "tests" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2371,7 +2276,7 @@ "PDepend\\": "src/main/php/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2412,7 +2317,7 @@ "PHPMD\\": "src/main/php" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2482,7 +2387,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2525,7 +2430,7 @@ "File/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], @@ -2570,7 +2475,7 @@ "Text/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], @@ -2593,16 +2498,16 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.5", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d", + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d", "shasum": "" }, "require": { @@ -2611,13 +2516,10 @@ "type": "library", "autoload": { "classmap": [ - "PHP/" + "src/" ] }, - "notification-url": "http://packagist.org/downloads/", - "include-path": [ - "" - ], + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2633,7 +2535,7 @@ "keywords": [ "timer" ], - "time": "2013-08-02 07:42:54" + "time": "2015-06-13 07:35:30" }, { "name": "phpunit/php-token-stream", @@ -2667,7 +2569,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2734,7 +2636,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "include-path": [ "", "../../symfony/yaml/" @@ -2794,7 +2696,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2846,7 +2748,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2908,7 +2810,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2960,7 +2862,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3011,7 +2913,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3076,7 +2978,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3118,7 +3020,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3172,7 +3074,7 @@ "StaticReview\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3243,7 +3145,7 @@ "CodeSniffer/Standards/Zend/Sniffs/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3293,7 +3195,7 @@ "Symfony\\Component\\Config\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3353,7 +3255,7 @@ "Symfony\\Component\\DependencyInjection\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3411,7 +3313,7 @@ "Symfony\\Component\\EventDispatcher\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3460,7 +3362,7 @@ "Symfony\\Component\\Filesystem\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3509,7 +3411,7 @@ "Symfony\\Component\\Stopwatch\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3558,7 +3460,7 @@ "Symfony\\Component\\Yaml\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], diff --git a/dev/tests/api-functional/_files/Magento/TestJoinDirectives/Api/TestRepositoryInterface.php b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/Api/TestRepositoryInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..fd70ae4b5fb01e60282b453577e62af448eff641 --- /dev/null +++ b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/Api/TestRepositoryInterface.php @@ -0,0 +1,20 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestJoinDirectives\Api; + +/** + * Interface TestRepositoryInterface + */ +interface TestRepositoryInterface +{ + /** + * Get list of quotes + * + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria + * @return \Magento\Quote\Api\Data\CartSearchResultsInterface + */ + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); +} diff --git a/dev/tests/api-functional/_files/Magento/TestJoinDirectives/Model/TestRepository.php b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/Model/TestRepository.php new file mode 100644 index 0000000000000000000000000000000000000000..42cedf2108dfa5bd2d2107de43f25988a9c57ee4 --- /dev/null +++ b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/Model/TestRepository.php @@ -0,0 +1,58 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestJoinDirectives\Model; + +use Magento\TestJoinDirectives\Api\TestRepositoryInterface; +use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; + +/** + * Model TestRepository + */ +class TestRepository implements TestRepositoryInterface +{ + /** + * @var \Magento\Quote\Model\Resource\Quote\CollectionFactory + */ + private $quoteCollectionFactory; + + /** + * @var \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory + */ + private $searchResultsDataFactory; + + /** + * @var JoinProcessorInterface + */ + private $extensionAttributesJoinProcessor; + + /** + * @param \Magento\Quote\Model\Resource\Quote\CollectionFactory $quoteCollectionFactory + * @param \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory $searchResultsDataFactory + * @param JoinProcessorInterface $extensionAttributesJoinProcessor + */ + public function __construct( + \Magento\Quote\Model\Resource\Quote\CollectionFactory $quoteCollectionFactory, + \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory $searchResultsDataFactory, + JoinProcessorInterface $extensionAttributesJoinProcessor + ) { + $this->quoteCollectionFactory = $quoteCollectionFactory; + $this->searchResultsDataFactory = $searchResultsDataFactory; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; + } + + /** + * {@inheritdoc} + */ + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) + { + $quoteCollection = $this->quoteCollectionFactory->create(); + $this->extensionAttributesJoinProcessor->process($quoteCollection); + $searchData = $this->searchResultsDataFactory->create(); + $searchData->setSearchCriteria($searchCriteria); + $searchData->setItems($quoteCollection->getItems()); + return $searchData; + } +} diff --git a/dev/tests/api-functional/_files/Magento/TestJoinDirectives/composer.json b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/composer.json new file mode 100644 index 0000000000000000000000000000000000000000..72d19bcf34cfb159198b4addc55a41eeda55fa04 --- /dev/null +++ b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/composer.json @@ -0,0 +1,20 @@ +{ + "name": "magento/module-test-join-directives", + "description": "test integration for join directives", + "require": { + "php": "~5.5.0|~5.6.0", + "magento/framework": "0.42.0-beta8", + "magento/module-sales": "0.42.0-beta8", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-module", + "version": "1.0", + "extra": { + "map": [ + [ + "*", + "Magento/TestModuleJoinDirectives" + ] + ] + } +} diff --git a/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/acl.xml b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/acl.xml new file mode 100644 index 0000000000000000000000000000000000000000..ad548566ba7d1dc2cb7be0ce6a07b619708810f4 --- /dev/null +++ b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/acl.xml @@ -0,0 +1,18 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd"> + <acl> + <resources> + <resource id="Magento_Backend::admin"> + <resource id="Magento_TestJoinDirectives::all" title="TestJoinDirectives" sortOrder="1"> + <resource id="Magento_TestJoinDirectives::getList" title="GetList" sortOrder="10"/> + </resource> + </resource> + </resources> + </acl> +</config> diff --git a/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/di.xml b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/di.xml new file mode 100644 index 0000000000000000000000000000000000000000..a3633a8adf41f671a28221295746a2ad7ddb38d6 --- /dev/null +++ b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/di.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd"> + <preference for="Magento\TestJoinDirectives\Api\TestRepositoryInterface" type="Magento\TestJoinDirectives\Model\TestRepository" /> +</config> diff --git a/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/extension_attributes.xml b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/extension_attributes.xml new file mode 100644 index 0000000000000000000000000000000000000000..e20f73c0d237f691ad9717431637d4388abc218c --- /dev/null +++ b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/extension_attributes.xml @@ -0,0 +1,34 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../../../../lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd"> + <extension_attributes for="Magento\Quote\Api\Data\CartInterface"> + <attribute code="quoteApiTestAttribute" type="Magento\User\Api\Data\UserInterface"> + <join reference_table="admin_user" + join_on_field="store_id" + reference_field="user_id" + > + <field>firstname</field> + <field>lastname</field> + <field>email</field> + </join> + </attribute> + </extension_attributes> + <extension_attributes for="Magento\Sales\Api\Data\InvoiceInterface"> + <attribute code="invoiceApiTestAttribute" type="Magento\User\Api\Data\UserInterface"> + <join reference_table="admin_user" + join_on_field="store_id" + reference_field="user_id" + > + <field>firstname</field> + <field>lastname</field> + <field>email</field> + </join> + </attribute> + </extension_attributes> +</config> diff --git a/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/module.xml b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/module.xml new file mode 100644 index 0000000000000000000000000000000000000000..7f91223ddc7d201017fb2dd85efdd0a6051c8730 --- /dev/null +++ b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/module.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd"> + <module name="Magento_TestJoinDirectives" setup_version="1.0"/> +</config> diff --git a/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/webapi.xml b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/webapi.xml new file mode 100644 index 0000000000000000000000000000000000000000..741e134c76d7eae7662bbbdef8b3053533a06c4e --- /dev/null +++ b/dev/tests/api-functional/_files/Magento/TestJoinDirectives/etc/webapi.xml @@ -0,0 +1,17 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd"> + + <route url="/V1/TestJoinDirectives" method="GET"> + <service class="Magento\TestJoinDirectives\Api\TestRepositoryInterface" method="getList"/> + <resources> + <resource ref="Magento_TestJoinDirectives::getList" /> + </resources> + </route> +</routes> diff --git a/dev/tests/api-functional/testsuite/Magento/Customer/Api/GroupRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Customer/Api/GroupRepositoryTest.php index fa8be5fc2dcc26815bb7e56ea942d2ce0ee9d271..722dfb6770135178cce323e37506cb19ce9cb650 100644 --- a/dev/tests/api-functional/testsuite/Magento/Customer/Api/GroupRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Customer/Api/GroupRepositoryTest.php @@ -863,16 +863,16 @@ class GroupRepositoryTest extends WebapiAbstract public function testSearchGroupsDataProvider() { return [ - ['tax_class_id', '3', []], - ['tax_class_id', '0', null], + ['tax_class_id', 3, []], + ['tax_class_id', 0, null], ['code', md5(mt_rand(0, 10000000000) . time()), null], [ 'id', - '0', + 0, [ - 'id' => '0', + 'id' => 0, 'code' => 'NOT LOGGED IN', - 'tax_class_id' => '3', + 'tax_class_id' => 3, 'tax_class_name' => 'Retail Customer' ] ], @@ -880,19 +880,19 @@ class GroupRepositoryTest extends WebapiAbstract 'code', 'General', [ - 'id' => '1', + 'id' => 1, 'code' => 'General', - 'tax_class_id' => '3', + 'tax_class_id' => 3, 'tax_class_name' => 'Retail Customer' ] ], [ 'id', - '2', + 2, [ - 'id' => '2', + 'id' => 2, 'code' => 'Wholesale', - 'tax_class_id' => '3', + 'tax_class_id' => 3, 'tax_class_name' => 'Retail Customer' ] ], @@ -900,9 +900,9 @@ class GroupRepositoryTest extends WebapiAbstract 'code', 'Retailer', [ - 'id' => '3', + 'id' => 3, 'code' => 'Retailer', - 'tax_class_id' => '3', + 'tax_class_id' => 3, 'tax_class_name' => 'Retail Customer' ] ] diff --git a/dev/tests/api-functional/testsuite/Magento/Webapi/JoinDirectivesTest.php b/dev/tests/api-functional/testsuite/Magento/Webapi/JoinDirectivesTest.php new file mode 100644 index 0000000000000000000000000000000000000000..142283fa8ac3509d81fbe04e9121872975f4d3eb --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/Webapi/JoinDirectivesTest.php @@ -0,0 +1,136 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Webapi; + +use Magento\Framework\Api\SearchCriteriaBuilder; +use Magento\Framework\Api\SortOrderBuilder; +use Magento\Framework\Api\SortOrder; +use Magento\Framework\Api\SearchCriteria; +use Magento\Framework\Api\FilterBuilder; + +class JoinDirectivesTest extends \Magento\TestFramework\TestCase\WebapiAbstract +{ + /** + * @var SearchCriteriaBuilder + */ + private $searchBuilder; + + /** + * @var SortOrderBuilder + */ + private $sortOrderBuilder; + + /** + * @var FilterBuilder + */ + private $filterBuilder; + + /** + * @var \Magento\User\Model\User + */ + private $user; + + protected function setUp() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->searchBuilder = $objectManager->create('Magento\Framework\Api\SearchCriteriaBuilder'); + $this->sortOrderBuilder = $objectManager->create('Magento\Framework\Api\SortOrderBuilder'); + $this->filterBuilder = $objectManager->create('Magento\Framework\Api\FilterBuilder'); + $this->user = $objectManager->create('Magento\User\Model\User'); + } + + /** + * @magentoApiDataFixture Magento/Sales/_files/quote.php + */ + public function testGetList() + { + /** @var SortOrder $sortOrder */ + $sortOrder = $this->sortOrderBuilder->setField('store_id')->setDirection(SearchCriteria::SORT_ASC)->create(); + $this->searchBuilder->setSortOrders([$sortOrder]); + $searchCriteria = $this->searchBuilder->create()->__toArray(); + $requestData = ['searchCriteria' => $searchCriteria]; + + $restResourcePath = '/V1/TestJoinDirectives/'; + $soapService = 'testJoinDirectivesTestRepositoryV1'; + $expectedExtensionAttributes = $this->getExpectedExtensionAttributes(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => $restResourcePath . '?' . http_build_query($requestData), + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + ], + 'soap' => [ + 'service' => $soapService, + 'operation' => $soapService . 'GetList', + ], + ]; + $searchResult = $this->_webApiCall($serviceInfo, $requestData); + + $this->assertArrayHasKey('items', $searchResult); + $itemData = array_pop($searchResult['items']); + $this->assertArrayHasKey('extension_attributes', $itemData); + $this->assertArrayHasKey('quote_api_test_attribute', $itemData['extension_attributes']); + $testAttribute = $itemData['extension_attributes']['quote_api_test_attribute']; + $this->assertEquals($expectedExtensionAttributes['firstname'], $testAttribute['first_name']); + $this->assertEquals($expectedExtensionAttributes['lastname'], $testAttribute['last_name']); + $this->assertEquals($expectedExtensionAttributes['email'], $testAttribute['email']); + } + + /** + * @magentoApiDataFixture Magento/Sales/_files/invoice.php + */ + public function testAutoGeneratedGetList() + { + $this->getExpectedExtensionAttributes(); + /** @var SortOrder $sortOrder */ + $sortOrder = $this->sortOrderBuilder->setField('store_id')->setDirection(SearchCriteria::SORT_ASC)->create(); + $this->searchBuilder->setSortOrders([$sortOrder]); + $this->searchBuilder->addFilter([$this->filterBuilder->setField('state')->setValue(2)->create()]); + $searchCriteria = $this->searchBuilder->create()->__toArray(); + $requestData = ['criteria' => $searchCriteria]; + + $restResourcePath = '/V1/invoices/'; + $soapService = 'salesInvoiceRepositoryV1'; + $expectedExtensionAttributes = $this->getExpectedExtensionAttributes(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => $restResourcePath . '?' . http_build_query($requestData), + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + ], + 'soap' => [ + 'service' => $soapService, + 'operation' => $soapService . 'GetList', + ], + ]; + $searchResult = $this->_webApiCall($serviceInfo, $requestData); + + $this->assertArrayHasKey('items', $searchResult); + $itemData = array_pop($searchResult['items']); + $this->assertArrayHasKey('extension_attributes', $itemData); + $this->assertArrayHasKey('invoice_api_test_attribute', $itemData['extension_attributes']); + $testAttribute = $itemData['extension_attributes']['invoice_api_test_attribute']; + $this->assertEquals($expectedExtensionAttributes['firstname'], $testAttribute['first_name']); + $this->assertEquals($expectedExtensionAttributes['lastname'], $testAttribute['last_name']); + $this->assertEquals($expectedExtensionAttributes['email'], $testAttribute['email']); + } + + /** + * Retrieve the admin user's information. + * + * @return array + */ + private function getExpectedExtensionAttributes() + { + $this->user->load(1); + return [ + 'firstname' => $this->user->getFirstname(), + 'lastname' => $this->user->getLastname(), + 'email' => $this->user->getEmail() + ]; + } +} diff --git a/dev/tests/integration/framework/Magento/TestFramework/Application.php b/dev/tests/integration/framework/Magento/TestFramework/Application.php index dc457df4db0f0f9fdcd5c7cb13f1ff6f6afe4e6f..e5d71b3055b8f647c0df99e00dac71dc998b3c11 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/Application.php +++ b/dev/tests/integration/framework/Magento/TestFramework/Application.php @@ -122,6 +122,13 @@ class Application */ private $globalConfigFile; + /** + * Defines whether load test extension attributes or not + * + * @var bool + */ + private $loadTestExtensionAttributes; + /** * Constructor * @@ -132,6 +139,7 @@ class Application * @param string $globalConfigDir * @param string $appMode * @param AutoloaderInterface $autoloadWrapper + * @param bool|null $loadTestExtensionAttributes */ public function __construct( \Magento\Framework\Shell $shell, @@ -140,13 +148,18 @@ class Application $globalConfigFile, $globalConfigDir, $appMode, - AutoloaderInterface $autoloadWrapper + AutoloaderInterface $autoloadWrapper, + $loadTestExtensionAttributes = false ) { + if (getcwd() != BP . '/dev/tests/integration') { + chdir(BP . '/dev/tests/integration'); + } $this->_shell = $shell; $this->installConfigFile = $installConfigFile; $this->_globalConfigDir = realpath($globalConfigDir); $this->_appMode = $appMode; $this->installDir = $installDir; + $this->loadTestExtensionAttributes = $loadTestExtensionAttributes; $customDirs = $this->getCustomDirs(); $this->dirList = new \Magento\Framework\App\Filesystem\DirectoryList(BP, $customDirs); @@ -320,25 +333,28 @@ class Application $objectManager->addSharedInstance($logger, 'Magento\Framework\Logger\Monolog'); $sequenceBuilder = $objectManager->get('\Magento\TestFramework\Db\Sequence\Builder'); $objectManager->addSharedInstance($sequenceBuilder, 'Magento\SalesSequence\Model\Builder'); - Helper\Bootstrap::setObjectManager($objectManager); - - $objectManager->configure( - [ - 'preferences' => [ - 'Magento\Framework\App\State' => 'Magento\TestFramework\App\State', - 'Magento\Framework\Mail\TransportInterface' => 'Magento\TestFramework\Mail\TransportInterfaceMock', - 'Magento\Framework\Mail\Template\TransportBuilder' - => 'Magento\TestFramework\Mail\Template\TransportBuilderMock', - ], - 'Magento\Framework\Api\ExtensionAttribute\Config\Reader' => [ - 'arguments' => [ - 'fileResolver' => ['instance' => 'Magento\TestFramework\Api\Config\Reader\FileResolver'], - ], - ], + $objectManagerConfiguration = [ + 'preferences' => [ + 'Magento\Framework\App\State' => 'Magento\TestFramework\App\State', + 'Magento\Framework\Mail\TransportInterface' => 'Magento\TestFramework\Mail\TransportInterfaceMock', + 'Magento\Framework\Mail\Template\TransportBuilder' + => 'Magento\TestFramework\Mail\Template\TransportBuilderMock', ] - ); - + ]; + if ($this->loadTestExtensionAttributes) { + $objectManagerConfiguration = array_merge( + $objectManagerConfiguration, + [ + 'Magento\Framework\Api\ExtensionAttribute\Config\Reader' => [ + 'arguments' => [ + 'fileResolver' => ['instance' => 'Magento\TestFramework\Api\Config\Reader\FileResolver'], + ], + ], + ] + ); + } + $objectManager->configure($objectManagerConfiguration); /** Register event observer of Integration Framework */ /** @var \Magento\Framework\Event\Config\Data $eventConfigData */ $eventConfigData = $objectManager->get('Magento\Framework\Event\Config\Data'); @@ -353,7 +369,6 @@ class Application ] ] ); - $this->loadArea(\Magento\TestFramework\Application::DEFAULT_APP_AREA); \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->configure( $objectManager->get('Magento\Framework\ObjectManager\DynamicConfigInterface')->getConfiguration() @@ -472,7 +487,7 @@ class Application private function copyAppConfigFiles() { $globalConfigFiles = glob( - $this->_globalConfigDir . '/{di.xml}', + $this->_globalConfigDir . '/{di.xml,vendor_path.php}', GLOB_BRACE ); foreach ($globalConfigFiles as $file) { diff --git a/dev/tests/integration/framework/bootstrap.php b/dev/tests/integration/framework/bootstrap.php index 2f607671fe7736eac1da2fb0f704f2b52b8eb5fc..e39836e58dd5bf7b8126a89422acfeea813b9592 100644 --- a/dev/tests/integration/framework/bootstrap.php +++ b/dev/tests/integration/framework/bootstrap.php @@ -52,7 +52,8 @@ try { $globalConfigFile, $settings->get('TESTS_GLOBAL_CONFIG_DIR'), $settings->get('TESTS_MAGENTO_MODE'), - AutoloaderRegistry::getAutoloader() + AutoloaderRegistry::getAutoloader(), + true ); $bootstrap = new \Magento\TestFramework\Bootstrap( @@ -71,7 +72,7 @@ try { if (!$application->isInstalled()) { $application->install(); } - $application->initialize(); + $application->initialize([]); \Magento\TestFramework\Helper\Bootstrap::setInstance(new \Magento\TestFramework\Helper\Bootstrap($bootstrap)); diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/OptionListTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/OptionListTest.php new file mode 100644 index 0000000000000000000000000000000000000000..62f5cff1ff52e5001f6445042aa1ea1dd43961d1 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/OptionListTest.php @@ -0,0 +1,44 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Bundle\Model\Product; + +/** + * Integration test for Magento\Bundle\Model\OptionList + */ +class OptionListTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Catalog\Model\Product + */ + protected $product; + + /** + * @var \Magento\Framework\ObjectManagerInterface + */ + protected $objectManager; + + protected function setUp() + { + $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + } + + /** + * @magentoDataFixture Magento/Bundle/_files/product.php + */ + public function testGetItems() + { + $this->product = $this->objectManager->get('Magento\Catalog\Model\Product'); + $this->product->load(3); + /** + * @var \Magento\Bundle\Model\Product\OptionList $optionList + */ + $optionList = $this->objectManager->create('\Magento\Bundle\Model\Product\OptionList'); + $options = $optionList->getItems($this->product); + $this->assertEquals(1, count($options)); + $this->assertEquals('Bundle Product Items', $options[0]->getTitle()); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php index db9cfaa872bdad22de26acce3d13936390b3dafb..cbd558ed2f3e05246874897a4a91bea66c899b93 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php @@ -419,4 +419,15 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->assertTrue($error); } } + + /** + * @magentoDataFixture Magento/Catalog/_files/product_simple.php + * @magentoAppIsolation enabled + */ + public function testGetOptions() + { + $this->_model->load(1); + $options = $this->_model->getOptions(); + $this->assertEquals(4, count($options)); + } } diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/OptionRepositoryTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/OptionRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..dfe06c0deefe3286a2ae84bfd387dde606c0d82d --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/OptionRepositoryTest.php @@ -0,0 +1,33 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\ConfigurableProduct\Model; + +class OptionRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php + */ + public function testGetListWithExtensionAttributes() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $productSku = 'configurable'; + /** @var \Magento\ConfigurableProduct\Api\OptionRepositoryInterface $optionRepository */ + $optionRepository = $objectManager->create('Magento\ConfigurableProduct\Api\OptionRepositoryInterface'); + + $options = $optionRepository->getList($productSku); + $this->assertCount(1, $options, "Invalid number of option."); + $this->assertNotNull($options[0]->getExtensionAttributes(), "Extension attributes not loaded"); + /** @var \Magento\Eav\Model\Entity\Attribute $joinedEntity */ + $joinedEntity = $objectManager->create('Magento\Eav\Model\Entity\Attribute'); + $joinedEntity->load($options[0]->getId()); + $joinedExtensionAttributeValue = $joinedEntity->getAttributeCode(); + $this->assertEquals( + $joinedExtensionAttributeValue, + $options[0]->getExtensionAttributes()->getTestDummyAttribute(), + "Extension attributes were not loaded correctly" + ); + } +} diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/etc/extension_attributes.xml b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/etc/extension_attributes.xml new file mode 100644 index 0000000000000000000000000000000000000000..dbf00dbc8c5b037eced4bcfb499ff5ea15fd6c1a --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/etc/extension_attributes.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd"> + <extension_attributes for="Magento\ConfigurableProduct\Api\Data\OptionInterface"> + <attribute code="test_dummy_attribute" type="string"> + <join reference_table="eav_attribute" + reference_field="attribute_id" + join_on_field="product_super_attribute_id" + > + <field>attribute_code</field> + </join> + </attribute> + </extension_attributes> +</config> diff --git a/dev/tests/integration/testsuite/Magento/Customer/Api/AddressRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Customer/Api/AddressRepositoryTest.php index 16cfa26b08873cc1ff6bd46d29f871fe0713e1c1..438de55ed11d1307e94b3869a8e16b6f127fc1f8 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Api/AddressRepositoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Api/AddressRepositoryTest.php @@ -316,7 +316,7 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase $this->assertEquals(count($expectedResult), $searchResults->getTotalCount()); - /** @var \Magento\Customer\Api\Data\AddressInterface $item*/ + /** @var \Magento\Customer\Api\Data\AddressInterface $item */ foreach ($searchResults->getItems() as $item) { $this->assertEquals( $expectedResult[$item->getId()]['city'], diff --git a/dev/tests/integration/testsuite/Magento/Customer/etc/extension_attributes.xml b/dev/tests/integration/testsuite/Magento/Customer/etc/extension_attributes.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c210f6f4125f5cfe513f4fb5c81f9c4da540cfd --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Customer/etc/extension_attributes.xml @@ -0,0 +1,19 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd"> + <extension_attributes for="Magento\Customer\Api\Data\AddressInterface"> + <attribute code="test_customer_group_id" type="int"> + <join reference_table="customer_entity" + reference_field="entity_id" + join_on_field="parent_id" + > + <field>group_id</field> + </join> + </attribute> + </extension_attributes> +</config> diff --git a/dev/tests/integration/testsuite/Magento/Downloadable/Model/Product/TypeTest.php b/dev/tests/integration/testsuite/Magento/Downloadable/Model/Product/TypeTest.php index 2628c9c0e2880e4ed685fa19f9f8e1a1e9fdf93b..cb06602f2c2a58cb6a4c1ed8341dd932529045dd 100644 --- a/dev/tests/integration/testsuite/Magento/Downloadable/Model/Product/TypeTest.php +++ b/dev/tests/integration/testsuite/Magento/Downloadable/Model/Product/TypeTest.php @@ -69,6 +69,7 @@ class TypeTest extends \PHPUnit_Framework_TestCase /** * @magentoDataFixture Magento/Downloadable/_files/product_downloadable_with_files.php * @magentoAppArea adminhtml + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testSaveTypeSpecificData() { @@ -129,12 +130,21 @@ class TypeTest extends \PHPUnit_Framework_TestCase 'title' => 'Updated downloadable link #1', 'website_price' => '15.0000', ]; - - + $expectedExtensionAttributes = [ + 'firstname' => 'firstname', + 'lastname' => 'lastname', + 'email' => 'admin@example.com' + ]; $links = $this->_model->getLinks($product); $this->assertNotEmpty($links); $this->assertCount(1, $links); + /** @var \Magento\Downloadable\Model\Link $link */ $link = reset($links); + /** @var \Magento\User\Api\Data\UserInterface $testAttribute */ + $testAttribute = $link->getExtensionAttributes()->getTestAttribute(); + $this->assertEquals($expectedExtensionAttributes['firstname'], $testAttribute->getFirstName()); + $this->assertEquals($expectedExtensionAttributes['lastname'], $testAttribute->getLastName()); + $this->assertEquals($expectedExtensionAttributes['email'], $testAttribute->getEmail()); foreach ($expectedLink as $key => $value) { $this->assertTrue($link->hasData($key), 'Key ' . $key . ' not exist!'); $this->assertArrayHasKey($key, $link); @@ -157,6 +167,11 @@ class TypeTest extends \PHPUnit_Framework_TestCase $this->assertEquals(1, $samples->count()); /** @var \Magento\Downloadable\Model\Sample $sample */ $sample = $samples->getFirstItem()->getData(); + /** @var \Magento\User\Api\Data\UserInterface $testAttribute */ + $testAttribute = $sample['extension_attributes']->getTestAttribute(); + $this->assertEquals($expectedExtensionAttributes['firstname'], $testAttribute->getFirstName()); + $this->assertEquals($expectedExtensionAttributes['lastname'], $testAttribute->getLastName()); + $this->assertEquals($expectedExtensionAttributes['email'], $testAttribute->getEmail()); foreach ($expectedSample as $key => $value) { $this->assertArrayHasKey($key, $sample); $this->assertEquals($value, $sample[$key]); diff --git a/dev/tests/integration/testsuite/Magento/Downloadable/etc/extension_attributes.xml b/dev/tests/integration/testsuite/Magento/Downloadable/etc/extension_attributes.xml new file mode 100644 index 0000000000000000000000000000000000000000..e120bbea99bcf355d3a3adce99925d13a40fd19c --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Downloadable/etc/extension_attributes.xml @@ -0,0 +1,34 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd"> + <extension_attributes for="Magento\Downloadable\Api\Data\LinkInterface"> + <attribute code="testAttribute" type="Magento\User\Api\Data\UserInterface"> + <join reference_table="admin_user" + join_on_field="product_id" + reference_field="user_id" + > + <field>firstname</field> + <field>lastname</field> + <field>email</field> + </join> + </attribute> + </extension_attributes> + <extension_attributes for="Magento\Downloadable\Api\Data\SampleInterface"> + <attribute code="testAttribute" type="Magento\User\Api\Data\UserInterface"> + <join reference_table="admin_user" + join_on_field="product_id" + reference_field="user_id" + > + <field>firstname</field> + <field>lastname</field> + <field>email</field> + </join> + </attribute> + </extension_attributes> +</config> diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttribute/JoinProcessorTest.php b/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttribute/JoinProcessorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..10be075426201115e32332f8818e6274c5cdd928 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttribute/JoinProcessorTest.php @@ -0,0 +1,404 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Api\ExtensionAttribute; + +use Magento\Framework\Api\ExtensionAttribute\Config\Converter; +use Magento\Framework\Api\ExtensionAttribute\Config\Reader; +use Magento\Framework\Api\ExtensionAttribute\JoinData; +use Magento\Framework\Api\ExtensionAttribute\JoinDataInterfaceFactory; +use Magento\Framework\Reflection\TypeProcessor; +use Magento\Framework\App\Resource as AppResource; + +class JoinProcessorTest extends \PHPUnit_Framework_TestCase +{ + + /** @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessor */ + private $joinProcessor; + + /** + * @var Reader|\PHPUnit_Framework_MockObject_MockObject + */ + private $config; + + /** + * @var JoinDataInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $extensionAttributeJoinDataFactory; + + /** + * @var TypeProcessor|\PHPUnit_Framework_MockObject_MockObject + */ + private $typeProcessor; + + /** + * @var AppResource|\PHPUnit_Framework_MockObject_MockObject + */ + private $appResource; + + protected function setUp() + { + $this->config = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\Config') + ->disableOriginalConstructor() + ->getMock(); + $this->extensionAttributeJoinDataFactory = $this + ->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\JoinDataInterfaceFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->extensionAttributeJoinDataFactory = $this + ->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\JoinDataInterfaceFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->typeProcessor = $this->getMockBuilder('Magento\Framework\Reflection\TypeProcessor') + ->disableOriginalConstructor() + ->getMock(); + + /** @var \Magento\Framework\ObjectManagerInterface */ + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + + $this->appResource = $objectManager->get('Magento\Framework\App\Resource'); + + $this->joinProcessor = $objectManager->create( + 'Magento\Framework\Api\ExtensionAttribute\JoinProcessor', + [ + 'objectManager' => $objectManager, + 'config' => $this->config, + 'extensionAttributeJoinDataFactory' => $this->extensionAttributeJoinDataFactory, + 'typeProcessor' => $this->typeProcessor + ] + ); + } + + /** + * Test the processing of the join config for a particular type + */ + public function testProcess() + { + $this->config->expects($this->once()) + ->method('get') + ->will($this->returnValue($this->getConfig())); + + $collection = $this->getMockBuilder('Magento\Framework\Data\Collection\AbstractDb') + ->setMethods(['joinExtensionAttribute']) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $extensionAttributeJoinData = new JoinData(); + $this->extensionAttributeJoinDataFactory + ->expects($this->once()) + ->method('create') + ->willReturn($extensionAttributeJoinData); + + $collection->expects($this->once())->method('joinExtensionAttribute')->with($extensionAttributeJoinData); + + $this->joinProcessor->process($collection, 'Magento\Catalog\Api\Data\ProductInterface'); + $expectedTableName = 'reviews'; + $this->assertEquals($expectedTableName, $extensionAttributeJoinData->getReferenceTable()); + $this->assertEquals('extension_attribute_review_id', $extensionAttributeJoinData->getReferenceTableAlias()); + $this->assertEquals('product_id', $extensionAttributeJoinData->getReferenceField()); + $this->assertEquals('id', $extensionAttributeJoinData->getJoinField()); + $this->assertEquals( + [ + [ + 'external_alias' => 'review_id', + 'internal_alias' => 'extension_attribute_review_id_db_review_id', + 'with_db_prefix' => 'extension_attribute_review_id.db_review_id', + 'setter' => 'setReviewId', + ] + ], + $extensionAttributeJoinData->getSelectFields() + ); + } + + private function getConfig() + { + return [ + 'Magento\Catalog\Api\Data\ProductInterface' => [ + 'review_id' => [ + Converter::DATA_TYPE => 'string', + Converter::RESOURCE_PERMISSIONS => [], + Converter::JOIN_DIRECTIVE => [ + Converter::JOIN_REFERENCE_TABLE => "reviews", + Converter::JOIN_REFERENCE_FIELD => "product_id", + Converter::JOIN_FIELDS => [ + [ + Converter::JOIN_FIELD => "review_id", + Converter::JOIN_FIELD_COLUMN => "db_review_id", + ], + ], + Converter::JOIN_ON_FIELD => "id", + ], + ], + ], + 'Magento\Customer\Api\Data\CustomerInterface' => [ + 'library_card_id' => [ + Converter::DATA_TYPE => 'string', + Converter::RESOURCE_PERMISSIONS => [], + Converter::JOIN_DIRECTIVE => [ + Converter::JOIN_REFERENCE_TABLE => "library_account", + Converter::JOIN_FIELDS => [ + [ + Converter::JOIN_FIELD => "library_card_id", + Converter::JOIN_FIELD_COLUMN => "", + ], + ], + Converter::JOIN_ON_FIELD => "customer_id", + ], + ], + 'reviews' => [ + Converter::DATA_TYPE => 'Magento\Reviews\Api\Data\Reviews[]', + Converter::RESOURCE_PERMISSIONS => [], + Converter::JOIN_DIRECTIVE => [ + Converter::JOIN_REFERENCE_TABLE => "reviews", + Converter::JOIN_FIELDS => [ + [ + Converter::JOIN_FIELD => "comment", + Converter::JOIN_FIELD_COLUMN => "", + ], + [ + Converter::JOIN_FIELD => "rating", + Converter::JOIN_FIELD_COLUMN => "", + ], + ], + Converter::JOIN_ON_FIELD => "customer_id", + ], + ], + ], + ]; + } + + public function testProcessSqlSelectVerification() + { + /** @var \Magento\Framework\ObjectManagerInterface */ + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + /** @var \Magento\Framework\Api\ExtensionAttribute\Config $config */ + $config = $objectManager->get('Magento\Framework\Api\ExtensionAttribute\Config'); + $config->reset(); + + $extensionConfigFileResolverMock = $this->getMockBuilder('Magento\Framework\Config\FileResolverInterface') + ->disableOriginalConstructor() + ->getMock(); + $extensionConfigFilePath = __DIR__ . '/../_files/extension_attributes.xml'; + $extensionConfigFileContent = file_get_contents($extensionConfigFilePath); + $extensionConfigFileResolverMock->expects($this->any()) + ->method('get') + ->willReturn([$extensionConfigFilePath => $extensionConfigFileContent]); + $configReader = $objectManager->create( + 'Magento\Framework\Api\ExtensionAttribute\Config\Reader', + ['fileResolver' => $extensionConfigFileResolverMock] + ); + /** @var \Magento\Framework\Api\ExtensionAttribute\Config $config */ + $config = $objectManager->create( + 'Magento\Framework\Api\ExtensionAttribute\Config', + ['reader' => $configReader] + ); + /** @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessor $extensionAttributesProcessor */ + $extensionAttributesProcessor = $objectManager->create( + 'Magento\Framework\Api\ExtensionAttribute\JoinProcessor', + ['config' => $config] + ); + /** @var \Magento\Catalog\Model\Resource\Product\Collection $collection */ + $collection = $objectManager->create('Magento\Catalog\Model\Resource\Product\Collection'); + $extensionAttributesProcessor->process($collection); + $config->reset(); + + $catalogProductEntity = $this->appResource->getTableName('catalog_product_entity'); + $catalogInventoryStockItem = $this->appResource->getTableName('cataloginventory_stock_item'); + $reviews = $this->appResource->getTableName('reviews'); + $expectedSql = <<<EXPECTED_SQL +SELECT `e`.*, + `extension_attribute_stock_item`.`qty` AS `extension_attribute_stock_item_qty`, + `extension_attribute_reviews`.`comment` AS `extension_attribute_reviews_comment`, + `extension_attribute_reviews`.`rating` AS `extension_attribute_reviews_rating`, + `extension_attribute_reviews`.`date` AS `extension_attribute_reviews_date` FROM `$catalogProductEntity` AS `e` + LEFT JOIN `$catalogInventoryStockItem` AS `extension_attribute_stock_item` ON e.id = extension_attribute_stock_item.id + LEFT JOIN `$reviews` AS `extension_attribute_reviews` ON e.id = extension_attribute_reviews.product_id +EXPECTED_SQL; + $resultSql = $collection->getSelectSql(true); + $formattedResultSql = str_replace(',', ",\n ", $resultSql); + $this->assertEquals($expectedSql, $formattedResultSql); + } + + /** + * @magentoDataFixture Magento/Catalog/_files/products.php + */ + public function testGetListWithExtensionAttributesAbstractModel() + { + $firstProductId = 1; + $firstProductQty = 11; + $secondProductId = 2; + $secondProductQty = 22; + /** @var \Magento\Framework\ObjectManagerInterface */ + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + /** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */ + $productRepository = $objectManager->create('Magento\Catalog\Api\ProductRepositoryInterface'); + /** @var \Magento\CatalogInventory\Api\StockItemRepositoryInterface $stockItemRepository */ + $stockItemRepository = $objectManager->get('Magento\CatalogInventory\Api\StockItemRepositoryInterface'); + + /** Prepare stock items */ + $firstStockItem = $productRepository->getById($firstProductId)->getExtensionAttributes()->getStockItem(); + $firstStockItem->setQty($firstProductQty); + $stockItemRepository->save($firstStockItem); + $this->assertEquals( + $firstProductQty, + $productRepository->getById($firstProductId)->getExtensionAttributes()->getStockItem()->getQty(), + 'Precondition failed.' + ); + $secondStockItem = $productRepository->getById($secondProductId)->getExtensionAttributes()->getStockItem(); + $secondStockItem->setQty($secondProductQty); + $stockItemRepository->save($secondStockItem); + $this->assertEquals( + $secondProductQty, + $productRepository->getById($secondProductId)->getExtensionAttributes()->getStockItem()->getQty(), + 'Precondition failed.' + ); + + /** @var \Magento\Framework\Api\Search\FilterGroup $searchCriteriaGroup */ + $searchCriteriaGroup = $objectManager->create('Magento\Framework\Api\Search\FilterGroup'); + /** @var \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria */ + $searchCriteria = $objectManager->create('Magento\Framework\Api\SearchCriteriaInterface'); + $searchCriteria->setFilterGroups([$searchCriteriaGroup]); + $products = $productRepository->getList($searchCriteria)->getItems(); + + /** Ensure that simple extension attributes were populated correctly */ + $this->assertEquals( + $firstProductQty, + $products[$firstProductId]->getExtensionAttributes()->getTestStockItemQty() + ); + $this->assertEquals( + $secondProductQty, + $products[$secondProductId]->getExtensionAttributes()->getTestStockItemQty() + ); + + /** Check population of complex extension attributes */ + $this->assertEquals( + $firstProductQty, + $products[$firstProductId]->getExtensionAttributes()->getTestStockItem()->getQty() + ); + $this->assertNotEmpty($products[$firstProductId]->getExtensionAttributes()->getTestStockItem()->getItemId()); + + $this->assertArrayNotHasKey( + 'extension_attribute_test_stock_item_qty_qty', + $products[$firstProductId]->getData(), + "Selected extension field should be unset after it is added to extension attributes object." + ); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_group.php + */ + public function testGetListWithExtensionAttributesAbstractObject() + { + $customerId = 1; + $customerGroupName = 'General'; + $taxClassId = 3; + /** @var \Magento\Framework\ObjectManagerInterface */ + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + + /** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository */ + $customerRepository = $objectManager->get('Magento\Customer\Api\CustomerRepositoryInterface'); + /** @var \Magento\Framework\Api\Search\FilterGroup $searchCriteriaGroup */ + $searchCriteriaGroup = $objectManager->create('Magento\Framework\Api\Search\FilterGroup'); + /** @var \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria */ + $searchCriteria = $objectManager->create('Magento\Framework\Api\SearchCriteriaInterface'); + $searchCriteria->setFilterGroups([$searchCriteriaGroup]); + $customers = $customerRepository->getList($searchCriteria)->getItems(); + + /** Ensure that simple extension attributes were populated correctly */ + $customer = $customers[0]; + $this->assertEquals($customerId, $customer->getId(), 'Precondition failed'); + $this->assertEquals($customerGroupName, $customer->getExtensionAttributes()->getTestGroupCode()); + + /** Check population of complex extension attributes */ + $this->assertEquals($taxClassId, $customer->getExtensionAttributes()->getTestGroup()->getTaxClassId()); + $this->assertEquals($customerGroupName, $customer->getExtensionAttributes()->getTestGroup()->getCode()); + } + + public function testGetListWithFilterBySimpleDummyAttributeWithMapping() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $groupRepository = $objectManager->create('Magento\Customer\Api\GroupRepositoryInterface'); + $searchCriteriaBuilder = $objectManager->create('Magento\Framework\Api\SearchCriteriaBuilder'); + $builder = $objectManager->create('Magento\Framework\Api\FilterBuilder'); + $joinedExtensionAttribute = 'test_dummy_attribute'; + $joinedExtensionAttributeValue = 'website_id'; + $filter = $builder->setField($joinedExtensionAttribute) + ->setValue($joinedExtensionAttributeValue) + ->create(); + $searchCriteriaBuilder->addFilter([$filter]); + $searchResults = $groupRepository->getList($searchCriteriaBuilder->create()); + $items = $searchResults->getItems(); + $this->assertCount(1, $items, 'Filtration by extension attribute does not work.'); + $expectedGroupCode = 'General'; + $this->assertEquals($expectedGroupCode, $items[0]->getCode(), 'Invalid group loaded.'); + $this->assertNotNull($items[0]->getExtensionAttributes(), "Extension attributes not loaded"); + $this->assertEquals( + $joinedExtensionAttributeValue, + $items[0]->getExtensionAttributes()->getTestDummyAttribute(), + "Extension attributes were not loaded correctly" + ); + } + + public function testGetListWithFilterByComplexDummyAttributeWithSetterMapping() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $groupRepository = $objectManager->create('Magento\Customer\Api\GroupRepositoryInterface'); + $searchCriteriaBuilder = $objectManager->create('Magento\Framework\Api\SearchCriteriaBuilder'); + $builder = $objectManager->create('Magento\Framework\Api\FilterBuilder'); + $joinedExtensionAttribute = 'test_complex_dummy_attribute.frontend_label'; + $joinedExtensionAttributeValue = 'firstname'; + $filter = $builder->setField($joinedExtensionAttribute) + ->setValue($joinedExtensionAttributeValue) + ->create(); + $searchCriteriaBuilder->addFilter([$filter]); + $searchResults = $groupRepository->getList($searchCriteriaBuilder->create()); + $items = $searchResults->getItems(); + $this->assertCount(1, $items, 'Filtration by extension attribute does not work.'); + $expectedGroupCode = 'General'; + $this->assertEquals($expectedGroupCode, $items[0]->getCode(), 'Invalid group loaded.'); + $this->assertNotNull($items[0]->getExtensionAttributes(), "Extension attributes not loaded"); + $this->assertNotNull( + $items[0]->getExtensionAttributes()->getTestComplexDummyAttribute(), + "Complex extension attribute not loaded" + ); + $this->assertEquals( + 'user', + $items[0]->getExtensionAttributes()->getTestComplexDummyAttribute()->getAttributeCode(), + "Extension attributes were not loaded correctly" + ); + $this->assertEquals( + $joinedExtensionAttributeValue, + $items[0]->getExtensionAttributes()->getTestComplexDummyAttribute()->getFrontendLabel(), + "Extension attributes were not loaded correctly" + ); + } + + /** + * @magentoDataFixture Magento/Sales/_files/invoice.php + */ + public function testGetListWithExtensionAttributesAutoGeneratedRepository() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $searchCriteriaBuilder = $objectManager->create('Magento\Framework\Api\SearchCriteriaBuilder'); + /** @var \Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository */ + $invoiceRepository = $objectManager->create('Magento\Sales\Api\InvoiceRepositoryInterface'); + $invoices = $invoiceRepository->getList($searchCriteriaBuilder->create())->getItems(); + $this->assertCount(1, $invoices, "Invalid number of loaded invoices."); + $invoice = reset($invoices); + + /** @var \Magento\Eav\Model\Entity\Attribute $joinedEntity */ + $joinedEntity = $objectManager->create('Magento\Eav\Model\Entity\Attribute'); + $joinedEntity->load($invoice->getId()); + $joinedExtensionAttributeValue = $joinedEntity->getAttributeCode(); + + $this->assertNotNull($invoice->getExtensionAttributes(), "Extension attributes not loaded"); + $this->assertEquals( + $joinedExtensionAttributeValue, + $invoice->getExtensionAttributes()->getTestDummyAttribute(), + "Extension attributes were not loaded correctly" + ); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttributesFactoryTest.php b/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttributesFactoryTest.php index 674fc1432f0ef7e6d0eb0ee177f9ac9e25f5e87c..faec140dbdab7612e0563bda9d71be2897dbbe45 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttributesFactoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttributesFactoryTest.php @@ -5,70 +5,21 @@ */ namespace Magento\Framework\Api; -use Magento\Framework\Api\ExtensionAttribute\Config\Converter; -use Magento\Framework\Api\ExtensionAttribute\Config\Reader; -use Magento\Framework\Api\ExtensionAttribute\JoinData; -use Magento\Framework\Api\ExtensionAttribute\JoinDataFactory; -use Magento\Framework\Reflection\TypeProcessor; -use Magento\Framework\App\Resource; - class ExtensionAttributesFactoryTest extends \PHPUnit_Framework_TestCase { /** @var \Magento\Framework\Api\ExtensionAttributesFactory */ private $factory; - /** - * @var Reader|\PHPUnit_Framework_MockObject_MockObject - */ - private $config; - - /** - * @var JoinDataFactory|\PHPUnit_Framework_MockObject_MockObject - */ - private $extensionAttributeJoinDataFactory; - - /** - * @var TypeProcessor|\PHPUnit_Framework_MockObject_MockObject - */ - private $typeProcessor; - - /** - * @var AppResource|\PHPUnit_Framework_MockObject_MockObject - */ - private $appResource; - protected function setUp() { - $this->config = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\Config') - ->disableOriginalConstructor() - ->getMock(); - $this->extensionAttributeJoinDataFactory = $this - ->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\JoinDataFactory') - ->disableOriginalConstructor() - ->getMock(); - $this->extensionAttributeJoinDataFactory = $this - ->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\JoinDataFactory') - ->disableOriginalConstructor() - ->getMock(); - $this->typeProcessor = $this->getMockBuilder('Magento\Framework\Reflection\TypeProcessor') - ->disableOriginalConstructor() - ->getMock(); - $autoloadWrapper = \Magento\Framework\Autoload\AutoloaderRegistry::getAutoloader(); $autoloadWrapper->addPsr4('Magento\\Wonderland\\', realpath(__DIR__ . '/_files/Magento/Wonderland')); /** @var \Magento\Framework\ObjectManagerInterface */ $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); - $this->appResource = $objectManager->get('Magento\Framework\App\Resource'); - $this->factory = $objectManager->create( 'Magento\Framework\Api\ExtensionAttributesFactory', - [ - 'objectManager' => $objectManager, - 'config' => $this->config, - 'extensionAttributeJoinDataFactory' => $this->extensionAttributeJoinDataFactory, - 'typeProcessor' => $this->typeProcessor - ] + ['objectManager' => $objectManager] ); } @@ -104,240 +55,6 @@ class ExtensionAttributesFactoryTest extends \PHPUnit_Framework_TestCase ); } - /** - * Test the processing of the join config for a particular type - */ - public function testProcess() - { - $this->config->expects($this->once()) - ->method('get') - ->will($this->returnValue($this->getConfig())); - - $collection = $this->getMockBuilder('Magento\Framework\Data\Collection\AbstractDb') - ->setMethods(['joinExtensionAttribute']) - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $extensionAttributeJoinData = new JoinData(); - $this->extensionAttributeJoinDataFactory - ->expects($this->once()) - ->method('create') - ->willReturn($extensionAttributeJoinData); - - $collection->expects($this->once())->method('joinExtensionAttribute')->with($extensionAttributeJoinData); - - $this->factory->process($collection, 'Magento\Catalog\Api\Data\ProductInterface'); - $expectedTableName = 'reviews'; - $this->assertEquals($expectedTableName, $extensionAttributeJoinData->getReferenceTable()); - $this->assertEquals('extension_attribute_review_id', $extensionAttributeJoinData->getReferenceTableAlias()); - $this->assertEquals('product_id', $extensionAttributeJoinData->getReferenceField()); - $this->assertEquals('id', $extensionAttributeJoinData->getJoinField()); - $this->assertEquals(['review_id'], $extensionAttributeJoinData->getSelectFields()); - } - - private function getConfig() - { - return [ - 'Magento\Catalog\Api\Data\ProductInterface' => [ - 'review_id' => [ - Converter::DATA_TYPE => 'string', - Converter::RESOURCE_PERMISSIONS => [], - Converter::JOIN_DIRECTIVE => [ - Converter::JOIN_REFERENCE_TABLE => "reviews", - Converter::JOIN_REFERENCE_FIELD => "product_id", - Converter::JOIN_SELECT_FIELDS => [ - [ - Converter::JOIN_SELECT_FIELD => "review_id", - ], - ], - Converter::JOIN_JOIN_ON_FIELD => "id", - ], - ], - ], - 'Magento\Customer\Api\Data\CustomerInterface' => [ - 'library_card_id' => [ - Converter::DATA_TYPE => 'string', - Converter::RESOURCE_PERMISSIONS => [], - Converter::JOIN_DIRECTIVE => [ - Converter::JOIN_REFERENCE_TABLE => "library_account", - Converter::JOIN_SELECT_FIELDS => [ - [ - Converter::JOIN_SELECT_FIELD => "library_card_id", - ], - ], - Converter::JOIN_JOIN_ON_FIELD => "customer_id", - ], - ], - 'reviews' => [ - Converter::DATA_TYPE => 'Magento\Reviews\Api\Data\Reviews[]', - Converter::RESOURCE_PERMISSIONS => [], - Converter::JOIN_DIRECTIVE => [ - Converter::JOIN_REFERENCE_TABLE => "reviews", - Converter::JOIN_SELECT_FIELDS => [ - [ - Converter::JOIN_SELECT_FIELD => "comment", - ], - [ - Converter::JOIN_SELECT_FIELD => "rating", - ], - ], - Converter::JOIN_JOIN_ON_FIELD => "customer_id", - ], - ], - ], - ]; - } - - public function testProcessSqlSelectVerification() - { - /** @var \Magento\Framework\ObjectManagerInterface */ - $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); - /** @var \Magento\Framework\Api\ExtensionAttribute\Config $config */ - $config = $objectManager->get('Magento\Framework\Api\ExtensionAttribute\Config'); - $config->reset(); - - $extensionConfigFileResolverMock = $this->getMockBuilder('Magento\Framework\Config\FileResolverInterface') - ->disableOriginalConstructor() - ->getMock(); - $extensionConfigFilePath = __DIR__ . '/_files/extension_attributes.xml'; - $extensionConfigFileContent = file_get_contents($extensionConfigFilePath); - $extensionConfigFileResolverMock->expects($this->any()) - ->method('get') - ->willReturn([$extensionConfigFilePath => $extensionConfigFileContent]); - $configReader = $objectManager->create( - 'Magento\Framework\Api\ExtensionAttribute\Config\Reader', - ['fileResolver' => $extensionConfigFileResolverMock] - ); - /** @var \Magento\Framework\Api\ExtensionAttribute\Config $config */ - $config = $objectManager->create( - 'Magento\Framework\Api\ExtensionAttribute\Config', - ['reader' => $configReader] - ); - /** @var \Magento\Framework\Api\ExtensionAttributesFactory $extensionAttributesFactory */ - $extensionAttributesFactory = $objectManager->create( - 'Magento\Framework\Api\ExtensionAttributesFactory', - ['config' => $config] - ); - $productClassName = 'Magento\Catalog\Model\Product'; - /** @var \Magento\Catalog\Model\Resource\Product\Collection $collection */ - $collection = $objectManager->create('Magento\Catalog\Model\Resource\Product\Collection'); - - $extensionAttributesFactory->process($collection, $productClassName); - $config->reset(); - - $catalogProductEntity = $this->appResource->getTableName('catalog_product_entity'); - $catalogInventoryStockItem = $this->appResource->getTableName('cataloginventory_stock_item'); - $reviews = $this->appResource->getTableName('reviews'); - $expectedSql = <<<EXPECTED_SQL -SELECT `e`.*, - `extension_attribute_stock_item`.`qty` AS `extension_attribute_stock_item_qty`, - `extension_attribute_reviews`.`comment` AS `extension_attribute_reviews_comment`, - `extension_attribute_reviews`.`rating` AS `extension_attribute_reviews_rating`, - `extension_attribute_reviews`.`date` AS `extension_attribute_reviews_date` FROM `$catalogProductEntity` AS `e` - LEFT JOIN `$catalogInventoryStockItem` AS `extension_attribute_stock_item` ON e.id = extension_attribute_stock_item.id - LEFT JOIN `$reviews` AS `extension_attribute_reviews` ON e.id = extension_attribute_reviews.product_id -EXPECTED_SQL; - $resultSql = $collection->getSelectSql(true); - $formattedResultSql = str_replace(',', ",\n ", $resultSql); - $this->assertEquals($expectedSql, $formattedResultSql); - } - - /** - * @magentoDataFixture Magento/Catalog/_files/products.php - */ - public function testGetListWithExtensionAttributesAbstractModel() - { - $firstProductId = 1; - $firstProductQty = 11; - $secondProductId = 2; - $secondProductQty = 22; - /** @var \Magento\Framework\ObjectManagerInterface */ - $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); - /** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */ - $productRepository = $objectManager->create('Magento\Catalog\Api\ProductRepositoryInterface'); - /** @var \Magento\CatalogInventory\Api\StockItemRepositoryInterface $stockItemRepository */ - $stockItemRepository = $objectManager->get('Magento\CatalogInventory\Api\StockItemRepositoryInterface'); - - /** Prepare stock items */ - $firstStockItem = $productRepository->getById($firstProductId)->getExtensionAttributes()->getStockItem(); - $firstStockItem->setQty($firstProductQty); - $stockItemRepository->save($firstStockItem); - $this->assertEquals( - $firstProductQty, - $productRepository->getById($firstProductId)->getExtensionAttributes()->getStockItem()->getQty(), - 'Precondition failed.' - ); - $secondStockItem = $productRepository->getById($secondProductId)->getExtensionAttributes()->getStockItem(); - $secondStockItem->setQty($secondProductQty); - $stockItemRepository->save($secondStockItem); - $this->assertEquals( - $secondProductQty, - $productRepository->getById($secondProductId)->getExtensionAttributes()->getStockItem()->getQty(), - 'Precondition failed.' - ); - - /** @var \Magento\Framework\Api\Search\FilterGroup $searchCriteriaGroup */ - $searchCriteriaGroup = $objectManager->create('Magento\Framework\Api\Search\FilterGroup'); - /** @var \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria */ - $searchCriteria = $objectManager->create('Magento\Framework\Api\SearchCriteriaInterface'); - $searchCriteria->setFilterGroups([$searchCriteriaGroup]); - $products = $productRepository->getList($searchCriteria)->getItems(); - - /** Ensure that simple extension attributes were populated correctly */ - $this->assertEquals( - $firstProductQty, - $products[$firstProductId]->getExtensionAttributes()->getTestStockItemQty() - ); - $this->assertEquals( - $secondProductQty, - $products[$secondProductId]->getExtensionAttributes()->getTestStockItemQty() - ); - - /** Check population of complex extension attributes */ - $this->assertEquals( - $firstProductQty, - $products[$firstProductId]->getExtensionAttributes()->getTestStockItem()->getQty() - ); - $this->assertNotEmpty($products[$firstProductId]->getExtensionAttributes()->getTestStockItem()->getItemId()); - - $this->assertArrayNotHasKey( - 'extension_attribute_test_stock_item_qty_qty', - $products[$firstProductId]->getData(), - "Selected extension field should be unset after it is added to extension attributes object." - ); - } - - /** - * @magentoDataFixture Magento/Customer/_files/customer.php - * @magentoDataFixture Magento/Customer/_files/customer_group.php - */ - public function testGetListWithExtensionAttributesAbstractObject() - { - $customerId = 1; - $customerGroupName = 'General'; - $taxClassId = 3; - /** @var \Magento\Framework\ObjectManagerInterface */ - $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); - - /** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository */ - $customerRepository = $objectManager->get('Magento\Customer\Api\CustomerRepositoryInterface'); - /** @var \Magento\Framework\Api\Search\FilterGroup $searchCriteriaGroup */ - $searchCriteriaGroup = $objectManager->create('Magento\Framework\Api\Search\FilterGroup'); - /** @var \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria */ - $searchCriteria = $objectManager->create('Magento\Framework\Api\SearchCriteriaInterface'); - $searchCriteria->setFilterGroups([$searchCriteriaGroup]); - $customers = $customerRepository->getList($searchCriteria)->getItems(); - - /** Ensure that simple extension attributes were populated correctly */ - $customer = $customers[0]; - $this->assertEquals($customerId, $customer->getId(), 'Precondition failed'); - $this->assertEquals($customerGroupName, $customer->getExtensionAttributes()->getTestGroupCode()); - - /** Check population of complex extension attributes */ - $this->assertEquals($taxClassId, $customer->getExtensionAttributes()->getTestGroup()->getTaxClassId()); - $this->assertEquals($customerGroupName, $customer->getExtensionAttributes()->getTestGroup()->getCode()); - } - public function testCreateWithLogicException() { $this->setExpectedException( diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/extension_attributes.xml b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/extension_attributes.xml index 4b47d317898abda10226f72f7dac4a04004a6ad3..6b79d122ab83670e6d5e2e47294d1ceef395d61d 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/extension_attributes.xml +++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/extension_attributes.xml @@ -16,7 +16,7 @@ join_on_field="id" reference_field="id" > - <select_field>qty</select_field> + <field>qty</field> </join> </attribute> <attribute code="reviews" type="Magento\Reviews\Api\Data\Reviews[]"> @@ -24,9 +24,9 @@ reference_field="product_id" join_on_field="id" > - <select_field>comment</select_field> - <select_field>rating</select_field> - <select_field>date</select_field> + <field>comment</field> + <field>rating</field> + <field>date</field> </join> </attribute> </extension_attributes> diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/etc/extension_attributes.xml b/dev/tests/integration/testsuite/Magento/Framework/Api/etc/extension_attributes.xml index 68bc09b6590be6fd3617d210af26a150151363d6..6f5910737fe4709c4a62599fc3264fdda84d4e2d 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Api/etc/extension_attributes.xml +++ b/dev/tests/integration/testsuite/Magento/Framework/Api/etc/extension_attributes.xml @@ -16,8 +16,8 @@ join_on_field="entity_id" reference_field="product_id" > - <select_field>qty</select_field> - <select_field>item_id</select_field> + <field>qty</field> + <field>item_id</field> </join> </attribute> <attribute code="test_stock_item_qty" type="string"> @@ -28,17 +28,18 @@ join_on_field="entity_id" reference_field="product_id" > - <select_field>qty</select_field> + <field>qty</field> </join> </attribute> </extension_attributes> + <extension_attributes for="Magento\Customer\Api\Data\CustomerInterface"> <attribute code="test_group_code" type="string"> <join reference_table="customer_group" join_on_field="group_id" reference_field="customer_group_id" > - <select_field>customer_group_code</select_field> + <field>customer_group_code</field> </join> </attribute> <attribute code="test_group" type="Magento\Customer\Api\Data\GroupInterface"> @@ -46,8 +47,39 @@ join_on_field="group_id" reference_field="customer_group_id" > - <select_field>tax_class_id</select_field> - <select_field setter_name="setCode">customer_group_code</select_field> + <field>tax_class_id</field> + <field column="customer_group_code">code</field> + </join> + </attribute> + </extension_attributes> + + <extension_attributes for="Magento\Customer\Api\Data\GroupInterface"> + <attribute code="test_dummy_attribute" type="string"> + <join reference_table="eav_attribute" + reference_field="attribute_id" + join_on_field="customer_group_id" + > + <field>attribute_code</field> + </join> + </attribute> + <attribute code="test_complex_dummy_attribute" type="Magento\Catalog\Api\Data\ProductAttributeInterface"> + <join reference_table="admin_user" + reference_field="user_id" + join_on_field="customer_group_id" + > + <field column="username">attribute_code</field> + <field column="firstname">frontend_label</field> + </join> + </attribute> + </extension_attributes> + + <extension_attributes for="Magento\Sales\Api\Data\InvoiceInterface"> + <attribute code="test_dummy_attribute" type="string"> + <join reference_table="eav_attribute" + reference_field="attribute_id" + join_on_field="entity_id" + > + <field>attribute_code</field> </join> </attribute> </extension_attributes> diff --git a/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php new file mode 100644 index 0000000000000000000000000000000000000000..bd9f8528bc1d761260c03317e0bfc8c255d0cbae --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php @@ -0,0 +1,32 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Composer; + +use Magento\Framework\App\Filesystem\DirectoryList; + +class RemoveTest extends \PHPUnit_Framework_TestCase +{ + public function testRemove() + { + $composerApp = $this->getMock( + 'Composer\Console\Application', + ['setAutoExit', 'resetComposer', 'run'], + [], + '', + false + ); + $directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); + $directoryList->expects($this->once())->method('getRoot'); + $directoryList->expects($this->once()) + ->method('getPath') + ->with(DirectoryList::CONFIG) + ->willReturn(BP . '/app/etc'); + $composerApp->expects($this->once())->method('setAutoExit')->with(false); + $composerApp->expects($this->once())->method('run'); + $remove = new Remove($composerApp, $directoryList); + $remove->remove(['magento/package-a', 'magento/package-b']); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Quote/Model/Quote/Item/RepositoryTest.php b/dev/tests/integration/testsuite/Magento/Quote/Model/Quote/Item/RepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b7e78e977191f0567e6766321b3628c0c506ac4b --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Quote/Model/Quote/Item/RepositoryTest.php @@ -0,0 +1,40 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Quote\Model\Quote\Item; + +use Magento\TestFramework\Helper\Bootstrap; + +class RepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @magentoDataFixture Magento/Sales/_files/quote.php + */ + public function testGetList() + { + $expectedExtensionAttributes = [ + 'firstname' => 'firstname', + 'lastname' => 'lastname', + 'email' => 'admin@example.com' + ]; + + /** @var \Magento\Quote\Model\Quote\Item\Repository $quoteItemRepository */ + $quoteItemRepository = Bootstrap::getObjectManager()->create('Magento\Quote\Model\Quote\Item\Repository'); + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = Bootstrap::getObjectManager()->create('Magento\Quote\Model\Quote'); + $quoteId = $quote->load('test01', 'reserved_order_id')->getId(); + + /** @var \Magento\Quote\Api\Data\CartItemInterface[] $quoteItems */ + $quoteItems = $quoteItemRepository->getList($quoteId); + /** @var \Magento\Quote\Api\Data\CartItemInterface $actualQuoteItem */ + $actualQuoteItem = array_pop($quoteItems); + $this->assertInstanceOf('Magento\Quote\Api\Data\CartItemInterface', $actualQuoteItem); + /** @var \Magento\User\Api\Data\UserInterface $testAttribute */ + $testAttribute = $actualQuoteItem->getExtensionAttributes()->getQuoteItemTestAttribute(); + $this->assertEquals($expectedExtensionAttributes['firstname'], $testAttribute->getFirstName()); + $this->assertEquals($expectedExtensionAttributes['lastname'], $testAttribute->getLastName()); + $this->assertEquals($expectedExtensionAttributes['email'], $testAttribute->getEmail()); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Quote/Model/QuoteRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Quote/Model/QuoteRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0d7b1ea35f3b7ca356ea0e36875f68e454ebd040 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Quote/Model/QuoteRepositoryTest.php @@ -0,0 +1,40 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Quote\Model; + +use Magento\TestFramework\Helper\Bootstrap; + +class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @magentoDataFixture Magento/Sales/_files/quote.php + */ + public function testGetList() + { + $expectedExtensionAttributes = [ + 'firstname' => 'firstname', + 'lastname' => 'lastname', + 'email' => 'admin@example.com' + ]; + + /** @var \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder */ + $searchCriteriaBuilder = Bootstrap::getObjectManager()->create('Magento\Framework\Api\SearchCriteriaBuilder'); + + /** @var \Magento\Quote\Model\QuoteRepository $quoteRepository */ + $quoteRepository = Bootstrap::getObjectManager()->create('Magento\Quote\Model\QuoteRepository'); + $searchResult = $quoteRepository->getList($searchCriteriaBuilder->create()); + $items = $searchResult->getItems(); + /** @var \Magento\Quote\Api\Data\CartInterface $actualQuote */ + $actualQuote = array_pop($items); + $this->assertInstanceOf('Magento\Quote\Api\Data\CartInterface', $actualQuote); + $this->assertEquals('test01', $actualQuote->getReservedOrderId()); + /** @var \Magento\User\Api\Data\UserInterface $testAttribute */ + $testAttribute = $actualQuote->getExtensionAttributes()->getQuoteTestAttribute(); + $this->assertEquals($expectedExtensionAttributes['firstname'], $testAttribute->getFirstName()); + $this->assertEquals($expectedExtensionAttributes['lastname'], $testAttribute->getLastName()); + $this->assertEquals($expectedExtensionAttributes['email'], $testAttribute->getEmail()); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Quote/etc/extension_attributes.xml b/dev/tests/integration/testsuite/Magento/Quote/etc/extension_attributes.xml new file mode 100644 index 0000000000000000000000000000000000000000..b71757a71adde3e42c6f2aa1ef22b3b439bb4807 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Quote/etc/extension_attributes.xml @@ -0,0 +1,34 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd"> + <extension_attributes for="Magento\Quote\Api\Data\CartInterface"> + <attribute code="quoteTestAttribute" type="Magento\User\Api\Data\UserInterface"> + <join reference_table="admin_user" + join_on_field="store_id" + reference_field="user_id" + > + <field>firstname</field> + <field>lastname</field> + <field>email</field> + </join> + </attribute> + </extension_attributes> + <extension_attributes for="Magento\Quote\Api\Data\CartItemInterface"> + <attribute code="quoteItemTestAttribute" type="Magento\User\Api\Data\UserInterface"> + <join reference_table="admin_user" + join_on_field="store_id" + reference_field="user_id" + > + <field>firstname</field> + <field>lastname</field> + <field>email</field> + </join> + </attribute> + </extension_attributes> +</config> diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php b/dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php new file mode 100644 index 0000000000000000000000000000000000000000..cdcf2ca0817ffc06a9d5fc2793344ca3b535dacf --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php @@ -0,0 +1,110 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Model; + +/** + * Tests Magento\Setup\Model\ComposerInformation + */ +class ComposerInformationTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Filesystem\Directory\Read + */ + private $directoryReadMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Filesystem + */ + private $filesystemMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Composer\IO\BufferIO + */ + private $ioMock; + + public function setUp() + { + $this->directoryReadMock = $this->getMock('Magento\Framework\Filesystem\Directory\Read', [], [], '', false); + $this->filesystemMock = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); + $this->filesystemMock + ->expects($this->any()) + ->method('getDirectoryRead') + ->will($this->returnValue($this->directoryReadMock)); + $this->ioMock = $this->getMock('Composer\IO\BufferIO', [], [], '', false); + } + + /** + * Setup DirectoryReadMock to use a specified directory for reading composer files + * + * @param $composerDir string Directory under _files that contains composer files + */ + private function setupDirectoryMock($composerDir) + { + $valueMap = [ + ['vendor_path.php', null, __DIR__ . '/_files/vendor_path.php'], + [null, null, __DIR__ . '/_files/' . $composerDir], + ]; + + $this->directoryReadMock + ->expects($this->any()) + ->method('getAbsolutePath') + ->will($this->returnValueMap($valueMap)); + } + + /** + * @param $composerDir string Directory under _files that contains composer files + * + * @dataProvider getRequiredPhpVersionDataProvider + */ + public function testGetRequiredPhpVersion($composerDir) + { + $this->setupDirectoryMock($composerDir); + $composerInfo = new ComposerInformation($this->filesystemMock, $this->ioMock); + $this->assertEquals("~5.5.0|~5.6.0", $composerInfo->getRequiredPhpVersion()); + } + + /** + * @param $composerDir string Directory under _files that contains composer files + * + * @dataProvider getRequiredPhpVersionDataProvider + */ + public function testGetRequiredExtensions($composerDir) + { + $this->setupDirectoryMock($composerDir); + $composerInfo = new ComposerInformation($this->filesystemMock, $this->ioMock); + $expectedExtensions = ['ctype', 'gd', 'spl', 'dom', 'simplexml', 'mcrypt', 'hash', 'curl', 'iconv', 'intl']; + + $actualRequiredExtensions = $composerInfo->getRequiredExtensions(); + foreach ($expectedExtensions as $expectedExtension) { + $this->assertContains($expectedExtension, $actualRequiredExtensions); + } + } + + /** + * Data provider that returns directories containing different types of composer files. + * + * @return array + */ + public function getRequiredPhpVersionDataProvider() + { + return [ + 'Skeleton Composer' => ['testSkeleton'], + 'Composer.json from git clone' => ['testFromClone'], + 'Composer.json from git create project' => ['testFromCreateProject'], + ]; + } + + /** + * @expectedException \Exception + * @expectedExceptionMessage Composer file not found: + */ + public function testNoLock() + { + $this->setupDirectoryMock('notARealDirectory'); + new ComposerInformation($this->filesystemMock, $this->ioMock); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.json b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.json new file mode 100644 index 0000000000000000000000000000000000000000..4f3e3fd09aa9f3a1e3c193cd60f213a5bf917c97 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.json @@ -0,0 +1,215 @@ +{ + "name": "magento/magento2ce", + "description": "Magento 2 (Community Edition)", + "type": "project", + "version": "0.74.0-beta9", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "require": { + "php": "~5.5.0|~5.6.0", + "zendframework/zend-stdlib": "2.4.0", + "zendframework/zend-code": "2.4.0", + "zendframework/zend-server": "2.4.0", + "zendframework/zend-soap": "2.4.0", + "zendframework/zend-uri": "2.4.0", + "zendframework/zend-validator": "2.4.0", + "zendframework/zend-console": "2.4.0", + "zendframework/zend-modulemanager": "2.4.0", + "zendframework/zend-mvc": "2.4.0", + "zendframework/zend-text": "2.4.0", + "zendframework/zend-i18n": "2.4.0", + "zendframework/zend-eventmanager": "2.4.0", + "zendframework/zend-view": "2.4.0", + "zendframework/zend-servicemanager": "2.4.0", + "zendframework/zend-json": "2.4.0", + "zendframework/zend-config": "2.4.0", + "zendframework/zend-form": "2.4.0", + "zendframework/zend-di": "2.4.0", + "zendframework/zend-serializer": "2.4.0", + "zendframework/zend-log": "2.4.0", + "zendframework/zend-http": "2.4.0", + "magento/zendframework1": "1.12.10", + "composer/composer": "1.0.0-alpha9", + "monolog/monolog": "1.11.0", + "oyejorge/less.php": "1.7.0.3", + "tubalmartin/cssmin": "2.4.8-p4", + "magento/magento-composer-installer": "*", + "symfony/console": "~2.3" + }, + "require-dev": { + "phpunit/phpunit": "4.1.0", + "squizlabs/php_codesniffer": "1.5.3", + "phpmd/phpmd": "@stable", + "pdepend/pdepend": "2.0.6", + "lib-libxml": "*", + "ext-ctype": "*", + "ext-gd": "*", + "ext-spl": "*", + "ext-dom": "*", + "ext-simplexml": "*", + "ext-mcrypt": "*", + "ext-hash": "*", + "ext-curl": "*", + "ext-iconv": "*", + "ext-intl": "*", + "sjparkinson/static-review": "~4.1", + "fabpot/php-cs-fixer": "~1.2", + "lusitanian/oauth": "~0.3" + }, + "replace": { + "magento/module-admin-notification": "self.version", + "magento/module-authorization": "self.version", + "magento/module-backend": "self.version", + "magento/module-backup": "self.version", + "magento/module-bundle": "self.version", + "magento/module-cache-invalidate": "self.version", + "magento/module-captcha": "self.version", + "magento/module-catalog": "self.version", + "magento/module-catalog-import-export": "self.version", + "magento/module-catalog-inventory": "self.version", + "magento/module-catalog-rule": "self.version", + "magento/module-catalog-search": "self.version", + "magento/module-catalog-url-rewrite": "self.version", + "magento/module-catalog-widget": "self.version", + "magento/module-centinel": "self.version", + "magento/module-checkout": "self.version", + "magento/module-checkout-agreements": "self.version", + "magento/module-cms": "self.version", + "magento/module-cms-url-rewrite": "self.version", + "magento/module-config": "self.version", + "magento/module-configurable-import-export": "self.version", + "magento/module-configurable-product": "self.version", + "magento/module-contact": "self.version", + "magento/module-cookie": "self.version", + "magento/module-cron": "self.version", + "magento/module-currency-symbol": "self.version", + "magento/module-customer": "self.version", + "magento/module-customer-import-export": "self.version", + "magento/module-design-editor": "self.version", + "magento/module-developer": "self.version", + "magento/module-dhl": "self.version", + "magento/module-directory": "self.version", + "magento/module-downloadable": "self.version", + "magento/module-eav": "self.version", + "magento/module-email": "self.version", + "magento/module-fedex": "self.version", + "magento/module-gift-message": "self.version", + "magento/module-google-adwords": "self.version", + "magento/module-google-analytics": "self.version", + "magento/module-google-optimizer": "self.version", + "magento/module-google-shopping": "self.version", + "magento/module-grouped-import-export": "self.version", + "magento/module-grouped-product": "self.version", + "magento/module-import-export": "self.version", + "magento/module-indexer": "self.version", + "magento/module-integration": "self.version", + "magento/module-layered-navigation": "self.version", + "magento/module-log": "self.version", + "magento/module-media-storage": "self.version", + "magento/module-msrp": "self.version", + "magento/module-multishipping": "self.version", + "magento/module-newsletter": "self.version", + "magento/module-offline-payments": "self.version", + "magento/module-offline-shipping": "self.version", + "magento/module-page-cache": "self.version", + "magento/module-payment": "self.version", + "magento/module-persistent": "self.version", + "magento/module-product-alert": "self.version", + "magento/module-quote": "self.version", + "magento/module-reports": "self.version", + "magento/module-require-js": "self.version", + "magento/module-review": "self.version", + "magento/module-rss": "self.version", + "magento/module-rule": "self.version", + "magento/module-sales": "self.version", + "magento/module-sales-rule": "self.version", + "magento/module-sales-sequence": "self.version", + "magento/module-search": "self.version", + "magento/module-sendfriend": "self.version", + "magento/module-shipping": "self.version", + "magento/module-sitemap": "self.version", + "magento/module-store": "self.version", + "magento/module-tax": "self.version", + "magento/module-tax-import-export": "self.version", + "magento/module-theme": "self.version", + "magento/module-translation": "self.version", + "magento/module-ui": "self.version", + "magento/module-ups": "self.version", + "magento/module-url-rewrite": "self.version", + "magento/module-user": "self.version", + "magento/module-usps": "self.version", + "magento/module-variable": "self.version", + "magento/module-version": "self.version", + "magento/module-webapi": "self.version", + "magento/module-weee": "self.version", + "magento/module-widget": "self.version", + "magento/module-wishlist": "self.version", + "magento/theme-adminhtml-backend": "self.version", + "magento/theme-frontend-blank": "self.version", + "magento/theme-frontend-luma": "self.version", + "magento/language-de_de": "self.version", + "magento/language-en_us": "self.version", + "magento/language-es_es": "self.version", + "magento/language-fr_fr": "self.version", + "magento/language-nl_nl": "self.version", + "magento/language-pt_br": "self.version", + "magento/language-zh_cn": "self.version", + "magento/framework": "self.version", + "trentrichardson/jquery-timepicker-addon": "1.4.3", + "colinmollenhour/cache-backend-redis": "dev-master#193d377b7fb2e88595578b282fa01a62d1185abc", + "colinmollenhour/credis": "dev-master#f07bbfd4117294f462f0fb19c49221d350bf396f", + "linkorb/jsmin-php": "1.1.2", + "phpseclib/phpseclib": "0.2.1", + "components/jquery": "1.11.0", + "blueimp/jquery-file-upload": "5.6.14", + "components/jqueryui": "1.10.4", + "twbs/bootstrap": "3.1.0", + "tinymce/tinymce": "3.4.7" + }, + "extra": { + "component_paths": { + "trentrichardson/jquery-timepicker-addon": "lib/web/jquery/jquery-ui-timepicker-addon.js", + "colinmollenhour/cache-backend-redis": "lib/internal/Cm/Cache/Backend/Redis.php", + "colinmollenhour/credis": "lib/internal/Credis", + "linkorb/jsmin-php": "lib/internal/JSMin", + "phpseclib/phpseclib": "lib/internal/phpseclib", + "components/jquery": [ + "lib/web/jquery.js", + "lib/web/jquery/jquery.min.js", + "lib/web/jquery/jquery-migrate.js", + "lib/web/jquery/jquery-migrate.min.js" + ], + "blueimp/jquery-file-upload": "lib/web/jquery/fileUploader", + "components/jqueryui": [ + "lib/web/jquery/jquery-ui.js", + "lib/web/jquery/jquery-ui.min.js" + ], + "twbs/bootstrap": [ + "lib/web/jquery/jquery.tabs.js" + ], + "tinymce/tinymce": "lib/web/tiny_mce" + } + }, + "config": { + "use-include-path": true + }, + "autoload": { + "psr-4": { + "Magento\\Framework\\": "lib/internal/Magento/Framework/", + "Magento\\Setup\\": "setup/src/Magento/Setup/" + } + }, + "autoload-dev": { + "psr-4": { + "Magento\\Sniffs\\": "dev/tests/static/framework/Magento/Sniffs/", + "Magento\\Tools\\": "dev/tools/Magento/Tools/", + "Magento\\Tools\\Sanity\\": "dev/build/publication/sanity/Magento/Tools/Sanity/", + "Magento\\TestFramework\\Inspection\\": "dev/tests/static/framework/Magento/TestFramework/Inspection/", + "Magento\\TestFramework\\Utility\\": "dev/tests/static/framework/Magento/TestFramework/Utility/" + } + }, + "minimum-stability": "alpha", + "prefer-stable": true +} diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.lock b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.lock new file mode 100644 index 0000000000000000000000000000000000000000..821b8b89ce17c63fdf6db5e167b6261eba24e45a --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.lock @@ -0,0 +1,3517 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "b84fdfc407c466b5a784bc2991459388", + "packages": [ + { + "name": "composer/composer", + "version": "1.0.0-alpha9", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "eb1ce550ca51134ee619ad3e37f5a0b7e980dd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/eb1ce550ca51134ee619ad3e37f5a0b7e980dd24", + "reference": "eb1ce550ca51134ee619ad3e37f5a0b7e980dd24", + "shasum": "" + }, + "require": { + "justinrainbow/json-schema": "~1.1", + "php": ">=5.3.2", + "seld/jsonlint": "~1.0", + "symfony/console": "~2.3", + "symfony/finder": "~2.2", + "symfony/process": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives, and allows gzip compression of all internet traffic" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Composer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.", + "homepage": "http://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "time": "2014-12-07 17:15:20" + }, + { + "name": "justinrainbow/json-schema", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2465fe486c864e30badaa4d005ebdf89dbc503f3", + "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "json-schema/json-schema-test-suite": "1.1.0", + "phpdocumentor/phpdocumentor": "~2", + "phpunit/phpunit": "~3.7" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "JsonSchema": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2015-03-27 16:41:39" + }, + { + "name": "magento/magento-composer-installer", + "version": "0.1.4", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-composer-installer.git", + "reference": "7f03451f71e55d52c2bb07325d56a4e6df322f30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-composer-installer/zipball/7f03451f71e55d52c2bb07325d56a4e6df322f30", + "reference": "7f03451f71e55d52c2bb07325d56a4e6df322f30", + "shasum": "" + }, + "require": { + "composer-plugin-api": "1.0.0" + }, + "require-dev": { + "composer/composer": "*@dev", + "firegento/phpcs": "dev-patch-1", + "mikey179/vfsstream": "*", + "phpunit/phpunit": "*", + "phpunit/phpunit-mock-objects": "dev-master", + "squizlabs/php_codesniffer": "1.4.7", + "symfony/process": "*" + }, + "type": "composer-plugin", + "extra": { + "composer-command-registry": [ + "MagentoHackathon\\Composer\\Magento\\Command\\DeployCommand" + ], + "class": "MagentoHackathon\\Composer\\Magento\\Plugin" + }, + "autoload": { + "psr-0": { + "MagentoHackathon\\Composer\\Magento": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Vinai Kopp", + "email": "vinai@netzarbeiter.com" + }, + { + "name": "Daniel Fahlke aka Flyingmana", + "email": "flyingmana@googlemail.com" + }, + { + "name": "Jörg Weller", + "email": "weller@flagbit.de" + }, + { + "name": "Karl Spies", + "email": "karl.spies@gmx.net" + }, + { + "name": "Tobias Vogt", + "email": "tobi@webguys.de" + }, + { + "name": "David Fuhr", + "email": "fuhr@flagbit.de" + } + ], + "description": "Composer installer for Magento modules", + "homepage": "https://github.com/magento/magento-composer-installer", + "keywords": [ + "composer-installer", + "magento" + ], + "time": "2015-03-05 21:40:30" + }, + { + "name": "magento/zendframework1", + "version": "1.12.10", + "source": { + "type": "git", + "url": "https://github.com/magento/zf1.git", + "reference": "d1e5cd8c9f83229bcdd9bb485c3ce25259c77884" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/zf1/zipball/d1e5cd8c9f83229bcdd9bb485c3ce25259c77884", + "reference": "d1e5cd8c9f83229bcdd9bb485c3ce25259c77884", + "shasum": "" + }, + "require": { + "php": ">=5.2.11" + }, + "require-dev": { + "phpunit/dbunit": "1.3.*", + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "library/" + ], + "license": [ + "BSD-3-Clause" + ], + "description": "Magento Zend Framework 1", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "framework" + ], + "time": "2015-02-06 17:25:45" + }, + { + "name": "monolog/monolog", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "ec3961874c43840e96da3a8a1ed20d8c73d7e5aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/ec3961874c43840e96da3a8a1ed20d8c73d7e5aa", + "reference": "ec3961874c43840e96da3a8a1ed20d8c73d7e5aa", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "~2.4, >2.4.8", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "phpunit/phpunit": "~3.7.0", + "raven/raven": "~0.5", + "ruflin/elastica": "0.90.*", + "videlalvaro/php-amqplib": "~2.4" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "raven/raven": "Allow sending log messages to a Sentry server", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2014-09-30 13:30:58" + }, + { + "name": "oyejorge/less.php", + "version": "v1.7.0.3", + "source": { + "type": "git", + "url": "https://github.com/oyejorge/less.php.git", + "reference": "6e08ecb07e6f6d9170c23e8744c58fdd822ad0de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oyejorge/less.php/zipball/6e08ecb07e6f6d9170c23e8744c58fdd822ad0de", + "reference": "6e08ecb07e6f6d9170c23e8744c58fdd822ad0de", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "bin": [ + "bin/lessc" + ], + "type": "library", + "autoload": { + "psr-0": { + "Less": "lib/" + }, + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Matt Agar", + "homepage": "https://github.com/agar" + }, + { + "name": "Martin JantoÅ¡oviÄ", + "homepage": "https://github.com/Mordred" + }, + { + "name": "Josh Schmidt", + "homepage": "https://github.com/oyejorge" + } + ], + "description": "PHP port of the Javascript version of LESS http://lesscss.org", + "homepage": "http://lessphp.gpeasy.com", + "keywords": [ + "css", + "less", + "less.js", + "lesscss", + "php", + "stylesheet" + ], + "time": "2015-03-10 18:12:59" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "seld/jsonlint", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "863ae85c6d3ef60ca49cb12bd051c4a0648c40c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/863ae85c6d3ef60ca49cb12bd051c4a0648c40c4", + "reference": "863ae85c6d3ef60ca49cb12bd051c4a0648c40c4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "time": "2015-01-04 21:18:15" + }, + { + "name": "symfony/console", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "ebc5679854aa24ed7d65062e9e3ab0b18a917272" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/ebc5679854aa24ed7d65062e9e3ab0b18a917272", + "reference": "ebc5679854aa24ed7d65062e9e3ab0b18a917272", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/phpunit-bridge": "~2.7", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/finder", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "704c64c8b12c8882640d5c0330a8414b1e06dc99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/704c64c8b12c8882640d5c0330a8414b1e06dc99", + "reference": "704c64c8b12c8882640d5c0330a8414b1e06dc99", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/process", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "9f3c4baaf840ed849e1b1f7bfd5ae246e8509562" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/9f3c4baaf840ed849e1b1f7bfd5ae246e8509562", + "reference": "9f3c4baaf840ed849e1b1f7bfd5ae246e8509562", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "tubalmartin/cssmin", + "version": "v2.4.8-p4", + "source": { + "type": "git", + "url": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port.git", + "reference": "fe84d71e8420243544c0ce3bd0f5d7c1936b0f90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tubalmartin/YUI-CSS-compressor-PHP-port/zipball/fe84d71e8420243544c0ce3bd0f5d7c1936b0f90", + "reference": "fe84d71e8420243544c0ce3bd0f5d7c1936b0f90", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "cssmin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Túbal MartÃn", + "homepage": "http://tubalmartin.me/" + } + ], + "description": "A PHP port of the YUI CSS compressor", + "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port", + "keywords": [ + "compress", + "compressor", + "css", + "minify", + "yui" + ], + "time": "2014-09-22 08:08:50" + }, + { + "name": "zendframework/zend-code", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendCode.git", + "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendCode/zipball/cfd5951ff4348e4430850560416c7ddb755f95d3", + "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version" + }, + "require-dev": { + "doctrine/common": ">=2.1", + "zendframework/zend-stdlib": "self.version" + }, + "suggest": { + "doctrine/common": "Doctrine\\Common >=2.1 for annotation features", + "zendframework/zend-stdlib": "Zend\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Code\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides facilities to generate arbitrary code using an object oriented interface", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "code", + "zf2" + ], + "time": "2015-04-01 17:59:08" + }, + { + "name": "zendframework/zend-config", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendConfig.git", + "reference": "8682fe4e2923b383bb6472fc84b5796a07589163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendConfig/zipball/8682fe4e2923b383bb6472fc84b5796a07589163", + "reference": "8682fe4e2923b383bb6472fc84b5796a07589163", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json to use the Json reader or writer classes", + "zendframework/zend-servicemanager": "Zend\\ServiceManager for use with the Config Factory to retrieve reader and writer instances" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a nested object property based user interface for accessing this configuration data within application code", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "config", + "zf2" + ], + "time": "2015-04-01 17:59:31" + }, + { + "name": "zendframework/zend-console", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendConsole.git", + "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendConsole/zipball/94ab6663b07e19f20b3319ecf317bd72b6a72dca", + "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "suggest": { + "zendframework/zend-filter": "To support DefaultRouteMatcher usage", + "zendframework/zend-validator": "To support DefaultRouteMatcher usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "console", + "zf2" + ], + "time": "2015-04-01 17:59:48" + }, + { + "name": "zendframework/zend-di", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendDi.git", + "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendDi/zipball/0811f2a67ad0b50dfb8d602ed67cde0b82249190", + "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-code": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Di\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "di", + "zf2" + ], + "time": "2015-04-01 18:01:30" + }, + { + "name": "zendframework/zend-escaper", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendEscaper.git", + "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendEscaper/zipball/65b3328627362b0be1d5e9067bc846511d1fbc96", + "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Escaper\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "escaper", + "zf2" + ], + "time": "2015-04-01 18:02:07" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendEventManager.git", + "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendEventManager/zipball/38df5b567d4ff4d22144745c503ba0502d0d5695", + "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "eventmanager", + "zf2" + ], + "time": "2015-04-01 18:05:26" + }, + { + "name": "zendframework/zend-filter", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendFilter.git", + "reference": "b13741a88553351fc52472de529b57b580b8f6f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendFilter/zipball/b13741a88553351fc52472de529b57b580b8f6f1", + "reference": "b13741a88553351fc52472de529b57b580b8f6f1", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-crypt": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-crypt": "Zend\\Crypt component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-uri": "Zend\\Uri component for UriNormalize filter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Filter\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed data filters", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "filter", + "zf2" + ], + "time": "2015-04-01 18:09:25" + }, + { + "name": "zendframework/zend-form", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendForm.git", + "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendForm/zipball/09f5bd46ffbf783df22281898e2175b291bd43a3", + "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-inputfilter": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-captcha": "self.version", + "zendframework/zend-code": "self.version", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-validator": "self.version", + "zendframework/zend-view": "self.version", + "zendframework/zendservice-recaptcha": "*" + }, + "suggest": { + "zendframework/zend-captcha": "Zend\\Captcha component", + "zendframework/zend-code": "Zend\\Code component", + "zendframework/zend-eventmanager": "Zend\\EventManager component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-validator": "Zend\\Validator component", + "zendframework/zend-view": "Zend\\View component", + "zendframework/zendservice-recaptcha": "ZendService\\ReCaptcha component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Form\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "form", + "zf2" + ], + "time": "2015-04-01 18:09:25" + }, + { + "name": "zendframework/zend-http", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendHttp.git", + "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendHttp/zipball/ee6220609845b32d1b2873c9ac694aef56d508f5", + "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-loader": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-uri": "self.version", + "zendframework/zend-validator": "self.version" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Http\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "http", + "zf2" + ], + "time": "2015-04-01 18:09:25" + }, + { + "name": "zendframework/zend-i18n", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendI18n.git", + "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendI18n/zipball/33051775d9a8c341fe3b77d1f3daa0e921e2f4bd", + "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-cache": "self.version", + "zendframework/zend-config": "self.version", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-validator": "self.version", + "zendframework/zend-view": "self.version" + }, + "suggest": { + "ext-intl": "Required for most features of Zend\\I18n; included in default builds of PHP", + "zendframework/zend-cache": "Zend\\Cache component", + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-eventmanager": "You should install this package to use the events in the translator", + "zendframework/zend-filter": "You should install this package to use the provided filters", + "zendframework/zend-resources": "Translation resources", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-validator": "You should install this package to use the provided validators", + "zendframework/zend-view": "You should install this package to use the provided view helpers" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\I18n\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "i18n", + "zf2" + ], + "time": "2015-04-01 18:09:26" + }, + { + "name": "zendframework/zend-inputfilter", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendInputFilter.git", + "reference": "16856fec61f285e41e5492235220a4dec06ab90f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendInputFilter/zipball/16856fec61f285e41e5492235220a4dec06ab90f", + "reference": "16856fec61f285e41e5492235220a4dec06ab90f", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-filter": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-validator": "self.version" + }, + "require-dev": { + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "To support plugin manager support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\InputFilter\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "inputfilter", + "zf2" + ], + "time": "2015-04-01 18:09:26" + }, + { + "name": "zendframework/zend-json", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendJson.git", + "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendJson/zipball/76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c", + "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-http": "self.version", + "zendframework/zend-server": "self.version" + }, + "suggest": { + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-server": "Zend\\Server component", + "zendframework/zendxml": "To support Zend\\Json\\Json::fromXml() usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Json\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "json", + "zf2" + ], + "time": "2015-04-01 18:09:26" + }, + { + "name": "zendframework/zend-loader", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendLoader.git", + "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendLoader/zipball/6868b8a0c346f17fb97724c3a63aa2cbf6b94865", + "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Loader\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "loader", + "zf2" + ], + "time": "2015-04-01 18:09:26" + }, + { + "name": "zendframework/zend-log", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendLog.git", + "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendLog/zipball/2d5d20fd45470506bdaff727c46dc25fe953146e", + "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-console": "self.version", + "zendframework/zend-db": "self.version", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-mail": "self.version", + "zendframework/zend-validator": "self.version" + }, + "suggest": { + "ext-mongo": "*", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-escaper": "Zend\\Escaper component, for use in the XML formatter", + "zendframework/zend-mail": "Zend\\Mail component", + "zendframework/zend-validator": "Zend\\Validator component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "component for general purpose logging", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "log", + "logging", + "zf2" + ], + "time": "2015-04-01 18:09:26" + }, + { + "name": "zendframework/zend-math", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendMath.git", + "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendMath/zipball/634123f83ca90b6613f132d0d100e6b5e9890a29", + "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "suggest": { + "ext-bcmath": "If using the bcmath functionality", + "ext-gmp": "If using the gmp functionality", + "ircmaxell/random-lib": "Fallback random byte generator for Zend\\Math\\Rand if OpenSSL/Mcrypt extensions are unavailable", + "zendframework/zend-servicemanager": ">= current version, if using the BigInteger::factory functionality" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Math\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "math", + "zf2" + ], + "time": "2015-04-01 18:09:27" + }, + { + "name": "zendframework/zend-modulemanager", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendModuleManager.git", + "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendModuleManager/zipball/cbe16b0eafe734a062ed0182381e64b9c953dccf", + "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-config": "self.version", + "zendframework/zend-console": "self.version", + "zendframework/zend-loader": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-loader": "Zend\\Loader component", + "zendframework/zend-mvc": "Zend\\Mvc component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\ModuleManager\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "modulemanager", + "zf2" + ], + "time": "2015-04-01 18:09:27" + }, + { + "name": "zendframework/zend-mvc", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendMvc.git", + "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendMvc/zipball/bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412", + "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-form": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-authentication": "self.version", + "zendframework/zend-console": "self.version", + "zendframework/zend-di": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-http": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-inputfilter": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-log": "self.version", + "zendframework/zend-modulemanager": "self.version", + "zendframework/zend-serializer": "self.version", + "zendframework/zend-session": "self.version", + "zendframework/zend-text": "self.version", + "zendframework/zend-uri": "self.version", + "zendframework/zend-validator": "self.version", + "zendframework/zend-version": "self.version", + "zendframework/zend-view": "self.version" + }, + "suggest": { + "zendframework/zend-authentication": "Zend\\Authentication component for Identity plugin", + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-di": "Zend\\Di component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-i18n": "Zend\\I18n component for translatable segments", + "zendframework/zend-inputfilter": "Zend\\Inputfilter component", + "zendframework/zend-json": "Zend\\Json component", + "zendframework/zend-log": "Zend\\Log component", + "zendframework/zend-modulemanager": "Zend\\ModuleManager component", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-session": "Zend\\Session component for FlashMessenger, PRG, and FPRG plugins", + "zendframework/zend-stdlib": "Zend\\Stdlib component", + "zendframework/zend-text": "Zend\\Text component", + "zendframework/zend-uri": "Zend\\Uri component", + "zendframework/zend-validator": "Zend\\Validator component", + "zendframework/zend-version": "Zend\\Version component", + "zendframework/zend-view": "Zend\\View component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Mvc\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "mvc", + "zf2" + ], + "time": "2015-04-01 18:09:27" + }, + { + "name": "zendframework/zend-serializer", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendSerializer.git", + "reference": "a46960854d6326f0036d98c9abc7a79e36e25928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendSerializer/zipball/a46960854d6326f0036d98c9abc7a79e36e25928", + "reference": "a46960854d6326f0036d98c9abc7a79e36e25928", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-json": "self.version", + "zendframework/zend-math": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "To support plugin manager support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Serializer\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "serializer", + "zf2" + ], + "time": "2015-04-01 18:09:28" + }, + { + "name": "zendframework/zend-server", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendServer.git", + "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendServer/zipball/fc73c34490908ba143af3c57c7e166b40c4b9f8e", + "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-code": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Server\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "server", + "zf2" + ], + "time": "2015-04-01 18:09:28" + }, + { + "name": "zendframework/zend-servicemanager", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendServiceManager.git", + "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendServiceManager/zipball/d3c27c708a148a30608f313a5b7a61a531bd9cb9", + "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "zendframework/zend-di": "self.version" + }, + "suggest": { + "ocramius/proxy-manager": "ProxyManager 0.5.* to handle lazy initialization of services", + "zendframework/zend-di": "Zend\\Di component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\ServiceManager\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "servicemanager", + "zf2" + ], + "time": "2015-04-01 18:09:28" + }, + { + "name": "zendframework/zend-soap", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendSoap.git", + "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendSoap/zipball/e42b900798ea95a9063fa4922da976d8b3a8ab6f", + "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-server": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-uri": "self.version" + }, + "require-dev": { + "zendframework/zend-http": "self.version" + }, + "suggest": { + "zendframework/zend-http": "Zend\\Http component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Soap\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "soap", + "zf2" + ], + "time": "2015-04-01 18:09:29" + }, + { + "name": "zendframework/zend-stdlib", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendStdlib.git", + "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendStdlib/zipball/eab586f4c18af3fa63c977611939f1f4a3cf1030", + "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-serializer": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-eventmanager": "To support aggregate hydrator usage", + "zendframework/zend-filter": "To support naming strategy hydrator usage", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-servicemanager": "To support hydrator plugin manager usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Stdlib\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "stdlib", + "zf2" + ], + "time": "2015-04-01 18:09:29" + }, + { + "name": "zendframework/zend-text", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendText.git", + "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendText/zipball/35f519e20e575a331c2ee554e5a555a59ce4b9e2", + "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Text\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "text", + "zf2" + ], + "time": "2015-04-01 18:09:29" + }, + { + "name": "zendframework/zend-uri", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendUri.git", + "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendUri/zipball/53f5b162b293f80de8b951eece8e08be83c4fe16", + "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-validator": "self.version" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "uri", + "zf2" + ], + "time": "2015-04-01 18:09:29" + }, + { + "name": "zendframework/zend-validator", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendValidator.git", + "reference": "eb678d20256f120a72ca27276bbb2875841701ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendValidator/zipball/eb678d20256f120a72ca27276bbb2875841701ab", + "reference": "eb678d20256f120a72ca27276bbb2875841701ab", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-db": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-math": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-session": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-filter": "Zend\\Filter component, required by the Digits validator", + "zendframework/zend-i18n": "Zend\\I18n component to allow translation of validation error messages as well as to use the various Date validators", + "zendframework/zend-math": "Zend\\Math component", + "zendframework/zend-resources": "Translations of validator messages", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", + "zendframework/zend-session": "Zend\\Session component", + "zendframework/zend-uri": "Zend\\Uri component, required by the Uri and Sitemap\\Loc validators" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Validator\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed validators", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "validator", + "zf2" + ], + "time": "2015-04-01 18:09:30" + }, + { + "name": "zendframework/zend-view", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendView.git", + "reference": "e119b4b5f082af58a96eb206e782b62c193227bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendView/zipball/e119b4b5f082af58a96eb206e782b62c193227bf", + "reference": "e119b4b5f082af58a96eb206e782b62c193227bf", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-loader": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-authentication": "self.version", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-feed": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-http": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-mvc": "self.version", + "zendframework/zend-navigation": "self.version", + "zendframework/zend-paginator": "self.version", + "zendframework/zend-permissions-acl": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-authentication": "Zend\\Authentication component", + "zendframework/zend-escaper": "Zend\\Escaper component", + "zendframework/zend-feed": "Zend\\Feed component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json component", + "zendframework/zend-mvc": "Zend\\Mvc component", + "zendframework/zend-navigation": "Zend\\Navigation component", + "zendframework/zend-paginator": "Zend\\Paginator component", + "zendframework/zend-permissions-acl": "Zend\\Permissions\\Acl component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-uri": "Zend\\Uri component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a system of helpers, output filters, and variable escaping", + "homepage": "https://github.com/zendframework/zf2", + "keywords": [ + "view", + "zf2" + ], + "time": "2015-04-01 18:09:30" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", + "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.0.*@ALPHA" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Instantiator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2014-10-13 12:58:55" + }, + { + "name": "fabpot/php-cs-fixer", + "version": "v1.8", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "93c723fe0c50ed54292006e7249a4c1173cf5847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/93c723fe0c50ed54292006e7249a4c1173cf5847", + "reference": "93c723fe0c50ed54292006e7249a4c1173cf5847", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.6", + "sebastian/diff": "~1.1", + "symfony/console": "~2.3", + "symfony/event-dispatcher": "~2.1", + "symfony/filesystem": "~2.1", + "symfony/finder": "~2.1", + "symfony/process": "~2.3", + "symfony/stopwatch": "~2.5" + }, + "require-dev": { + "satooshi/php-coveralls": "0.7.*@dev" + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "Symfony\\CS\\": "Symfony/CS/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dariusz RumiÅ„ski", + "email": "dariusz.ruminski@gmail.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "time": "2015-05-04 17:06:20" + }, + { + "name": "league/climate", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/climate.git", + "reference": "28851c909017424f61cc6a62089316313c645d1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/climate/zipball/28851c909017424f61cc6a62089316313c645d1c", + "reference": "28851c909017424f61cc6a62089316313c645d1c", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "dev-master", + "phpunit/phpunit": "4.1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\CLImate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joe Tannenbaum", + "email": "hey@joe.codes", + "homepage": "http://joe.codes/", + "role": "Developer" + } + ], + "description": "PHP's best friend for the terminal. CLImate allows you to easily output colored text, special formats, and more.", + "keywords": [ + "cli", + "colors", + "command", + "php", + "terminal" + ], + "time": "2015-01-18 14:31:58" + }, + { + "name": "lusitanian/oauth", + "version": "v0.3.5", + "source": { + "type": "git", + "url": "https://github.com/Lusitanian/PHPoAuthLib.git", + "reference": "ac5a1cd5a4519143728dce2213936eea302edf8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/ac5a1cd5a4519143728dce2213936eea302edf8a", + "reference": "ac5a1cd5a4519143728dce2213936eea302edf8a", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*", + "predis/predis": "0.8.*@dev", + "symfony/http-foundation": "~2.1" + }, + "suggest": { + "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client.", + "predis/predis": "Allows using the Redis storage backend.", + "symfony/http-foundation": "Allows using the Symfony Session storage backend." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.1-dev" + } + }, + "autoload": { + "psr-0": { + "OAuth": "src", + "OAuth\\Unit": "tests" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Desberg", + "email": "david@daviddesberg.com" + }, + { + "name": "Pieter Hordijk", + "email": "info@pieterhordijk.com" + } + ], + "description": "PHP 5.3+ oAuth 1/2 Library", + "keywords": [ + "Authentication", + "authorization", + "oauth", + "security" + ], + "time": "2014-09-05 15:19:58" + }, + { + "name": "pdepend/pdepend", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "a15ffcbfbcc4570d4a733ca7b76e9cac0a56c3f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/a15ffcbfbcc4570d4a733ca7b76e9cac0a56c3f4", + "reference": "a15ffcbfbcc4570d4a733ca7b76e9cac0a56c3f4", + "shasum": "" + }, + "require": { + "symfony/config": ">=2.4", + "symfony/dependency-injection": ">=2.4", + "symfony/filesystem": ">=2.4" + }, + "require-dev": { + "phpunit/phpunit": "4.*@stable", + "squizlabs/php_codesniffer": "@stable" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "autoload": { + "psr-0": { + "PDepend\\": "src/main/php/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "time": "2015-03-02 08:06:43" + }, + { + "name": "phpmd/phpmd", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "7dc4a6b5c07b119ab5da7960b56303fa6855eb84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/7dc4a6b5c07b119ab5da7960b56303fa6855eb84", + "reference": "7dc4a6b5c07b119ab5da7960b56303fa6855eb84", + "shasum": "" + }, + "require": { + "pdepend/pdepend": "2.0.*", + "php": ">=5.3.0", + "symfony/config": ">=2.4", + "symfony/dependency-injection": ">=2.4", + "symfony/filesystem": ">=2.4" + }, + "require-dev": { + "phpunit/phpunit": "*", + "squizlabs/php_codesniffer": "*" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "project", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project founder" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "http://phpmd.org/", + "keywords": [ + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "time": "2015-03-26 07:47:05" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.0.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "934fd03eb6840508231a7f73eb8940cf32c3b66c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/934fd03eb6840508231a7f73eb8940cf32c3b66c", + "reference": "934fd03eb6840508231a7f73eb8940cf32c3b66c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "~1.0", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-04-11 04:35:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2013-10-10 15:34:57" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2014-01-30 17:20:04" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "eab81d02569310739373308137284e0158424330" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330", + "reference": "eab81d02569310739373308137284e0158424330", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2015-04-08 04:46:07" + }, + { + "name": "phpunit/phpunit", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "efb1b1334605594417a3bd466477772d06d460a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/efb1b1334605594417a3bd466477772d06d460a8", + "reference": "efb1b1334605594417a3bd466477772d06d460a8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~2.0", + "phpunit/php-file-iterator": "~1.3.1", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "~1.0.2", + "phpunit/phpunit-mock-objects": "~2.1", + "sebastian/comparator": "~1.0", + "sebastian/diff": "~1.1", + "sebastian/environment": "~1.0", + "sebastian/exporter": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2014-05-02 07:13:40" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "74ffb87f527f24616f72460e54b595f508dccb5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/74ffb87f527f24616f72460e54b595f508dccb5c", + "reference": "74ffb87f527f24616f72460e54b595f508dccb5c", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "~1.0,>=1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-04-02 05:36:41" + }, + { + "name": "sebastian/comparator", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-01-29 16:28:08" + }, + { + "name": "sebastian/diff", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-02-22 15:13:53" + }, + { + "name": "sebastian/environment", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2015-01-01 10:01:08" + }, + { + "name": "sebastian/exporter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "84839970d05254c73cde183a721c7af13aede943" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", + "reference": "84839970d05254c73cde183a721c7af13aede943", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-01-27 07:23:06" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-01-24 09:48:32" + }, + { + "name": "sebastian/version", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ab931d46cd0d3204a91e1b9a40c4bc13032b58e4", + "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-02-24 06:35:25" + }, + { + "name": "sjparkinson/static-review", + "version": "4.1.1", + "source": { + "type": "git", + "url": "https://github.com/sjparkinson/static-review.git", + "reference": "493c3410cf146a12fca84209bad126c494e125f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sjparkinson/static-review/zipball/493c3410cf146a12fca84209bad126c494e125f0", + "reference": "493c3410cf146a12fca84209bad126c494e125f0", + "shasum": "" + }, + "require": { + "league/climate": "~2.0", + "php": ">=5.4.0", + "symfony/console": "~2.0", + "symfony/process": "~2.0" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpunit/phpunit": "~4.0", + "sensiolabs/security-checker": "~2.0", + "squizlabs/php_codesniffer": "~1.0" + }, + "suggest": { + "sensiolabs/security-checker": "Required for ComposerSecurityReview.", + "squizlabs/php_codesniffer": "Required for PhpCodeSnifferReview." + }, + "bin": [ + "bin/static-review.php" + ], + "type": "library", + "autoload": { + "psr-4": { + "StaticReview\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Parkinson", + "email": "sam.james.parkinson@gmail.com", + "homepage": "http://samp.im" + } + ], + "description": "An extendable framework for version control hooks.", + "time": "2014-09-22 08:40:36" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "396178ada8499ec492363587f037125bf7b07fcc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/396178ada8499ec492363587f037125bf7b07fcc", + "reference": "396178ada8499ec492363587f037125bf7b07fcc", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.1.2" + }, + "suggest": { + "phpunit/php-timer": "dev-master" + }, + "bin": [ + "scripts/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-phpcs-fixer": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/CommentParser/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2014-05-01 03:07:07" + }, + { + "name": "symfony/config", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Config", + "source": { + "type": "git", + "url": "https://github.com/symfony/Config.git", + "reference": "b6fddb4aa2daaa2b06f0040071ac131b4a1ecf25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Config/zipball/b6fddb4aa2daaa2b06f0040071ac131b4a1ecf25", + "reference": "b6fddb4aa2daaa2b06f0040071ac131b4a1ecf25", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/filesystem": "~2.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/dependency-injection", + "version": "v2.6.7", + "target-dir": "Symfony/Component/DependencyInjection", + "source": { + "type": "git", + "url": "https://github.com/symfony/DependencyInjection.git", + "reference": "b575c160af001d3525ee733085bcc4ec7c8e1b51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/b575c160af001d3525ee733085bcc4ec7c8e1b51", + "reference": "b575c160af001d3525ee733085bcc4ec7c8e1b51", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "conflict": { + "symfony/expression-language": "<2.6" + }, + "require-dev": { + "symfony/config": "~2.2", + "symfony/expression-language": "~2.6", + "symfony/phpunit-bridge": "~2.7", + "symfony/yaml": "~2.1" + }, + "suggest": { + "symfony/config": "", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\DependencyInjection\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.6.7", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "672593bc4b0043a0acf91903bb75a1c82d8f2e02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/672593bc4b0043a0acf91903bb75a1c82d8f2e02", + "reference": "672593bc4b0043a0acf91903bb75a1c82d8f2e02", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0,>=2.0.5", + "symfony/dependency-injection": "~2.6", + "symfony/expression-language": "~2.6", + "symfony/phpunit-bridge": "~2.7", + "symfony/stopwatch": "~2.3" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/filesystem", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Filesystem", + "source": { + "type": "git", + "url": "https://github.com/symfony/Filesystem.git", + "reference": "f73904bd2dae525c42ea1f0340c7c98480ecacde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/f73904bd2dae525c42ea1f0340c7c98480ecacde", + "reference": "f73904bd2dae525c42ea1f0340c7c98480ecacde", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2015-05-08 00:09:07" + }, + { + "name": "symfony/stopwatch", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Stopwatch", + "source": { + "type": "git", + "url": "https://github.com/symfony/Stopwatch.git", + "reference": "b470f87c69837cb71115f1fa720388bb19b63635" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/b470f87c69837cb71115f1fa720388bb19b63635", + "reference": "b470f87c69837cb71115f1fa720388bb19b63635", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Stopwatch\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/yaml", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "f157ab074e453ecd4c0fa775f721f6e67a99d9e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/f157ab074e453ecd4c0fa775f721f6e67a99d9e2", + "reference": "f157ab074e453ecd4c0fa775f721f6e67a99d9e2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + } + ], + "aliases": [], + "minimum-stability": "alpha", + "stability-flags": { + "composer/composer": 15, + "phpmd/phpmd": 0 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "~5.5.0|~5.6.0" + }, + "platform-dev": { + "lib-libxml": "*", + "ext-ctype": "*", + "ext-gd": "*", + "ext-spl": "*", + "ext-dom": "*", + "ext-simplexml": "*", + "ext-mcrypt": "*", + "ext-hash": "*", + "ext-curl": "*", + "ext-iconv": "*", + "ext-intl": "*" + } +} diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/vendor/README b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/vendor/README new file mode 100644 index 0000000000000000000000000000000000000000..4ff7f39bd61163e93b753517020434e907c3d8bd --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/vendor/README @@ -0,0 +1,5 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + This file is to create a vendor directory for testing \ No newline at end of file diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.json b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.json new file mode 100644 index 0000000000000000000000000000000000000000..e7403b54be9c387bbdac395b49136ac004ff2c89 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.json @@ -0,0 +1,60 @@ +{ + "name": "magento/project-community-edition", + "description": "eCommerce Platform for Growth (Community Edition)", + "type": "project", + "version": "0.74.0-beta9", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "require": { + "magento/product-community-edition": "0.74.0-beta9" + }, + "require-dev": { + "phpunit/phpunit": "4.1.0", + "squizlabs/php_codesniffer": "1.5.3", + "phpmd/phpmd": "@stable", + "pdepend/pdepend": "2.0.6", + "lib-libxml": "*", + "ext-ctype": "*", + "ext-gd": "*", + "ext-spl": "*", + "ext-dom": "*", + "ext-simplexml": "*", + "ext-mcrypt": "*", + "ext-hash": "*", + "ext-curl": "*", + "ext-iconv": "*", + "ext-intl": "*", + "sjparkinson/static-review": "~4.1", + "fabpot/php-cs-fixer": "~1.2", + "lusitanian/oauth": "~0.3" + }, + "config": { + "use-include-path": true + }, + "autoload": { + "psr-4": { + "Magento\\Framework\\": "lib/internal/Magento/Framework/", + "Magento\\Setup\\": "setup/src/Magento/Setup/" + } + }, + "autoload-dev": { + "psr-4": { + "Magento\\Sniffs\\": "dev/tests/static/framework/Magento/Sniffs/", + "Magento\\Tools\\": "dev/tools/Magento/Tools/", + "Magento\\Tools\\Sanity\\": "dev/build/publication/sanity/Magento/Tools/Sanity/", + "Magento\\TestFramework\\Inspection\\": "dev/tests/static/framework/Magento/TestFramework/Inspection/", + "Magento\\TestFramework\\Utility\\": "dev/tests/static/framework/Magento/TestFramework/Utility/", + "Magento\\ToolkitFramework\\": "dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/" + } + }, + "minimum-stability": "alpha", + "prefer-stable": true, + "repositories": [ + { + "type": "composer", + "url": "http://packages.magento.com/" + } + ] +} diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.lock b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.lock new file mode 100644 index 0000000000000000000000000000000000000000..a68a55fa746bddf5b0eca13a7a5a018b5ad8f5e4 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.lock @@ -0,0 +1,7812 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "8500e076fe26c04cf68124e561f62f52", + "packages": [ + { + "name": "composer/composer", + "version": "1.0.0-alpha9", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "eb1ce550ca51134ee619ad3e37f5a0b7e980dd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/eb1ce550ca51134ee619ad3e37f5a0b7e980dd24", + "reference": "eb1ce550ca51134ee619ad3e37f5a0b7e980dd24", + "shasum": "" + }, + "require": { + "justinrainbow/json-schema": "~1.1", + "php": ">=5.3.2", + "seld/jsonlint": "~1.0", + "symfony/console": "~2.3", + "symfony/finder": "~2.2", + "symfony/process": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives, and allows gzip compression of all internet traffic" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Composer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.", + "homepage": "http://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "time": "2014-12-07 17:15:20" + }, + { + "name": "justinrainbow/json-schema", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2465fe486c864e30badaa4d005ebdf89dbc503f3", + "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "json-schema/json-schema-test-suite": "1.1.0", + "phpdocumentor/phpdocumentor": "~2", + "phpunit/phpunit": "~3.7" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "JsonSchema": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2015-03-27 16:41:39" + }, + { + "name": "magento/framework", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_framework-0.74.0-beta9.zip", + "reference": null, + "shasum": "bd9d7a552b4f71dc2b3c74f9bd2d81f15a9037c4" + }, + "require": { + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-hash": "*", + "ext-iconv": "*", + "ext-mcrypt": "*", + "ext-simplexml": "*", + "ext-spl": "*", + "lib-libxml": "*", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "ext-imagick": "Use Image Magick >=3.0.0 as an optional alternative image processing library" + }, + "type": "magento2-library", + "extra": { + "map": [ + [ + "*", + "Magento/Framework" + ] + ] + }, + "autoload": { + "psr-4": { + "Magento\\Framework\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/language-de_de", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-de_de-0.74.0-beta9.zip", + "reference": null, + "shasum": "6b1072242183699164f1717d996bb165769c1b6b" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/de_de" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "German (Germany) language" + }, + { + "name": "magento/language-en_us", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-en_us-0.74.0-beta9.zip", + "reference": null, + "shasum": "70adc34f8d995776366273ff94a0524861b463a2" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/en_us" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "English (United States) language" + }, + { + "name": "magento/language-es_es", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-es_es-0.74.0-beta9.zip", + "reference": null, + "shasum": "ff62ceb7ce109c31c67fb1fdf154a2415bcc8045" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/es_es" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Spanish (Spain) language" + }, + { + "name": "magento/language-fr_fr", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-fr_fr-0.74.0-beta9.zip", + "reference": null, + "shasum": "69f30ec0de09458d7e99d9c4ea42548f31411ee2" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/fr_fr" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "French (France) language" + }, + { + "name": "magento/language-nl_nl", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-nl_nl-0.74.0-beta9.zip", + "reference": null, + "shasum": "e11c7880d71955b794bccefcf2a26e6f381657a7" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/nl_nl" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Dutch (Netherlands) language" + }, + { + "name": "magento/language-pt_br", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-pt_br-0.74.0-beta9.zip", + "reference": null, + "shasum": "0b74dfba9407e5d69aca5f6723529e2c1daab7cf" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/pt_br" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Portuguese (Brazil) language" + }, + { + "name": "magento/language-zh_cn", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-zh_cn-0.74.0-beta9.zip", + "reference": null, + "shasum": "360355c1ee1d29b958630427d086ba33607f3ef3" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/zh_cn" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Chinese (China) language" + }, + { + "name": "magento/magento-composer-installer", + "version": "0.1.4", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-composer-installer.git", + "reference": "7f03451f71e55d52c2bb07325d56a4e6df322f30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-composer-installer/zipball/7f03451f71e55d52c2bb07325d56a4e6df322f30", + "reference": "7f03451f71e55d52c2bb07325d56a4e6df322f30", + "shasum": "" + }, + "require": { + "composer-plugin-api": "1.0.0" + }, + "require-dev": { + "composer/composer": "*@dev", + "firegento/phpcs": "dev-patch-1", + "mikey179/vfsstream": "*", + "phpunit/phpunit": "*", + "phpunit/phpunit-mock-objects": "dev-master", + "squizlabs/php_codesniffer": "1.4.7", + "symfony/process": "*" + }, + "type": "composer-plugin", + "extra": { + "composer-command-registry": [ + "MagentoHackathon\\Composer\\Magento\\Command\\DeployCommand" + ], + "class": "MagentoHackathon\\Composer\\Magento\\Plugin" + }, + "autoload": { + "psr-0": { + "MagentoHackathon\\Composer\\Magento": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Vinai Kopp", + "email": "vinai@netzarbeiter.com" + }, + { + "name": "Daniel Fahlke aka Flyingmana", + "email": "flyingmana@googlemail.com" + }, + { + "name": "Jörg Weller", + "email": "weller@flagbit.de" + }, + { + "name": "Karl Spies", + "email": "karl.spies@gmx.net" + }, + { + "name": "Tobias Vogt", + "email": "tobi@webguys.de" + }, + { + "name": "David Fuhr", + "email": "fuhr@flagbit.de" + } + ], + "description": "Composer installer for Magento modules", + "homepage": "https://github.com/magento/magento-composer-installer", + "keywords": [ + "composer-installer", + "magento" + ], + "time": "2015-03-05 21:40:30" + }, + { + "name": "magento/magento2-base", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_magento2-base-0.74.0-beta9.zip", + "reference": null, + "shasum": "268b541398bbca13688ade93d66d390b2f30da7a" + }, + "require": { + "magento/magento-composer-installer": "*" + }, + "replace": { + "blueimp/jquery-file-upload": "5.6.14", + "colinmollenhour/cache-backend-redis": "dev-master#193d377b7fb2e88595578b282fa01a62d1185abc", + "colinmollenhour/credis": "dev-master#f07bbfd4117294f462f0fb19c49221d350bf396f", + "components/jquery": "1.11.0", + "components/jqueryui": "1.10.4", + "linkorb/jsmin-php": "1.1.2", + "phpseclib/phpseclib": "0.2.1", + "tinymce/tinymce": "3.4.7", + "trentrichardson/jquery-timepicker-addon": "1.4.3", + "twbs/bootstrap": "3.1.0" + }, + "type": "magento2-component", + "extra": { + "component_paths": { + "trentrichardson/jquery-timepicker-addon": "lib/web/jquery/jquery-ui-timepicker-addon.js", + "colinmollenhour/cache-backend-redis": "lib/internal/Cm/Cache/Backend/Redis.php", + "colinmollenhour/credis": "lib/internal/Credis", + "linkorb/jsmin-php": "lib/internal/JSMin", + "phpseclib/phpseclib": "lib/internal/phpseclib", + "components/jquery": [ + "lib/web/jquery.js", + "lib/web/jquery/jquery.min.js", + "lib/web/jquery/jquery-migrate.js", + "lib/web/jquery/jquery-migrate.min.js" + ], + "blueimp/jquery-file-upload": "lib/web/jquery/fileUploader", + "components/jqueryui": [ + "lib/web/jquery/jquery-ui.js", + "lib/web/jquery/jquery-ui.min.js" + ], + "twbs/bootstrap": "lib/web/jquery/jquery.tabs.js", + "tinymce/tinymce": "lib/web/tiny_mce" + }, + "map": [ + [ + "lib/internal/Cm", + "lib/internal/Cm" + ], + [ + "lib/internal/LinLibertineFont", + "lib/internal/LinLibertineFont" + ], + [ + "lib/internal/phpseclib", + "lib/internal/phpseclib" + ], + [ + "lib/internal/Credis", + "lib/internal/Credis" + ], + [ + "lib/internal/CardinalCommerce", + "lib/internal/CardinalCommerce" + ], + [ + "lib/internal/JSMin", + "lib/internal/JSMin" + ], + [ + "lib/.htaccess", + "lib/.htaccess" + ], + [ + "lib/web/lib", + "lib/web/lib" + ], + [ + "lib/web/requirejs", + "lib/web/requirejs" + ], + [ + "lib/web/prototype", + "lib/web/prototype" + ], + [ + "lib/web/moment.js", + "lib/web/moment.js" + ], + [ + "lib/web/i18n", + "lib/web/i18n" + ], + [ + "lib/web/varien", + "lib/web/varien" + ], + [ + "lib/web/blank.html", + "lib/web/blank.html" + ], + [ + "lib/web/scriptaculous", + "lib/web/scriptaculous" + ], + [ + "lib/web/ko", + "lib/web/ko" + ], + [ + "lib/web/modernizr", + "lib/web/modernizr" + ], + [ + "lib/web/spacer.gif", + "lib/web/spacer.gif" + ], + [ + "lib/web/images", + "lib/web/images" + ], + [ + "lib/web/matchMedia.js", + "lib/web/matchMedia.js" + ], + [ + "lib/web/extjs", + "lib/web/extjs" + ], + [ + "lib/web/css", + "lib/web/css" + ], + [ + "lib/web/fonts", + "lib/web/fonts" + ], + [ + "lib/web/jquery", + "lib/web/jquery" + ], + [ + "lib/web/less", + "lib/web/less" + ], + [ + "lib/web/jquery.js", + "lib/web/jquery.js" + ], + [ + "lib/web/underscore.js", + "lib/web/underscore.js" + ], + [ + "lib/web/legacy-build.min.js", + "lib/web/legacy-build.min.js" + ], + [ + "lib/web/mage", + "lib/web/mage" + ], + [ + "lib/web/tiny_mce", + "lib/web/tiny_mce" + ], + [ + ".htaccess.sample", + ".htaccess.sample" + ], + [ + "CONTRIBUTING.md", + "CONTRIBUTING.md" + ], + [ + "package.json", + "package.json" + ], + [ + "bin", + "bin" + ], + [ + "nginx.conf.sample", + "nginx.conf.sample" + ], + [ + "var/.htaccess", + "var/.htaccess" + ], + [ + "pub/media/downloadable/.htaccess", + "pub/media/downloadable/.htaccess" + ], + [ + "pub/media/theme_customization/.htaccess", + "pub/media/theme_customization/.htaccess" + ], + [ + "pub/media/customer/.htaccess", + "pub/media/customer/.htaccess" + ], + [ + "pub/media/.htaccess", + "pub/media/.htaccess" + ], + [ + "pub/errors", + "pub/errors" + ], + [ + "pub/opt", + "pub/opt" + ], + [ + "pub/get.php", + "pub/get.php" + ], + [ + "pub/static/.htaccess", + "pub/static/.htaccess" + ], + [ + "pub/.htaccess", + "pub/.htaccess" + ], + [ + "pub/static.php", + "pub/static.php" + ], + [ + "pub/cron.php", + "pub/cron.php" + ], + [ + "pub/index.php", + "pub/index.php" + ], + [ + ".php_cs", + ".php_cs" + ], + [ + "COPYING.txt", + "COPYING.txt" + ], + [ + "dev/shell", + "dev/shell" + ], + [ + "dev/tools", + "dev/tools" + ], + [ + "dev/tests/integration/phpunit.xml.dist", + "dev/tests/integration/phpunit.xml.dist" + ], + [ + "dev/tests/integration/etc", + "dev/tests/integration/etc" + ], + [ + "dev/tests/integration/tmp", + "dev/tests/integration/tmp" + ], + [ + "dev/tests/integration/framework", + "dev/tests/integration/framework" + ], + [ + "dev/tests/integration/testsuite/Magento", + "dev/tests/integration/testsuite/Magento" + ], + [ + "dev/tests/integration/.gitignore", + "dev/tests/integration/.gitignore" + ], + [ + "dev/tests/functional/composer.json", + "dev/tests/functional/composer.json" + ], + [ + "dev/tests/functional/lib", + "dev/tests/functional/lib" + ], + [ + "dev/tests/functional/phpunit.xml.dist", + "dev/tests/functional/phpunit.xml.dist" + ], + [ + "dev/tests/functional/composer.json.dist", + "dev/tests/functional/composer.json.dist" + ], + [ + "dev/tests/functional/bootstrap.php", + "dev/tests/functional/bootstrap.php" + ], + [ + "dev/tests/functional/credentials.xml.dist", + "dev/tests/functional/credentials.xml.dist" + ], + [ + "dev/tests/functional/tests", + "dev/tests/functional/tests" + ], + [ + "dev/tests/functional/utils", + "dev/tests/functional/utils" + ], + [ + "dev/tests/functional/isolation.php", + "dev/tests/functional/isolation.php" + ], + [ + "dev/tests/functional/etc", + "dev/tests/functional/etc" + ], + [ + "dev/tests/functional/.htaccess", + "dev/tests/functional/.htaccess" + ], + [ + "dev/tests/functional/testsuites/Magento", + "dev/tests/functional/testsuites/Magento" + ], + [ + "dev/tests/functional/.gitignore", + "dev/tests/functional/.gitignore" + ], + [ + "dev/tests/js/JsTestDriver/run_js_tests.php", + "dev/tests/js/JsTestDriver/run_js_tests.php" + ], + [ + "dev/tests/js/JsTestDriver/jsTestDriverOrder.php", + "dev/tests/js/JsTestDriver/jsTestDriverOrder.php" + ], + [ + "dev/tests/js/JsTestDriver/jsTestDriver.php.dist", + "dev/tests/js/JsTestDriver/jsTestDriver.php.dist" + ], + [ + "dev/tests/js/JsTestDriver/framework", + "dev/tests/js/JsTestDriver/framework" + ], + [ + "dev/tests/js/JsTestDriver/testsuite/lib", + "dev/tests/js/JsTestDriver/testsuite/lib" + ], + [ + "dev/tests/js/JsTestDriver/testsuite/mage", + "dev/tests/js/JsTestDriver/testsuite/mage" + ], + [ + "dev/tests/js/JsTestDriver/.gitignore", + "dev/tests/js/JsTestDriver/.gitignore" + ], + [ + "dev/tests/js/jasmine", + "dev/tests/js/jasmine" + ], + [ + "dev/tests/api-functional/phpunit.xml.dist", + "dev/tests/api-functional/phpunit.xml.dist" + ], + [ + "dev/tests/api-functional/config", + "dev/tests/api-functional/config" + ], + [ + "dev/tests/api-functional/framework", + "dev/tests/api-functional/framework" + ], + [ + "dev/tests/api-functional/_files", + "dev/tests/api-functional/_files" + ], + [ + "dev/tests/api-functional/testsuite/Magento", + "dev/tests/api-functional/testsuite/Magento" + ], + [ + "dev/tests/api-functional/.gitignore", + "dev/tests/api-functional/.gitignore" + ], + [ + "dev/tests/unit/phpunit.xml.dist", + "dev/tests/unit/phpunit.xml.dist" + ], + [ + "dev/tests/unit/tmp", + "dev/tests/unit/tmp" + ], + [ + "dev/tests/unit/framework", + "dev/tests/unit/framework" + ], + [ + "dev/tests/unit/.gitignore", + "dev/tests/unit/.gitignore" + ], + [ + "dev/tests/static/phpunit-all.xml.dist", + "dev/tests/static/phpunit-all.xml.dist" + ], + [ + "dev/tests/static/phpunit.xml.dist", + "dev/tests/static/phpunit.xml.dist" + ], + [ + "dev/tests/static/framework", + "dev/tests/static/framework" + ], + [ + "dev/tests/static/testsuite/Magento", + "dev/tests/static/testsuite/Magento" + ], + [ + "dev/tests/static/.gitignore", + "dev/tests/static/.gitignore" + ], + [ + "dev/tests/performance/benchmark.jmx", + "dev/tests/performance/benchmark.jmx" + ], + [ + "dev/tests/performance/compare_reports.php", + "dev/tests/performance/compare_reports.php" + ], + [ + "dev/tests/performance/run_scenarios.php", + "dev/tests/performance/run_scenarios.php" + ], + [ + "dev/tests/performance/framework", + "dev/tests/performance/framework" + ], + [ + "dev/tests/performance/testsuite/backend.jmx", + "dev/tests/performance/testsuite/backend.jmx" + ], + [ + "dev/tests/performance/testsuite/product_edit.jmx", + "dev/tests/performance/testsuite/product_edit.jmx" + ], + [ + "dev/tests/performance/testsuite/add_to_cart.jmx", + "dev/tests/performance/testsuite/add_to_cart.jmx" + ], + [ + "dev/tests/performance/testsuite/product_view.jmx", + "dev/tests/performance/testsuite/product_view.jmx" + ], + [ + "dev/tests/performance/testsuite/home_page.jmx", + "dev/tests/performance/testsuite/home_page.jmx" + ], + [ + "dev/tests/performance/testsuite/reusable", + "dev/tests/performance/testsuite/reusable" + ], + [ + "dev/tests/performance/testsuite/quick_search.jmx", + "dev/tests/performance/testsuite/quick_search.jmx" + ], + [ + "dev/tests/performance/testsuite/fixtures", + "dev/tests/performance/testsuite/fixtures" + ], + [ + "dev/tests/performance/testsuite/advanced_search.jmx", + "dev/tests/performance/testsuite/advanced_search.jmx" + ], + [ + "dev/tests/performance/testsuite/checkout.jmx", + "dev/tests/performance/testsuite/checkout.jmx" + ], + [ + "dev/tests/performance/testsuite/category_view.jmx", + "dev/tests/performance/testsuite/category_view.jmx" + ], + [ + "dev/tests/performance/testsuite/_samples", + "dev/tests/performance/testsuite/_samples" + ], + [ + "dev/tests/performance/config.php.dist", + "dev/tests/performance/config.php.dist" + ], + [ + "dev/tests/performance/.gitignore", + "dev/tests/performance/.gitignore" + ], + [ + "dev/.htaccess", + "dev/.htaccess" + ], + [ + "Gruntfile.js", + "Gruntfile.js" + ], + [ + "setup", + "setup" + ], + [ + "LICENSE.txt", + "LICENSE.txt" + ], + [ + ".travis.yml", + ".travis.yml" + ], + [ + "app/bootstrap.php", + "app/bootstrap.php" + ], + [ + "app/design/frontend", + "app/design/frontend" + ], + [ + "app/design/adminhtml", + "app/design/adminhtml" + ], + [ + "app/etc/di.xml", + "app/etc/di.xml" + ], + [ + "app/.htaccess", + "app/.htaccess" + ], + [ + "app/functions.php", + "app/functions.php" + ], + [ + "app/autoload.php", + "app/autoload.php" + ], + [ + ".htaccess", + ".htaccess" + ], + [ + "php.ini.sample", + "php.ini.sample" + ], + [ + "CONTRIBUTOR_LICENSE_AGREEMENT.html", + "CONTRIBUTOR_LICENSE_AGREEMENT.html" + ], + [ + "index.php", + "index.php" + ], + [ + "LICENSE_AFL.txt", + "LICENSE_AFL.txt" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento 2 Base (Community Edition)" + }, + { + "name": "magento/module-admin-notification", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-admin-notification-0.74.0-beta9.zip", + "reference": null, + "shasum": "9d9f819a651566a2ae6f12225d69941dbe5d0920" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/AdminNotification" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-authorization", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-authorization-0.74.0-beta9.zip", + "reference": null, + "shasum": "28fb39cd7d95979865ee34293004c2dbd7fb0c74" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Authorization" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Authorization module provides access to Magento ACL functionality." + }, + { + "name": "magento/module-backend", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-backend-0.74.0-beta9.zip", + "reference": null, + "shasum": "47a8139710f3c269b06d444c29fd275b2a3c9c9b" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backup": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-cron": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-developer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-reports": "0.74.0-beta9", + "magento/module-require-js": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-translation": "0.74.0-beta9", + "magento/module-user": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Backend" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-backup", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-backup-0.74.0-beta9.zip", + "reference": null, + "shasum": "defb31a8d7de0856753a04e15f5bf34684d25d90" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-cron": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Backup" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-bundle", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-bundle-0.74.0-beta9.zip", + "reference": null, + "shasum": "a63880815cf2c96fc4e6e45cd982bf724682fe8b" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-catalog-rule": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-gift-message": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-webapi": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Bundle" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cache-invalidate", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cache-invalidate-0.74.0-beta9.zip", + "reference": null, + "shasum": "e0316dae00343426e331cb39520acf0f6c0c3db3" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-page-cache": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CacheInvalidate" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-captcha", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-captcha-0.74.0-beta9.zip", + "reference": null, + "shasum": "cfc73a9579a990f215e10ec6b475255bef919920" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Captcha" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-0.74.0-beta9.zip", + "reference": null, + "shasum": "705f5317c0495c0a94ce0d6ad9c2400c7eee9494" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-catalog-rule": "0.74.0-beta9", + "magento/module-catalog-url-rewrite": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-indexer": "0.74.0-beta9", + "magento/module-log": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-msrp": "0.74.0-beta9", + "magento/module-page-cache": "0.74.0-beta9", + "magento/module-product-alert": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-url-rewrite": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "magento/module-wishlist": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-cookie": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Catalog" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-import-export", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-import-export-0.74.0-beta9.zip", + "reference": null, + "shasum": "81dfb1108a4717ba212b46af6502a17ba8a1f85d" + }, + "require": { + "ext-ctype": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-import-export": "0.74.0-beta9", + "magento/module-indexer": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-inventory", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-inventory-0.74.0-beta9.zip", + "reference": null, + "shasum": "1b2039959817f22889fa461cd48c58dec10c5b0d" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-indexer": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogInventory" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-rule", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-rule-0.74.0-beta9.zip", + "reference": null, + "shasum": "43e105ef491933e96ee5f6c9543edb72076b9b8f" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-import-export": "0.74.0-beta9", + "magento/module-indexer": "0.74.0-beta9", + "magento/module-rule": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogRule" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-search", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-search-0.74.0-beta9.zip", + "reference": null, + "shasum": "3eb4841fe35753202d6985f65387da848ded3d9e" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-indexer": "0.74.0-beta9", + "magento/module-search": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogSearch" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-url-rewrite", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-url-rewrite-0.74.0-beta9.zip", + "reference": null, + "shasum": "d6ff96ba9c854368c0cdc2aa4ebb66bbb5201349" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-import-export": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-import-export": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-url-rewrite": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogUrlRewrite" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-widget", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-widget-0.74.0-beta9.zip", + "reference": null, + "shasum": "7aa5387069cdcae7a6c4dab63a5e3a8e12921f2c" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-rule": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "magento/module-wishlist": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogWidget" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-centinel", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-centinel-0.74.0-beta9.zip", + "reference": null, + "shasum": "4bda8da48084d11cd97f59292b35501ad1dae554" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Centinel" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-checkout", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-checkout-0.74.0-beta9.zip", + "reference": null, + "shasum": "c8ab1ccad853365098f1ea9efd3b2640f6ce1ab1" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-gift-message": "0.74.0-beta9", + "magento/module-msrp": "0.74.0-beta9", + "magento/module-page-cache": "0.74.0-beta9", + "magento/module-payment": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-ui": "0.74.0-beta9", + "magento/module-wishlist": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-cookie": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Checkout" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-checkout-agreements", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-checkout-agreements-0.74.0-beta9.zip", + "reference": null, + "shasum": "9adef902e061afdd2bc88b9257bbb7def693f46d" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CheckoutAgreements" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cms", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cms-0.74.0-beta9.zip", + "reference": null, + "shasum": "31142e011e4269d240ea9389888484ab69b1eab1" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-email": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-ui": "0.74.0-beta9", + "magento/module-variable": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Cms" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cms-url-rewrite", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cms-url-rewrite-0.74.0-beta9.zip", + "reference": null, + "shasum": "fe26190823ea1e1bd828ff5fc087506b38c45c5f" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-cms": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-url-rewrite": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CmsUrlRewrite" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-config", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-config-0.74.0-beta9.zip", + "reference": null, + "shasum": "ae36b5498a9f299bacb1cc306a066db4386ad3c8" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-cron": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-email": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Config" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-configurable-import-export", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-configurable-import-export-0.74.0-beta9.zip", + "reference": null, + "shasum": "99d781b8ec0fb5c8655a0bacb75b6ff5151d7687" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-import-export": "0.74.0-beta9", + "magento/module-configurable-product": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-import-export": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/ConfigurableImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-configurable-product", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-configurable-product-0.74.0-beta9.zip", + "reference": null, + "shasum": "cd60da462c29cecacee7c7cf742ca9e3a962fc81" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-catalog-rule": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-webapi": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/ConfigurableProduct" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-contact", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-contact-0.74.0-beta9.zip", + "reference": null, + "shasum": "c3a57727ab245a396b597e41c78d9ff81c06fe88" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-cms": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Contact" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cookie", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cookie-0.74.0-beta9.zip", + "reference": null, + "shasum": "281a79e0f61889c3d17111451be1860abb216939" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-store": "0.74.0-beta9", + "php": "~5.4.11|~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-backend": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Cookie" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cron", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cron-0.74.0-beta9.zip", + "reference": null, + "shasum": "e20e45f6282f8a595637f404faccc444023f02e7" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-config": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Cron" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-currency-symbol", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-currency-symbol-0.74.0-beta9.zip", + "reference": null, + "shasum": "3e105d2bae0106c0675e72c3fccf6a6f0463a346" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-page-cache": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CurrencySymbol" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-customer-0.74.0-beta9.zip", + "reference": null, + "shasum": "7d303f83ba1340fd2a979d87d7184f6d6c831f9f" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta9", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-integration": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-newsletter": "0.74.0-beta9", + "magento/module-page-cache": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-review": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-ui": "0.74.0-beta9", + "magento/module-wishlist": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-cookie": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Customer" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer-import-export", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-customer-import-export-0.74.0-beta9.zip", + "reference": null, + "shasum": "865cf1afa2dcd6daecde627492421421d1b4b4ea" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-import-export": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CustomerImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-design-editor", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-design-editor-0.74.0-beta9.zip", + "reference": null, + "shasum": "92a198c9e7fdb3d1224484c46059e2335032bd69" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-translation": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/DesignEditor" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-developer", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-developer-0.74.0-beta9.zip", + "reference": null, + "shasum": "6706b2f7949678e99496ebea9fd12d9262b62004" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Developer" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-dhl", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-dhl-0.74.0-beta9.zip", + "reference": null, + "shasum": "34a111604699481f2eb3904bf4a1100c743f0e20" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Dhl" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-directory", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-directory-0.74.0-beta9.zip", + "reference": null, + "shasum": "426f27e9626d056dad46e805eae800eadf5e44fe" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Directory" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-downloadable", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-downloadable-0.74.0-beta9.zip", + "reference": null, + "shasum": "548720f2619acfd6d05c2e2d4ef6d4e0add8bc32" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-gift-message": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-msrp": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-wishlist": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Downloadable" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-eav", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-eav-0.74.0-beta9.zip", + "reference": null, + "shasum": "6c3a9b09465bab43077912e1b592aad51f5535ea" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Eav" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-email", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-email-0.74.0-beta9.zip", + "reference": null, + "shasum": "fdcbc0aa8f3bb96f267b77f560f0888c1dd07b4b" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-variable": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Email" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-fedex", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-fedex-0.74.0-beta9.zip", + "reference": null, + "shasum": "ddb21f39509d35d91d654ed4cee2d0bd6d96b8ff" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Fedex" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-gift-message", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-gift-message-0.74.0-beta9.zip", + "reference": null, + "shasum": "baa084f6f8c5098573a39441b1e7ff478aaf645d" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-multishipping": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GiftMessage" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-adwords", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-google-adwords-0.74.0-beta9.zip", + "reference": null, + "shasum": "2e07b618a3a20384a128f6c769f0dd767d11da84" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GoogleAdwords" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-analytics", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-google-analytics-0.74.0-beta9.zip", + "reference": null, + "shasum": "006250c389821f90c61bca62b29aa477f66071b5" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-cookie": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GoogleAnalytics" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-optimizer", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-google-optimizer-0.74.0-beta9.zip", + "reference": null, + "shasum": "35f7d31d069c1bfb8a9fc6e30757546f4188e05c" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-google-analytics": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GoogleOptimizer" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-shopping", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-google-shopping-0.74.0-beta9.zip", + "reference": null, + "shasum": "b0867fd647a13818a701974a0224fd3c7f306d1a" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GoogleShopping" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-grouped-import-export", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-grouped-import-export-0.74.0-beta9.zip", + "reference": null, + "shasum": "b740cdb730ba164f15c8beca9e42076cd73506f6" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-import-export": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-grouped-product": "0.74.0-beta9", + "magento/module-import-export": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GroupedImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-grouped-product", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-grouped-product-0.74.0-beta9.zip", + "reference": null, + "shasum": "3b81ed8cbbe0118632fb0a73d96defaf17001627" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-msrp": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GroupedProduct" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-import-export", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-import-export-0.74.0-beta9.zip", + "reference": null, + "shasum": "bdda8672b34b093b89ec54210b4e025b942f66b0" + }, + "require": { + "ext-ctype": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-indexer": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/ImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-indexer", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-indexer-0.74.0-beta9.zip", + "reference": null, + "shasum": "f87dcac18e19a70d34be3c8e486397fa37368fe6" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-page-cache": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Indexer" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-integration", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-integration-0.74.0-beta9.zip", + "reference": null, + "shasum": "4a4f8808a49733e7434198fd072a0f7dbb3dcff2" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta9", + "magento/module-backend": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-user": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Integration" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-layered-navigation", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-layered-navigation-0.74.0-beta9.zip", + "reference": null, + "shasum": "a305729e3b91e7d37169eeb3e1dc8b1532982e7e" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/LayeredNavigation" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-log", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-log-0.74.0-beta9.zip", + "reference": null, + "shasum": "ce8f197c54c4865aad81d9d49fa20680f73f1c0e" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Log" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-media-storage", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-media-storage-0.74.0-beta9.zip", + "reference": null, + "shasum": "385de9b553cd7e712e4fbc9d5b8a9aab22b19734" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/MediaStorage" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-msrp", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-msrp-0.74.0-beta9.zip", + "reference": null, + "shasum": "a938500cd0391fb081840683bc1d25c8d24bde3f" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-bundle": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-downloadable": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-grouped-product": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Msrp" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-multishipping", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-multishipping-0.74.0-beta9.zip", + "reference": null, + "shasum": "ed5f5195814708f0a40a063ede492ce28b7a85b6" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-payment": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Multishipping" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-newsletter", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-newsletter-0.74.0-beta9.zip", + "reference": null, + "shasum": "1d65d77fdcefdfb81fb7831ddf925340fb8e18da" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-cron": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-email": "0.74.0-beta9", + "magento/module-require-js": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Newsletter" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-offline-payments", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-offline-payments-0.74.0-beta9.zip", + "reference": null, + "shasum": "820a2b58d81446545b30016a3601839d01d0d319" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-payment": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/OfflinePayments" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-offline-shipping", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-offline-shipping-0.74.0-beta9.zip", + "reference": null, + "shasum": "e72fb8afe1ca9edc7c5fc82a68873ff2961565cc" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-sales-rule": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/OfflineShipping" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-page-cache", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-page-cache-0.74.0-beta9.zip", + "reference": null, + "shasum": "756fb21471c1b0259baf4e594032e7aea5b222f2" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/PageCache" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-payment", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-payment-0.74.0-beta9.zip", + "reference": null, + "shasum": "4514f7446e6e9a19e82eddd8212e31d04377aa77" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-centinel": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Payment" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-persistent", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-persistent-0.74.0-beta9.zip", + "reference": null, + "shasum": "afb7d470522a94295bc40744f6e99ae0ec682011" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-cron": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-page-cache": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Persistent" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-product-alert", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-product-alert-0.74.0-beta9.zip", + "reference": null, + "shasum": "d3235530b5f3efd21e517052bdcf7fea0ced7475" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/ProductAlert" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-quote", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-quote-0.74.0-beta9.zip", + "reference": null, + "shasum": "5c6a5e737a7c2fae72aa5381303030601eb3fac2" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta9", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-catalog-rule": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-payment": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-sales-sequence": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Quote" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-reports", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-reports-0.74.0-beta9.zip", + "reference": null, + "shasum": "6dd2cca08c4b7c0560167f2ee3fe846004a241bd" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-downloadable": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-log": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-review": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-sales-rule": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "magento/module-wishlist": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Reports" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-require-js", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-require-js-0.74.0-beta9.zip", + "reference": null, + "shasum": "842a7c38569cd97b61412c1d60d979710a6a7f9e" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/RequireJs" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-review", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-review-0.74.0-beta9.zip", + "reference": null, + "shasum": "507b801b44f75bc421976918b068da84367eb9f7" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-newsletter": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-ui": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-cookie": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Review" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-rss", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-rss-0.74.0-beta9.zip", + "reference": null, + "shasum": "dcbfaecc7026ed1ef047b6b8274db47009f7306f" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Rss" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-rule", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-rule-0.74.0-beta9.zip", + "reference": null, + "shasum": "20aa3361bafb3587d9168521d7a6283122dc4ead" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Rule" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sales-0.74.0-beta9.zip", + "reference": null, + "shasum": "007ca46fc540820c8f17786cabaa544f0fe7f984" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta9", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-email": "0.74.0-beta9", + "magento/module-gift-message": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-payment": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-reports": "0.74.0-beta9", + "magento/module-sales-rule": "0.74.0-beta9", + "magento/module-sales-sequence": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-ui": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "magento/module-wishlist": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Sales" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-rule", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sales-rule-0.74.0-beta9.zip", + "reference": null, + "shasum": "25a2d8e1c2e722e102745e88928de0bd1dd80274" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-rule": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-payment": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-reports": "0.74.0-beta9", + "magento/module-rule": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/SalesRule" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-sequence", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sales-sequence-0.74.0-beta9.zip", + "reference": null, + "shasum": "a242a2b697fc95c36a125bb4e51ec0a2b206b359" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/SalesSequence" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-search", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-search-0.74.0-beta9.zip", + "reference": null, + "shasum": "0005f68bc5abaa007361df0236b5fba80517af4d" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog-search": "0.74.0-beta9", + "magento/module-reports": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Search" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sendfriend", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sendfriend-0.74.0-beta9.zip", + "reference": null, + "shasum": "adb2246c88b666e9340f1a725bea2fb0aa037ca0" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Sendfriend" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-shipping", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-shipping-0.74.0-beta9.zip", + "reference": null, + "shasum": "76013d8582463caeb15ce63a96139048a07ba90b" + }, + "require": { + "ext-gd": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-contact": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-payment": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-fedex": "0.74.0-beta9", + "magento/module-ups": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Shipping" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sitemap", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sitemap-0.74.0-beta9.zip", + "reference": null, + "shasum": "2169a32cae4f3de305ec17c4d8246175b7ddde9e" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-url-rewrite": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Sitemap" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-store", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-store-0.74.0-beta9.zip", + "reference": null, + "shasum": "85ff2ce1c9c32ecb4696e96616b3523e2b78979d" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-config": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-ui": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Store" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-tax", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-tax-0.74.0-beta9.zip", + "reference": null, + "shasum": "8be068d30674efe3bc2bfe1dba983d8b5d5e680d" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-reports": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Tax" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-tax-import-export", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-tax-import-export-0.74.0-beta9.zip", + "reference": null, + "shasum": "f2e9b0c55788af457a52ea579e2bb009f7f70ccd" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/TaxImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-theme", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-theme-0.74.0-beta9.zip", + "reference": null, + "shasum": "34fbc07ab9a15edac3b102a4ae6e04cbc16c4383" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-require-js": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-translation": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Theme" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-translation", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-translation-0.74.0-beta9.zip", + "reference": null, + "shasum": "a7d61f2d4fc262495f4d577ead1d66e6caebe200" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-developer": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Translation" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-ui", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-ui-0.74.0-beta9.zip", + "reference": null, + "shasum": "501305e3a3648d549c5bc91baca89395495b2a74" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Ui" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-ups", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-ups-0.74.0-beta9.zip", + "reference": null, + "shasum": "b818adcf10ebdc0586a81b7165a34af5b3860008" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Ups" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-url-rewrite", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-url-rewrite-0.74.0-beta9.zip", + "reference": null, + "shasum": "34d054a4ebd87ce92e1d1046d956862604f65b37" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-url-rewrite": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-cms-url-rewrite": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/UrlRewrite" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-user", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-user-0.74.0-beta9.zip", + "reference": null, + "shasum": "4d31751fe30d0f71eead11dc4a55d389c6093eda" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta9", + "magento/module-backend": "0.74.0-beta9", + "magento/module-integration": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/User" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-usps", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-usps-0.74.0-beta9.zip", + "reference": null, + "shasum": "81d063228ed743310ee1c9bbdc62562ac2fc9241" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Usps" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-variable", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-variable-0.74.0-beta9.zip", + "reference": null, + "shasum": "37a886883455a5321e5d28a5fc28248d56e32ee3" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-email": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.4.11|~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Variable" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-version", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-version-0.74.0-beta9.zip", + "reference": null, + "shasum": "7867b8eb39d12d99ed28373b30d0904e4cc115ca" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Version" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-webapi", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-webapi-0.74.0-beta9.zip", + "reference": null, + "shasum": "aa667d18e1f941bafa1067f077ff473bcd43ef0f" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta9", + "magento/module-backend": "0.74.0-beta9", + "magento/module-integration": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-user": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Webapi" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-weee", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-weee-0.74.0-beta9.zip", + "reference": null, + "shasum": "93cb501b913b88987b014815620f77c3d2c2ba34" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Weee" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-widget", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-widget-0.74.0-beta9.zip", + "reference": null, + "shasum": "15f9242331dc9ba7a212e0a5ad2a8feea4b6c947" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-variable": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Widget" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-wishlist", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-wishlist-0.74.0-beta9.zip", + "reference": null, + "shasum": "bd837563e9db26a98f853f8c812a033e3a522be9" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-grouped-product": "0.74.0-beta9", + "magento/module-rss": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-ui": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-bundle": "0.74.0-beta9", + "magento/module-configurable-product": "0.74.0-beta9", + "magento/module-cookie": "0.74.0-beta9", + "magento/module-downloadable": "0.74.0-beta9" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Wishlist" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/product-community-edition", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_product-community-edition-0.74.0-beta9.zip", + "reference": null, + "shasum": "dcdb19ed1bd35078af02e032d57fa56f657e2de5" + }, + "require": { + "composer/composer": "1.0.0-alpha9", + "magento/framework": "0.74.0-beta9", + "magento/language-de_de": "0.74.0-beta9", + "magento/language-en_us": "0.74.0-beta9", + "magento/language-es_es": "0.74.0-beta9", + "magento/language-fr_fr": "0.74.0-beta9", + "magento/language-nl_nl": "0.74.0-beta9", + "magento/language-pt_br": "0.74.0-beta9", + "magento/language-zh_cn": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/magento2-base": "0.74.0-beta9", + "magento/module-admin-notification": "0.74.0-beta9", + "magento/module-authorization": "0.74.0-beta9", + "magento/module-backend": "0.74.0-beta9", + "magento/module-backup": "0.74.0-beta9", + "magento/module-bundle": "0.74.0-beta9", + "magento/module-cache-invalidate": "0.74.0-beta9", + "magento/module-captcha": "0.74.0-beta9", + "magento/module-catalog": "0.74.0-beta9", + "magento/module-catalog-import-export": "0.74.0-beta9", + "magento/module-catalog-inventory": "0.74.0-beta9", + "magento/module-catalog-rule": "0.74.0-beta9", + "magento/module-catalog-search": "0.74.0-beta9", + "magento/module-catalog-url-rewrite": "0.74.0-beta9", + "magento/module-catalog-widget": "0.74.0-beta9", + "magento/module-centinel": "0.74.0-beta9", + "magento/module-checkout": "0.74.0-beta9", + "magento/module-checkout-agreements": "0.74.0-beta9", + "magento/module-cms": "0.74.0-beta9", + "magento/module-cms-url-rewrite": "0.74.0-beta9", + "magento/module-config": "0.74.0-beta9", + "magento/module-configurable-import-export": "0.74.0-beta9", + "magento/module-configurable-product": "0.74.0-beta9", + "magento/module-contact": "0.74.0-beta9", + "magento/module-cookie": "0.74.0-beta9", + "magento/module-cron": "0.74.0-beta9", + "magento/module-currency-symbol": "0.74.0-beta9", + "magento/module-customer": "0.74.0-beta9", + "magento/module-customer-import-export": "0.74.0-beta9", + "magento/module-design-editor": "0.74.0-beta9", + "magento/module-developer": "0.74.0-beta9", + "magento/module-dhl": "0.74.0-beta9", + "magento/module-directory": "0.74.0-beta9", + "magento/module-downloadable": "0.74.0-beta9", + "magento/module-eav": "0.74.0-beta9", + "magento/module-email": "0.74.0-beta9", + "magento/module-fedex": "0.74.0-beta9", + "magento/module-gift-message": "0.74.0-beta9", + "magento/module-google-adwords": "0.74.0-beta9", + "magento/module-google-analytics": "0.74.0-beta9", + "magento/module-google-optimizer": "0.74.0-beta9", + "magento/module-google-shopping": "0.74.0-beta9", + "magento/module-grouped-import-export": "0.74.0-beta9", + "magento/module-grouped-product": "0.74.0-beta9", + "magento/module-import-export": "0.74.0-beta9", + "magento/module-indexer": "0.74.0-beta9", + "magento/module-integration": "0.74.0-beta9", + "magento/module-layered-navigation": "0.74.0-beta9", + "magento/module-log": "0.74.0-beta9", + "magento/module-media-storage": "0.74.0-beta9", + "magento/module-msrp": "0.74.0-beta9", + "magento/module-multishipping": "0.74.0-beta9", + "magento/module-newsletter": "0.74.0-beta9", + "magento/module-offline-payments": "0.74.0-beta9", + "magento/module-offline-shipping": "0.74.0-beta9", + "magento/module-page-cache": "0.74.0-beta9", + "magento/module-payment": "0.74.0-beta9", + "magento/module-persistent": "0.74.0-beta9", + "magento/module-product-alert": "0.74.0-beta9", + "magento/module-quote": "0.74.0-beta9", + "magento/module-reports": "0.74.0-beta9", + "magento/module-require-js": "0.74.0-beta9", + "magento/module-review": "0.74.0-beta9", + "magento/module-rss": "0.74.0-beta9", + "magento/module-rule": "0.74.0-beta9", + "magento/module-sales": "0.74.0-beta9", + "magento/module-sales-rule": "0.74.0-beta9", + "magento/module-sales-sequence": "0.74.0-beta9", + "magento/module-search": "0.74.0-beta9", + "magento/module-sendfriend": "0.74.0-beta9", + "magento/module-shipping": "0.74.0-beta9", + "magento/module-sitemap": "0.74.0-beta9", + "magento/module-store": "0.74.0-beta9", + "magento/module-tax": "0.74.0-beta9", + "magento/module-tax-import-export": "0.74.0-beta9", + "magento/module-theme": "0.74.0-beta9", + "magento/module-translation": "0.74.0-beta9", + "magento/module-ui": "0.74.0-beta9", + "magento/module-ups": "0.74.0-beta9", + "magento/module-url-rewrite": "0.74.0-beta9", + "magento/module-user": "0.74.0-beta9", + "magento/module-usps": "0.74.0-beta9", + "magento/module-variable": "0.74.0-beta9", + "magento/module-version": "0.74.0-beta9", + "magento/module-webapi": "0.74.0-beta9", + "magento/module-weee": "0.74.0-beta9", + "magento/module-widget": "0.74.0-beta9", + "magento/module-wishlist": "0.74.0-beta9", + "magento/theme-adminhtml-backend": "0.74.0-beta9", + "magento/theme-frontend-blank": "0.74.0-beta9", + "magento/theme-frontend-luma": "0.74.0-beta9", + "magento/zendframework1": "1.12.10", + "monolog/monolog": "1.11.0", + "oyejorge/less.php": "1.7.0.3", + "php": "~5.5.0|~5.6.0", + "symfony/console": "~2.3", + "tubalmartin/cssmin": "2.4.8-p4", + "zendframework/zend-code": "2.4.0", + "zendframework/zend-config": "2.4.0", + "zendframework/zend-console": "2.4.0", + "zendframework/zend-di": "2.4.0", + "zendframework/zend-eventmanager": "2.4.0", + "zendframework/zend-form": "2.4.0", + "zendframework/zend-http": "2.4.0", + "zendframework/zend-i18n": "2.4.0", + "zendframework/zend-json": "2.4.0", + "zendframework/zend-log": "2.4.0", + "zendframework/zend-modulemanager": "2.4.0", + "zendframework/zend-mvc": "2.4.0", + "zendframework/zend-serializer": "2.4.0", + "zendframework/zend-server": "2.4.0", + "zendframework/zend-servicemanager": "2.4.0", + "zendframework/zend-soap": "2.4.0", + "zendframework/zend-stdlib": "2.4.0", + "zendframework/zend-text": "2.4.0", + "zendframework/zend-uri": "2.4.0", + "zendframework/zend-validator": "2.4.0", + "zendframework/zend-view": "2.4.0" + }, + "type": "metapackage", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "eCommerce Platform for Growth (Community Edition)" + }, + { + "name": "magento/theme-adminhtml-backend", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_theme-adminhtml-backend-0.74.0-beta9.zip", + "reference": null, + "shasum": "180c47b61bd4711070cdc4156e652c0158fb85a6" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-theme", + "extra": { + "map": [ + [ + "*", + "adminhtml/Magento/backend" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/theme-frontend-blank", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_theme-frontend-blank-0.74.0-beta9.zip", + "reference": null, + "shasum": "dc037fe5de13aff46169958e58c07993b623909a" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-theme", + "extra": { + "map": [ + [ + "*", + "frontend/Magento/blank" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/theme-frontend-luma", + "version": "0.74.0-beta9", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_theme-frontend-luma-0.74.0-beta9.zip", + "reference": null, + "shasum": "11d0b3dd1f800ef730bf87c02a5e5031c8a8e214" + }, + "require": { + "magento/framework": "0.74.0-beta9", + "magento/magento-composer-installer": "*", + "magento/theme-frontend-blank": "0.74.0-beta9", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-theme", + "extra": { + "map": [ + [ + "*", + "frontend/Magento/luma" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/zendframework1", + "version": "1.12.10", + "source": { + "type": "git", + "url": "https://github.com/magento/zf1.git", + "reference": "d1e5cd8c9f83229bcdd9bb485c3ce25259c77884" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/zf1/zipball/d1e5cd8c9f83229bcdd9bb485c3ce25259c77884", + "reference": "d1e5cd8c9f83229bcdd9bb485c3ce25259c77884", + "shasum": "" + }, + "require": { + "php": ">=5.2.11" + }, + "require-dev": { + "phpunit/dbunit": "1.3.*", + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "library/" + ], + "license": [ + "BSD-3-Clause" + ], + "description": "Magento Zend Framework 1", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "framework" + ], + "time": "2015-02-06 17:25:45" + }, + { + "name": "monolog/monolog", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "ec3961874c43840e96da3a8a1ed20d8c73d7e5aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/ec3961874c43840e96da3a8a1ed20d8c73d7e5aa", + "reference": "ec3961874c43840e96da3a8a1ed20d8c73d7e5aa", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "~2.4, >2.4.8", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "phpunit/phpunit": "~3.7.0", + "raven/raven": "~0.5", + "ruflin/elastica": "0.90.*", + "videlalvaro/php-amqplib": "~2.4" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "raven/raven": "Allow sending log messages to a Sentry server", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2014-09-30 13:30:58" + }, + { + "name": "oyejorge/less.php", + "version": "v1.7.0.3", + "source": { + "type": "git", + "url": "https://github.com/oyejorge/less.php.git", + "reference": "6e08ecb07e6f6d9170c23e8744c58fdd822ad0de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oyejorge/less.php/zipball/6e08ecb07e6f6d9170c23e8744c58fdd822ad0de", + "reference": "6e08ecb07e6f6d9170c23e8744c58fdd822ad0de", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "bin": [ + "bin/lessc" + ], + "type": "library", + "autoload": { + "psr-0": { + "Less": "lib/" + }, + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Matt Agar", + "homepage": "https://github.com/agar" + }, + { + "name": "Martin JantoÅ¡oviÄ", + "homepage": "https://github.com/Mordred" + }, + { + "name": "Josh Schmidt", + "homepage": "https://github.com/oyejorge" + } + ], + "description": "PHP port of the Javascript version of LESS http://lesscss.org", + "homepage": "http://lessphp.gpeasy.com", + "keywords": [ + "css", + "less", + "less.js", + "lesscss", + "php", + "stylesheet" + ], + "time": "2015-03-10 18:12:59" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "seld/jsonlint", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "863ae85c6d3ef60ca49cb12bd051c4a0648c40c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/863ae85c6d3ef60ca49cb12bd051c4a0648c40c4", + "reference": "863ae85c6d3ef60ca49cb12bd051c4a0648c40c4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "time": "2015-01-04 21:18:15" + }, + { + "name": "symfony/console", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "ebc5679854aa24ed7d65062e9e3ab0b18a917272" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/ebc5679854aa24ed7d65062e9e3ab0b18a917272", + "reference": "ebc5679854aa24ed7d65062e9e3ab0b18a917272", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/phpunit-bridge": "~2.7", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/finder", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "704c64c8b12c8882640d5c0330a8414b1e06dc99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/704c64c8b12c8882640d5c0330a8414b1e06dc99", + "reference": "704c64c8b12c8882640d5c0330a8414b1e06dc99", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/process", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "9f3c4baaf840ed849e1b1f7bfd5ae246e8509562" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/9f3c4baaf840ed849e1b1f7bfd5ae246e8509562", + "reference": "9f3c4baaf840ed849e1b1f7bfd5ae246e8509562", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "tubalmartin/cssmin", + "version": "v2.4.8-p4", + "source": { + "type": "git", + "url": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port.git", + "reference": "fe84d71e8420243544c0ce3bd0f5d7c1936b0f90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tubalmartin/YUI-CSS-compressor-PHP-port/zipball/fe84d71e8420243544c0ce3bd0f5d7c1936b0f90", + "reference": "fe84d71e8420243544c0ce3bd0f5d7c1936b0f90", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "cssmin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Túbal MartÃn", + "homepage": "http://tubalmartin.me/" + } + ], + "description": "A PHP port of the YUI CSS compressor", + "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port", + "keywords": [ + "compress", + "compressor", + "css", + "minify", + "yui" + ], + "time": "2014-09-22 08:08:50" + }, + { + "name": "zendframework/zend-code", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-code.git", + "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", + "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version" + }, + "require-dev": { + "doctrine/common": ">=2.1", + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-stdlib": "self.version" + }, + "suggest": { + "doctrine/common": "Doctrine\\Common >=2.1 for annotation features", + "zendframework/zend-stdlib": "Zend\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides facilities to generate arbitrary code using an object oriented interface", + "homepage": "https://github.com/zendframework/zend-code", + "keywords": [ + "code", + "zf2" + ], + "time": "2015-03-31 15:39:14" + }, + { + "name": "zendframework/zend-config", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-config.git", + "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-config/zipball/95f3a4b3fa85d49e6f060183122de4596fa6d29d", + "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json to use the Json reader or writer classes", + "zendframework/zend-servicemanager": "Zend\\ServiceManager for use with the Config Factory to retrieve reader and writer instances" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a nested object property based user interface for accessing this configuration data within application code", + "homepage": "https://github.com/zendframework/zend-config", + "keywords": [ + "config", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-console", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-console.git", + "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-console/zipball/54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", + "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "suggest": { + "zendframework/zend-filter": "To support DefaultRouteMatcher usage", + "zendframework/zend-validator": "To support DefaultRouteMatcher usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Console\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-console", + "keywords": [ + "console", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-di", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-di.git", + "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-di/zipball/b9f8de081adecf71a003a569e9ba76c0a4c00bf2", + "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-code": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Di\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-di", + "keywords": [ + "di", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-escaper", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-escaper.git", + "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/15e5769e4fcdb4bf07ebd76500810e7070e23a97", + "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Escaper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-escaper", + "keywords": [ + "escaper", + "zf2" + ], + "time": "2015-03-23 18:29:14" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "58d21c95c7005a527262fd536499195f104e83f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/58d21c95c7005a527262fd536499195f104e83f9", + "reference": "58d21c95c7005a527262fd536499195f104e83f9", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-event-manager", + "keywords": [ + "eventmanager", + "zf2" + ], + "time": "2015-03-23 18:29:14" + }, + { + "name": "zendframework/zend-filter", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-filter.git", + "reference": "6d8aed2da81b62a04747346c4370562cdbe34595" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/6d8aed2da81b62a04747346c4370562cdbe34595", + "reference": "6d8aed2da81b62a04747346c4370562cdbe34595", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-crypt": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-crypt": "Zend\\Crypt component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-uri": "Zend\\Uri component for UriNormalize filter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Filter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed data filters", + "homepage": "https://github.com/zendframework/zend-filter", + "keywords": [ + "filter", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-form", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-form.git", + "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-form/zipball/bca0db55718355d25c2c10fdd41a83561f1c94b3", + "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-inputfilter": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-captcha": "self.version", + "zendframework/zend-code": "self.version", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-validator": "self.version", + "zendframework/zend-view": "self.version", + "zendframework/zendservice-recaptcha": "*" + }, + "suggest": { + "zendframework/zend-captcha": "Zend\\Captcha component", + "zendframework/zend-code": "Zend\\Code component", + "zendframework/zend-eventmanager": "Zend\\EventManager component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-validator": "Zend\\Validator component", + "zendframework/zend-view": "Zend\\View component", + "zendframework/zendservice-recaptcha": "ZendService\\ReCaptcha component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Form\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-form", + "keywords": [ + "form", + "zf2" + ], + "time": "2015-03-28 20:29:18" + }, + { + "name": "zendframework/zend-http", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-http.git", + "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-http/zipball/9c6047a0bdb3094d3ea07a215ff929cc47de4deb", + "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-loader": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-uri": "self.version", + "zendframework/zend-validator": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Http\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", + "homepage": "https://github.com/zendframework/zend-http", + "keywords": [ + "http", + "zf2" + ], + "time": "2015-03-27 15:46:30" + }, + { + "name": "zendframework/zend-i18n", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-i18n.git", + "reference": "9aebc5287373a802540d75fe5508417f866c2e52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/9aebc5287373a802540d75fe5508417f866c2e52", + "reference": "9aebc5287373a802540d75fe5508417f866c2e52", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-cache": "self.version", + "zendframework/zend-config": "self.version", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-validator": "self.version", + "zendframework/zend-view": "self.version" + }, + "suggest": { + "ext-intl": "Required for most features of Zend\\I18n; included in default builds of PHP", + "zendframework/zend-cache": "Zend\\Cache component", + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-eventmanager": "You should install this package to use the events in the translator", + "zendframework/zend-filter": "You should install this package to use the provided filters", + "zendframework/zend-resources": "Translation resources", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-validator": "You should install this package to use the provided validators", + "zendframework/zend-view": "You should install this package to use the provided view helpers" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\I18n\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-i18n", + "keywords": [ + "i18n", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-inputfilter", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-inputfilter.git", + "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/4b1398f3635fae3cc5e873c5bb067274f3d10a93", + "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-filter": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-validator": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "To support plugin manager support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\InputFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-input-filter", + "keywords": [ + "inputfilter", + "zf2" + ], + "time": "2015-03-23 18:29:14" + }, + { + "name": "zendframework/zend-json", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-json.git", + "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-json/zipball/2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", + "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-http": "self.version", + "zendframework/zend-server": "self.version" + }, + "suggest": { + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-server": "Zend\\Server component", + "zendframework/zendxml": "To support Zend\\Json\\Json::fromXml() usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Json\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", + "homepage": "https://github.com/zendframework/zend-json", + "keywords": [ + "json", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-loader", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-loader.git", + "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-loader/zipball/65de2c7a56f8eee633c6bf1cfab73e45648880d4", + "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Loader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-loader", + "keywords": [ + "loader", + "zf2" + ], + "time": "2015-03-23 18:29:14" + }, + { + "name": "zendframework/zend-log", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-log.git", + "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-log/zipball/002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", + "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-console": "self.version", + "zendframework/zend-db": "self.version", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-mail": "self.version", + "zendframework/zend-validator": "self.version" + }, + "suggest": { + "ext-mongo": "*", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-escaper": "Zend\\Escaper component, for use in the XML formatter", + "zendframework/zend-mail": "Zend\\Mail component", + "zendframework/zend-validator": "Zend\\Validator component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Log\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "component for general purpose logging", + "homepage": "https://github.com/zendframework/zend-log", + "keywords": [ + "log", + "logging", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-math", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-math.git", + "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-math/zipball/f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", + "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "suggest": { + "ext-bcmath": "If using the bcmath functionality", + "ext-gmp": "If using the gmp functionality", + "ircmaxell/random-lib": "Fallback random byte generator for Zend\\Math\\Rand if OpenSSL/Mcrypt extensions are unavailable", + "zendframework/zend-servicemanager": ">= current version, if using the BigInteger::factory functionality" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-math", + "keywords": [ + "math", + "zf2" + ], + "time": "2015-03-23 18:29:14" + }, + { + "name": "zendframework/zend-modulemanager", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-modulemanager.git", + "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-modulemanager/zipball/af7ae3cd29a1efb73cc66ae1081e606039d5c20f", + "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-config": "self.version", + "zendframework/zend-console": "self.version", + "zendframework/zend-loader": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-loader": "Zend\\Loader component", + "zendframework/zend-mvc": "Zend\\Mvc component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\ModuleManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-module-manager", + "keywords": [ + "modulemanager", + "zf2" + ], + "time": "2015-03-23 18:29:14" + }, + { + "name": "zendframework/zend-mvc", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-mvc.git", + "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-mvc/zipball/0b4a4a829b30be510a3f215c4ff00c703ee8b431", + "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-form": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-authentication": "self.version", + "zendframework/zend-console": "self.version", + "zendframework/zend-di": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-http": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-inputfilter": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-log": "self.version", + "zendframework/zend-modulemanager": "self.version", + "zendframework/zend-serializer": "self.version", + "zendframework/zend-session": "self.version", + "zendframework/zend-text": "self.version", + "zendframework/zend-uri": "self.version", + "zendframework/zend-validator": "self.version", + "zendframework/zend-version": "self.version", + "zendframework/zend-view": "self.version" + }, + "suggest": { + "zendframework/zend-authentication": "Zend\\Authentication component for Identity plugin", + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-di": "Zend\\Di component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-i18n": "Zend\\I18n component for translatable segments", + "zendframework/zend-inputfilter": "Zend\\Inputfilter component", + "zendframework/zend-json": "Zend\\Json component", + "zendframework/zend-log": "Zend\\Log component", + "zendframework/zend-modulemanager": "Zend\\ModuleManager component", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-session": "Zend\\Session component for FlashMessenger, PRG, and FPRG plugins", + "zendframework/zend-stdlib": "Zend\\Stdlib component", + "zendframework/zend-text": "Zend\\Text component", + "zendframework/zend-uri": "Zend\\Uri component", + "zendframework/zend-validator": "Zend\\Validator component", + "zendframework/zend-version": "Zend\\Version component", + "zendframework/zend-view": "Zend\\View component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Mvc\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-mvc", + "keywords": [ + "mvc", + "zf2" + ], + "time": "2015-03-26 18:55:14" + }, + { + "name": "zendframework/zend-serializer", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-serializer.git", + "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/3c531789a9882a5deb721356a7bd2642b65d4b09", + "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-json": "self.version", + "zendframework/zend-math": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "To support plugin manager support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", + "homepage": "https://github.com/zendframework/zend-serializer", + "keywords": [ + "serializer", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-server", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-server.git", + "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-server/zipball/d11ff0bd529d202022823d4accf5983cbd50fc49", + "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-code": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-server", + "keywords": [ + "server", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-servicemanager", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-servicemanager.git", + "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/57cf99fa5ac08c05a135a8d0d676c52a5e450083", + "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-di": "self.version" + }, + "suggest": { + "ocramius/proxy-manager": "ProxyManager 0.5.* to handle lazy initialization of services", + "zendframework/zend-di": "Zend\\Di component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\ServiceManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-service-manager", + "keywords": [ + "servicemanager", + "zf2" + ], + "time": "2015-03-23 18:29:14" + }, + { + "name": "zendframework/zend-soap", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-soap.git", + "reference": "a599463aba97ce247faf3fb443e3c7858b46449b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-soap/zipball/a599463aba97ce247faf3fb443e3c7858b46449b", + "reference": "a599463aba97ce247faf3fb443e3c7858b46449b", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-server": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-uri": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-http": "self.version" + }, + "suggest": { + "zendframework/zend-http": "Zend\\Http component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Soap\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-soap", + "keywords": [ + "soap", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-stdlib", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-stdlib.git", + "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cf05c5ba75606e47ffee91cedc72778da46f74c3", + "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-serializer": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-eventmanager": "To support aggregate hydrator usage", + "zendframework/zend-filter": "To support naming strategy hydrator usage", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-servicemanager": "To support hydrator plugin manager usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-stdlib", + "keywords": [ + "stdlib", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-text", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-text.git", + "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-text/zipball/d962ea25647b20527f3ca34ae225bbc885dabfc7", + "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Text\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-text", + "keywords": [ + "text", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-uri", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-uri.git", + "reference": "bd9e625639415376f6a82551c73328448d7bc7d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-uri/zipball/bd9e625639415376f6a82551c73328448d7bc7d1", + "reference": "bd9e625639415376f6a82551c73328448d7bc7d1", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-validator": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Uri\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", + "homepage": "https://github.com/zendframework/zend-uri", + "keywords": [ + "uri", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-validator", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-validator.git", + "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-validator/zipball/45fac2545a0f2eb66d71cb7966feee481e7c475f", + "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-db": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-math": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-session": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-filter": "Zend\\Filter component, required by the Digits validator", + "zendframework/zend-i18n": "Zend\\I18n component to allow translation of validation error messages as well as to use the various Date validators", + "zendframework/zend-math": "Zend\\Math component", + "zendframework/zend-resources": "Translations of validator messages", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", + "zendframework/zend-session": "Zend\\Session component", + "zendframework/zend-uri": "Zend\\Uri component, required by the Uri and Sitemap\\Loc validators" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Validator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed validators", + "homepage": "https://github.com/zendframework/zend-validator", + "keywords": [ + "validator", + "zf2" + ], + "time": "2015-03-25 20:55:48" + }, + { + "name": "zendframework/zend-view", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-view.git", + "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-view/zipball/37beb1ad46e530f627b4b6c3716efd728e976ba9", + "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-loader": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-authentication": "self.version", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-feed": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-http": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-mvc": "self.version", + "zendframework/zend-navigation": "self.version", + "zendframework/zend-paginator": "self.version", + "zendframework/zend-permissions-acl": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-authentication": "Zend\\Authentication component", + "zendframework/zend-escaper": "Zend\\Escaper component", + "zendframework/zend-feed": "Zend\\Feed component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json component", + "zendframework/zend-mvc": "Zend\\Mvc component", + "zendframework/zend-navigation": "Zend\\Navigation component", + "zendframework/zend-paginator": "Zend\\Paginator component", + "zendframework/zend-permissions-acl": "Zend\\Permissions\\Acl component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-uri": "Zend\\Uri component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\View\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a system of helpers, output filters, and variable escaping", + "homepage": "https://github.com/zendframework/zend-view", + "keywords": [ + "view", + "zf2" + ], + "time": "2015-03-25 20:55:48" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", + "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.0.*@ALPHA" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Instantiator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2014-10-13 12:58:55" + }, + { + "name": "fabpot/php-cs-fixer", + "version": "v1.8", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "93c723fe0c50ed54292006e7249a4c1173cf5847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/93c723fe0c50ed54292006e7249a4c1173cf5847", + "reference": "93c723fe0c50ed54292006e7249a4c1173cf5847", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.6", + "sebastian/diff": "~1.1", + "symfony/console": "~2.3", + "symfony/event-dispatcher": "~2.1", + "symfony/filesystem": "~2.1", + "symfony/finder": "~2.1", + "symfony/process": "~2.3", + "symfony/stopwatch": "~2.5" + }, + "require-dev": { + "satooshi/php-coveralls": "0.7.*@dev" + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "Symfony\\CS\\": "Symfony/CS/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dariusz RumiÅ„ski", + "email": "dariusz.ruminski@gmail.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "time": "2015-05-04 17:06:20" + }, + { + "name": "league/climate", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/climate.git", + "reference": "28851c909017424f61cc6a62089316313c645d1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/climate/zipball/28851c909017424f61cc6a62089316313c645d1c", + "reference": "28851c909017424f61cc6a62089316313c645d1c", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "dev-master", + "phpunit/phpunit": "4.1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\CLImate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joe Tannenbaum", + "email": "hey@joe.codes", + "homepage": "http://joe.codes/", + "role": "Developer" + } + ], + "description": "PHP's best friend for the terminal. CLImate allows you to easily output colored text, special formats, and more.", + "keywords": [ + "cli", + "colors", + "command", + "php", + "terminal" + ], + "time": "2015-01-18 14:31:58" + }, + { + "name": "lusitanian/oauth", + "version": "v0.3.5", + "source": { + "type": "git", + "url": "https://github.com/Lusitanian/PHPoAuthLib.git", + "reference": "ac5a1cd5a4519143728dce2213936eea302edf8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/ac5a1cd5a4519143728dce2213936eea302edf8a", + "reference": "ac5a1cd5a4519143728dce2213936eea302edf8a", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*", + "predis/predis": "0.8.*@dev", + "symfony/http-foundation": "~2.1" + }, + "suggest": { + "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client.", + "predis/predis": "Allows using the Redis storage backend.", + "symfony/http-foundation": "Allows using the Symfony Session storage backend." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.1-dev" + } + }, + "autoload": { + "psr-0": { + "OAuth": "src", + "OAuth\\Unit": "tests" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Desberg", + "email": "david@daviddesberg.com" + }, + { + "name": "Pieter Hordijk", + "email": "info@pieterhordijk.com" + } + ], + "description": "PHP 5.3+ oAuth 1/2 Library", + "keywords": [ + "Authentication", + "authorization", + "oauth", + "security" + ], + "time": "2014-09-05 15:19:58" + }, + { + "name": "pdepend/pdepend", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "a15ffcbfbcc4570d4a733ca7b76e9cac0a56c3f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/a15ffcbfbcc4570d4a733ca7b76e9cac0a56c3f4", + "reference": "a15ffcbfbcc4570d4a733ca7b76e9cac0a56c3f4", + "shasum": "" + }, + "require": { + "symfony/config": ">=2.4", + "symfony/dependency-injection": ">=2.4", + "symfony/filesystem": ">=2.4" + }, + "require-dev": { + "phpunit/phpunit": "4.*@stable", + "squizlabs/php_codesniffer": "@stable" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "autoload": { + "psr-0": { + "PDepend\\": "src/main/php/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "time": "2015-03-02 08:06:43" + }, + { + "name": "phpmd/phpmd", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "7dc4a6b5c07b119ab5da7960b56303fa6855eb84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/7dc4a6b5c07b119ab5da7960b56303fa6855eb84", + "reference": "7dc4a6b5c07b119ab5da7960b56303fa6855eb84", + "shasum": "" + }, + "require": { + "pdepend/pdepend": "2.0.*", + "php": ">=5.3.0", + "symfony/config": ">=2.4", + "symfony/dependency-injection": ">=2.4", + "symfony/filesystem": ">=2.4" + }, + "require-dev": { + "phpunit/phpunit": "*", + "squizlabs/php_codesniffer": "*" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "project", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project founder" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "http://phpmd.org/", + "keywords": [ + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "time": "2015-03-26 07:47:05" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.0.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "934fd03eb6840508231a7f73eb8940cf32c3b66c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/934fd03eb6840508231a7f73eb8940cf32c3b66c", + "reference": "934fd03eb6840508231a7f73eb8940cf32c3b66c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "~1.0", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-04-11 04:35:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2013-10-10 15:34:57" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2014-01-30 17:20:04" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "eab81d02569310739373308137284e0158424330" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330", + "reference": "eab81d02569310739373308137284e0158424330", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2015-04-08 04:46:07" + }, + { + "name": "phpunit/phpunit", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "efb1b1334605594417a3bd466477772d06d460a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/efb1b1334605594417a3bd466477772d06d460a8", + "reference": "efb1b1334605594417a3bd466477772d06d460a8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~2.0", + "phpunit/php-file-iterator": "~1.3.1", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "~1.0.2", + "phpunit/phpunit-mock-objects": "~2.1", + "sebastian/comparator": "~1.0", + "sebastian/diff": "~1.1", + "sebastian/environment": "~1.0", + "sebastian/exporter": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2014-05-02 07:13:40" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "74ffb87f527f24616f72460e54b595f508dccb5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/74ffb87f527f24616f72460e54b595f508dccb5c", + "reference": "74ffb87f527f24616f72460e54b595f508dccb5c", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "~1.0,>=1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-04-02 05:36:41" + }, + { + "name": "sebastian/comparator", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-01-29 16:28:08" + }, + { + "name": "sebastian/diff", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-02-22 15:13:53" + }, + { + "name": "sebastian/environment", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2015-01-01 10:01:08" + }, + { + "name": "sebastian/exporter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "84839970d05254c73cde183a721c7af13aede943" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", + "reference": "84839970d05254c73cde183a721c7af13aede943", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-01-27 07:23:06" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-01-24 09:48:32" + }, + { + "name": "sebastian/version", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ab931d46cd0d3204a91e1b9a40c4bc13032b58e4", + "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-02-24 06:35:25" + }, + { + "name": "sjparkinson/static-review", + "version": "4.1.1", + "source": { + "type": "git", + "url": "https://github.com/sjparkinson/static-review.git", + "reference": "493c3410cf146a12fca84209bad126c494e125f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sjparkinson/static-review/zipball/493c3410cf146a12fca84209bad126c494e125f0", + "reference": "493c3410cf146a12fca84209bad126c494e125f0", + "shasum": "" + }, + "require": { + "league/climate": "~2.0", + "php": ">=5.4.0", + "symfony/console": "~2.0", + "symfony/process": "~2.0" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpunit/phpunit": "~4.0", + "sensiolabs/security-checker": "~2.0", + "squizlabs/php_codesniffer": "~1.0" + }, + "suggest": { + "sensiolabs/security-checker": "Required for ComposerSecurityReview.", + "squizlabs/php_codesniffer": "Required for PhpCodeSnifferReview." + }, + "bin": [ + "bin/static-review.php" + ], + "type": "library", + "autoload": { + "psr-4": { + "StaticReview\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Parkinson", + "email": "sam.james.parkinson@gmail.com", + "homepage": "http://samp.im" + } + ], + "description": "An extendable framework for version control hooks.", + "time": "2014-09-22 08:40:36" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "396178ada8499ec492363587f037125bf7b07fcc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/396178ada8499ec492363587f037125bf7b07fcc", + "reference": "396178ada8499ec492363587f037125bf7b07fcc", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.1.2" + }, + "suggest": { + "phpunit/php-timer": "dev-master" + }, + "bin": [ + "scripts/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-phpcs-fixer": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/CommentParser/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2014-05-01 03:07:07" + }, + { + "name": "symfony/config", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Config", + "source": { + "type": "git", + "url": "https://github.com/symfony/Config.git", + "reference": "b6fddb4aa2daaa2b06f0040071ac131b4a1ecf25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Config/zipball/b6fddb4aa2daaa2b06f0040071ac131b4a1ecf25", + "reference": "b6fddb4aa2daaa2b06f0040071ac131b4a1ecf25", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/filesystem": "~2.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/dependency-injection", + "version": "v2.6.7", + "target-dir": "Symfony/Component/DependencyInjection", + "source": { + "type": "git", + "url": "https://github.com/symfony/DependencyInjection.git", + "reference": "b575c160af001d3525ee733085bcc4ec7c8e1b51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/b575c160af001d3525ee733085bcc4ec7c8e1b51", + "reference": "b575c160af001d3525ee733085bcc4ec7c8e1b51", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "conflict": { + "symfony/expression-language": "<2.6" + }, + "require-dev": { + "symfony/config": "~2.2", + "symfony/expression-language": "~2.6", + "symfony/phpunit-bridge": "~2.7", + "symfony/yaml": "~2.1" + }, + "suggest": { + "symfony/config": "", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\DependencyInjection\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.6.7", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "672593bc4b0043a0acf91903bb75a1c82d8f2e02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/672593bc4b0043a0acf91903bb75a1c82d8f2e02", + "reference": "672593bc4b0043a0acf91903bb75a1c82d8f2e02", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0,>=2.0.5", + "symfony/dependency-injection": "~2.6", + "symfony/expression-language": "~2.6", + "symfony/phpunit-bridge": "~2.7", + "symfony/stopwatch": "~2.3" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/filesystem", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Filesystem", + "source": { + "type": "git", + "url": "https://github.com/symfony/Filesystem.git", + "reference": "f73904bd2dae525c42ea1f0340c7c98480ecacde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/f73904bd2dae525c42ea1f0340c7c98480ecacde", + "reference": "f73904bd2dae525c42ea1f0340c7c98480ecacde", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2015-05-08 00:09:07" + }, + { + "name": "symfony/stopwatch", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Stopwatch", + "source": { + "type": "git", + "url": "https://github.com/symfony/Stopwatch.git", + "reference": "b470f87c69837cb71115f1fa720388bb19b63635" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/b470f87c69837cb71115f1fa720388bb19b63635", + "reference": "b470f87c69837cb71115f1fa720388bb19b63635", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Stopwatch\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + }, + { + "name": "symfony/yaml", + "version": "v2.6.7", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "f157ab074e453ecd4c0fa775f721f6e67a99d9e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/f157ab074e453ecd4c0fa775f721f6e67a99d9e2", + "reference": "f157ab074e453ecd4c0fa775f721f6e67a99d9e2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:18:45" + } + ], + "aliases": [], + "minimum-stability": "alpha", + "stability-flags": { + "phpmd/phpmd": 0 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": [], + "platform-dev": { + "lib-libxml": "*", + "ext-ctype": "*", + "ext-gd": "*", + "ext-spl": "*", + "ext-dom": "*", + "ext-simplexml": "*", + "ext-mcrypt": "*", + "ext-hash": "*", + "ext-curl": "*", + "ext-iconv": "*", + "ext-intl": "*" + } +} diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/vendor/README b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/vendor/README new file mode 100644 index 0000000000000000000000000000000000000000..4ff7f39bd61163e93b753517020434e907c3d8bd --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/vendor/README @@ -0,0 +1,5 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + This file is to create a vendor directory for testing \ No newline at end of file diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.json b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.json new file mode 100644 index 0000000000000000000000000000000000000000..945bccecd52ed686fa6c13484ac083ac80168c3d --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.json @@ -0,0 +1,24 @@ +{ + "version": "0.74.0-beta9", + "require": { + "magento/product-community-edition": "0.74.0-beta2", + "magento/sample-module-minimal" : "*" + }, + "repositories": [ + { + "type": "composer", + "url": "http://packages.magento.com/" + } + ], + "autoload": { + "psr-4": { + "Magento\\Framework\\": "htdocs/lib/internal/Magento/Framework/", + "Magento\\Setup\\": "htdocs/setup/src/Magento/Setup/" + } + }, + "extra": { + "magento-root-dir": "htdocs", + "magento-deploystrategy": "copy" + }, + "minimum-stability": "dev" +} diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.lock b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.lock new file mode 100644 index 0000000000000000000000000000000000000000..3a079231ca9179ac0ebcf0d738388b81350c8ebc --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.lock @@ -0,0 +1,6253 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "8601c8b464025318475d28dbabf9ee67", + "packages": [ + { + "name": "composer/composer", + "version": "1.0.0-alpha8", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "1eb1df44a97fb2daca1bb8b007f3bee012f0aa46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/1eb1df44a97fb2daca1bb8b007f3bee012f0aa46", + "reference": "1eb1df44a97fb2daca1bb8b007f3bee012f0aa46", + "shasum": "" + }, + "require": { + "justinrainbow/json-schema": "1.1.*", + "php": ">=5.3.2", + "seld/jsonlint": "1.*", + "symfony/console": "~2.3", + "symfony/finder": "~2.2", + "symfony/process": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.10" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives, and allows gzip compression of all internet traffic" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Composer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be", + "role": "Developer" + }, + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de", + "role": "Developer" + } + ], + "description": "Dependency Manager", + "homepage": "http://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "time": "2014-01-06 18:39:59" + }, + { + "name": "justinrainbow/json-schema", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "05ff6d8d79fe3ad190b0663d80d3f9deee79416c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/05ff6d8d79fe3ad190b0663d80d3f9deee79416c", + "reference": "05ff6d8d79fe3ad190b0663d80d3f9deee79416c", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonSchema": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "NewBSD" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch", + "homepage": "http://wiedler.ch/igor/" + }, + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Robert Schönthal", + "email": "robert.schoenthal@gmail.com", + "homepage": "http://digitalkaoz.net" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2012-01-03 00:33:17" + }, + { + "name": "magento/framework", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_framework-0.74.0-beta2.zip", + "reference": null, + "shasum": "ebb865d9aae1b48e41706a7d2fe080b7735a1a0c" + }, + "require": { + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-hash": "*", + "ext-iconv": "*", + "ext-mcrypt": "*", + "ext-simplexml": "*", + "ext-spl": "*", + "lib-libxml": "*", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "ext-imagick": "Use Image Magick >=3.0.0 as an optional alternative image processing library" + }, + "type": "magento2-library", + "extra": { + "map": [ + [ + "*", + "Magento/Framework" + ] + ] + }, + "autoload": { + "psr-4": { + "Magento\\Framework\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/language-de_de", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-de_de-0.74.0-beta2.zip", + "reference": null, + "shasum": "574416a036e55513a6437b287b77426c291d9051" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/de_de" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "German (Germany) language" + }, + { + "name": "magento/language-en_us", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-en_us-0.74.0-beta2.zip", + "reference": null, + "shasum": "6246a6a773d86c078bb4f0bc5cee50e2eeab639f" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/en_us" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "English (United States) language" + }, + { + "name": "magento/language-es_es", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-es_es-0.74.0-beta2.zip", + "reference": null, + "shasum": "da8197a083474993b935bd16d8b001160475b97e" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/es_es" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Spanish (Spain) language" + }, + { + "name": "magento/language-fr_fr", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-fr_fr-0.74.0-beta2.zip", + "reference": null, + "shasum": "e3d58180b96a709e0b2fb8dccaee95b3be5dadd4" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/fr_fr" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "French (France) language" + }, + { + "name": "magento/language-nl_nl", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-nl_nl-0.74.0-beta2.zip", + "reference": null, + "shasum": "d7b29b6275aefa26e7a6d9fb4bcdb62a8ee34332" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/nl_nl" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Dutch (Netherlands) language" + }, + { + "name": "magento/language-pt_br", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-pt_br-0.74.0-beta2.zip", + "reference": null, + "shasum": "7b6bc50f18adc85d524cc549accd05752beb8858" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/pt_br" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Portuguese (Brazil) language" + }, + { + "name": "magento/language-zh_cn", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_language-zh_cn-0.74.0-beta2.zip", + "reference": null, + "shasum": "f9a151b4d1bbc6620289e9e91fb8bee023d14c5f" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-language", + "extra": { + "map": [ + [ + "*", + "magento/zh_cn" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Chinese (China) language" + }, + { + "name": "magento/magento-composer-installer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-composer-installer.git", + "reference": "7f03451f71e55d52c2bb07325d56a4e6df322f30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-composer-installer/zipball/7f03451f71e55d52c2bb07325d56a4e6df322f30", + "reference": "7f03451f71e55d52c2bb07325d56a4e6df322f30", + "shasum": "" + }, + "require": { + "composer-plugin-api": "1.0.0" + }, + "require-dev": { + "composer/composer": "*@dev", + "firegento/phpcs": "dev-patch-1", + "mikey179/vfsstream": "*", + "phpunit/phpunit": "*", + "phpunit/phpunit-mock-objects": "dev-master", + "squizlabs/php_codesniffer": "1.4.7", + "symfony/process": "*" + }, + "type": "composer-plugin", + "extra": { + "composer-command-registry": [ + "MagentoHackathon\\Composer\\Magento\\Command\\DeployCommand" + ], + "class": "MagentoHackathon\\Composer\\Magento\\Plugin" + }, + "autoload": { + "psr-0": { + "MagentoHackathon\\Composer\\Magento": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Vinai Kopp", + "email": "vinai@netzarbeiter.com" + }, + { + "name": "Daniel Fahlke aka Flyingmana", + "email": "flyingmana@googlemail.com" + }, + { + "name": "Jörg Weller", + "email": "weller@flagbit.de" + }, + { + "name": "Karl Spies", + "email": "karl.spies@gmx.net" + }, + { + "name": "Tobias Vogt", + "email": "tobi@webguys.de" + }, + { + "name": "David Fuhr", + "email": "fuhr@flagbit.de" + } + ], + "description": "Composer installer for Magento modules", + "homepage": "https://github.com/magento/magento-composer-installer", + "keywords": [ + "composer-installer", + "magento" + ], + "time": "2015-03-05 21:40:30" + }, + { + "name": "magento/magento2-base", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_magento2-base-0.74.0-beta2.zip", + "reference": null, + "shasum": "be10c634940670ff0cecf5f952f57891c626c652" + }, + "require": { + "magento/magento-composer-installer": "*" + }, + "replace": { + "blueimp/jquery-file-upload": "5.6.14", + "colinmollenhour/cache-backend-redis": "dev-master#193d377b7fb2e88595578b282fa01a62d1185abc", + "colinmollenhour/credis": "dev-master#f07bbfd4117294f462f0fb19c49221d350bf396f", + "components/jquery": "1.11.0", + "components/jqueryui": "1.10.4", + "linkorb/jsmin-php": "1.1.2", + "phpseclib/phpseclib": "0.2.1", + "tinymce/tinymce": "3.4.7", + "trentrichardson/jquery-timepicker-addon": "1.4.3", + "twbs/bootstrap": "3.1.0" + }, + "type": "magento2-component", + "extra": { + "component_paths": { + "trentrichardson/jquery-timepicker-addon": "lib/web/jquery/jquery-ui-timepicker-addon.js", + "colinmollenhour/cache-backend-redis": "lib/internal/Cm/Cache/Backend/Redis.php", + "colinmollenhour/credis": "lib/internal/Credis", + "linkorb/jsmin-php": "lib/internal/JSMin", + "phpseclib/phpseclib": "lib/internal/phpseclib", + "components/jquery": [ + "lib/web/jquery.js", + "lib/web/jquery/jquery.min.js", + "lib/web/jquery/jquery-migrate.js", + "lib/web/jquery/jquery-migrate.min.js" + ], + "blueimp/jquery-file-upload": "lib/web/jquery/fileUploader", + "components/jqueryui": [ + "lib/web/jquery/jquery-ui.js", + "lib/web/jquery/jquery-ui.min.js" + ], + "twbs/bootstrap": [ + "lib/web/jquery/jquery.tabs.js" + ], + "tinymce/tinymce": "lib/web/tiny_mce" + }, + "map": [ + [ + "lib/internal/Cm", + "lib/internal/Cm" + ], + [ + "lib/internal/LinLibertineFont", + "lib/internal/LinLibertineFont" + ], + [ + "lib/internal/phpseclib", + "lib/internal/phpseclib" + ], + [ + "lib/internal/Credis", + "lib/internal/Credis" + ], + [ + "lib/internal/CardinalCommerce", + "lib/internal/CardinalCommerce" + ], + [ + "lib/internal/JSMin", + "lib/internal/JSMin" + ], + [ + "lib/.htaccess", + "lib/.htaccess" + ], + [ + "lib/web/lib", + "lib/web/lib" + ], + [ + "lib/web/requirejs", + "lib/web/requirejs" + ], + [ + "lib/web/prototype", + "lib/web/prototype" + ], + [ + "lib/web/moment.js", + "lib/web/moment.js" + ], + [ + "lib/web/i18n", + "lib/web/i18n" + ], + [ + "lib/web/varien", + "lib/web/varien" + ], + [ + "lib/web/blank.html", + "lib/web/blank.html" + ], + [ + "lib/web/scriptaculous", + "lib/web/scriptaculous" + ], + [ + "lib/web/ko", + "lib/web/ko" + ], + [ + "lib/web/modernizr", + "lib/web/modernizr" + ], + [ + "lib/web/date-format-normalizer.js", + "lib/web/date-format-normalizer.js" + ], + [ + "lib/web/spacer.gif", + "lib/web/spacer.gif" + ], + [ + "lib/web/images", + "lib/web/images" + ], + [ + "lib/web/matchMedia.js", + "lib/web/matchMedia.js" + ], + [ + "lib/web/extjs", + "lib/web/extjs" + ], + [ + "lib/web/css", + "lib/web/css" + ], + [ + "lib/web/fonts", + "lib/web/fonts" + ], + [ + "lib/web/jquery", + "lib/web/jquery" + ], + [ + "lib/web/less", + "lib/web/less" + ], + [ + "lib/web/jquery.js", + "lib/web/jquery.js" + ], + [ + "lib/web/underscore.js", + "lib/web/underscore.js" + ], + [ + "lib/web/legacy-build.min.js", + "lib/web/legacy-build.min.js" + ], + [ + "lib/web/mage", + "lib/web/mage" + ], + [ + "lib/web/tiny_mce", + "lib/web/tiny_mce" + ], + [ + ".htaccess.sample", + ".htaccess.sample" + ], + [ + "CONTRIBUTING.md", + "CONTRIBUTING.md" + ], + [ + "package.json", + "package.json" + ], + [ + "nginx.conf.sample", + "nginx.conf.sample" + ], + [ + "var/.htaccess", + "var/.htaccess" + ], + [ + "pub/media/downloadable/.htaccess", + "pub/media/downloadable/.htaccess" + ], + [ + "pub/media/theme_customization/.htaccess", + "pub/media/theme_customization/.htaccess" + ], + [ + "pub/media/customer/.htaccess", + "pub/media/customer/.htaccess" + ], + [ + "pub/media/.htaccess", + "pub/media/.htaccess" + ], + [ + "pub/errors", + "pub/errors" + ], + [ + "pub/opt", + "pub/opt" + ], + [ + "pub/get.php", + "pub/get.php" + ], + [ + "pub/static/.htaccess", + "pub/static/.htaccess" + ], + [ + "pub/.htaccess", + "pub/.htaccess" + ], + [ + "pub/static.php", + "pub/static.php" + ], + [ + "pub/cron.php", + "pub/cron.php" + ], + [ + "pub/index.php", + "pub/index.php" + ], + [ + ".php_cs", + ".php_cs" + ], + [ + "COPYING.txt", + "COPYING.txt" + ], + [ + "dev/shell", + "dev/shell" + ], + [ + "dev/tools", + "dev/tools" + ], + [ + "dev/tests/integration/phpunit.xml.dist", + "dev/tests/integration/phpunit.xml.dist" + ], + [ + "dev/tests/integration/etc", + "dev/tests/integration/etc" + ], + [ + "dev/tests/integration/tmp", + "dev/tests/integration/tmp" + ], + [ + "dev/tests/integration/framework", + "dev/tests/integration/framework" + ], + [ + "dev/tests/integration/testsuite/Magento", + "dev/tests/integration/testsuite/Magento" + ], + [ + "dev/tests/integration/.gitignore", + "dev/tests/integration/.gitignore" + ], + [ + "dev/tests/functional/composer.json", + "dev/tests/functional/composer.json" + ], + [ + "dev/tests/functional/lib", + "dev/tests/functional/lib" + ], + [ + "dev/tests/functional/phpunit.xml.dist", + "dev/tests/functional/phpunit.xml.dist" + ], + [ + "dev/tests/functional/composer.json.dist", + "dev/tests/functional/composer.json.dist" + ], + [ + "dev/tests/functional/bootstrap.php", + "dev/tests/functional/bootstrap.php" + ], + [ + "dev/tests/functional/credentials.xml.dist", + "dev/tests/functional/credentials.xml.dist" + ], + [ + "dev/tests/functional/tests", + "dev/tests/functional/tests" + ], + [ + "dev/tests/functional/utils", + "dev/tests/functional/utils" + ], + [ + "dev/tests/functional/isolation.php", + "dev/tests/functional/isolation.php" + ], + [ + "dev/tests/functional/etc", + "dev/tests/functional/etc" + ], + [ + "dev/tests/functional/.htaccess", + "dev/tests/functional/.htaccess" + ], + [ + "dev/tests/functional/testsuites/Magento", + "dev/tests/functional/testsuites/Magento" + ], + [ + "dev/tests/functional/.gitignore", + "dev/tests/functional/.gitignore" + ], + [ + "dev/tests/js/run_js_tests.php", + "dev/tests/js/run_js_tests.php" + ], + [ + "dev/tests/js/jsTestDriverOrder.php", + "dev/tests/js/jsTestDriverOrder.php" + ], + [ + "dev/tests/js/jsTestDriver.php.dist", + "dev/tests/js/jsTestDriver.php.dist" + ], + [ + "dev/tests/js/spec", + "dev/tests/js/spec" + ], + [ + "dev/tests/js/framework", + "dev/tests/js/framework" + ], + [ + "dev/tests/js/testsuite/lib", + "dev/tests/js/testsuite/lib" + ], + [ + "dev/tests/js/testsuite/mage", + "dev/tests/js/testsuite/mage" + ], + [ + "dev/tests/js/.gitignore", + "dev/tests/js/.gitignore" + ], + [ + "dev/tests/api-functional/phpunit.xml.dist", + "dev/tests/api-functional/phpunit.xml.dist" + ], + [ + "dev/tests/api-functional/config", + "dev/tests/api-functional/config" + ], + [ + "dev/tests/api-functional/framework", + "dev/tests/api-functional/framework" + ], + [ + "dev/tests/api-functional/_files", + "dev/tests/api-functional/_files" + ], + [ + "dev/tests/api-functional/testsuite/Magento", + "dev/tests/api-functional/testsuite/Magento" + ], + [ + "dev/tests/api-functional/.gitignore", + "dev/tests/api-functional/.gitignore" + ], + [ + "dev/tests/unit/phpunit.xml.dist", + "dev/tests/unit/phpunit.xml.dist" + ], + [ + "dev/tests/unit/tmp", + "dev/tests/unit/tmp" + ], + [ + "dev/tests/unit/framework", + "dev/tests/unit/framework" + ], + [ + "dev/tests/unit/.gitignore", + "dev/tests/unit/.gitignore" + ], + [ + "dev/tests/static/phpunit-all.xml.dist", + "dev/tests/static/phpunit-all.xml.dist" + ], + [ + "dev/tests/static/phpunit.xml.dist", + "dev/tests/static/phpunit.xml.dist" + ], + [ + "dev/tests/static/framework", + "dev/tests/static/framework" + ], + [ + "dev/tests/static/testsuite/Magento", + "dev/tests/static/testsuite/Magento" + ], + [ + "dev/tests/static/.gitignore", + "dev/tests/static/.gitignore" + ], + [ + "dev/tests/performance/benchmark.jmx", + "dev/tests/performance/benchmark.jmx" + ], + [ + "dev/tests/performance/compare_reports.php", + "dev/tests/performance/compare_reports.php" + ], + [ + "dev/tests/performance/run_scenarios.php", + "dev/tests/performance/run_scenarios.php" + ], + [ + "dev/tests/performance/framework", + "dev/tests/performance/framework" + ], + [ + "dev/tests/performance/testsuite/backend.jmx", + "dev/tests/performance/testsuite/backend.jmx" + ], + [ + "dev/tests/performance/testsuite/product_edit.jmx", + "dev/tests/performance/testsuite/product_edit.jmx" + ], + [ + "dev/tests/performance/testsuite/add_to_cart.jmx", + "dev/tests/performance/testsuite/add_to_cart.jmx" + ], + [ + "dev/tests/performance/testsuite/product_view.jmx", + "dev/tests/performance/testsuite/product_view.jmx" + ], + [ + "dev/tests/performance/testsuite/home_page.jmx", + "dev/tests/performance/testsuite/home_page.jmx" + ], + [ + "dev/tests/performance/testsuite/reusable", + "dev/tests/performance/testsuite/reusable" + ], + [ + "dev/tests/performance/testsuite/quick_search.jmx", + "dev/tests/performance/testsuite/quick_search.jmx" + ], + [ + "dev/tests/performance/testsuite/fixtures", + "dev/tests/performance/testsuite/fixtures" + ], + [ + "dev/tests/performance/testsuite/advanced_search.jmx", + "dev/tests/performance/testsuite/advanced_search.jmx" + ], + [ + "dev/tests/performance/testsuite/checkout.jmx", + "dev/tests/performance/testsuite/checkout.jmx" + ], + [ + "dev/tests/performance/testsuite/category_view.jmx", + "dev/tests/performance/testsuite/category_view.jmx" + ], + [ + "dev/tests/performance/testsuite/_samples", + "dev/tests/performance/testsuite/_samples" + ], + [ + "dev/tests/performance/config.php.dist", + "dev/tests/performance/config.php.dist" + ], + [ + "dev/tests/performance/.gitignore", + "dev/tests/performance/.gitignore" + ], + [ + "dev/.htaccess", + "dev/.htaccess" + ], + [ + "Gruntfile.js", + "Gruntfile.js" + ], + [ + "setup", + "setup" + ], + [ + "LICENSE.txt", + "LICENSE.txt" + ], + [ + ".travis.yml", + ".travis.yml" + ], + [ + "app/bootstrap.php", + "app/bootstrap.php" + ], + [ + "app/etc/di.xml", + "app/etc/di.xml" + ], + [ + "app/.htaccess", + "app/.htaccess" + ], + [ + "app/functions.php", + "app/functions.php" + ], + [ + "app/autoload.php", + "app/autoload.php" + ], + [ + ".htaccess", + ".htaccess" + ], + [ + "php.ini.sample", + "php.ini.sample" + ], + [ + "CONTRIBUTOR_LICENSE_AGREEMENT.html", + "CONTRIBUTOR_LICENSE_AGREEMENT.html" + ], + [ + "index.php", + "index.php" + ], + [ + "LICENSE_AFL.txt", + "LICENSE_AFL.txt" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento 2 Base" + }, + { + "name": "magento/module-admin-notification", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-admin-notification-0.74.0-beta2.zip", + "reference": null, + "shasum": "740186bdf97b2161994c10a883211eae76b285e9" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/AdminNotification" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-authorization", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-authorization-0.74.0-beta2.zip", + "reference": null, + "shasum": "045f8440fe82b38ce228b0be52b011bb02773214" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Authorization" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Authorization module provides access to Magento ACL functionality." + }, + { + "name": "magento/module-backend", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-backend-0.74.0-beta2.zip", + "reference": null, + "shasum": "39ddbf62a11d9be1b16539733c0f66f46a503033" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backup": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-cron": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-developer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-reports": "0.74.0-beta2", + "magento/module-require-js": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-translation": "0.74.0-beta2", + "magento/module-user": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Backend" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-backup", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-backup-0.74.0-beta2.zip", + "reference": null, + "shasum": "7188d9a41bd9d4294dfd90c7053c301876d82c48" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-cron": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Backup" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-bundle", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-bundle-0.74.0-beta2.zip", + "reference": null, + "shasum": "849f7fc43f7f9b6a37a922272656c6218c681693" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-catalog-rule": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-gift-message": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-webapi": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Bundle" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-captcha", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-captcha-0.74.0-beta2.zip", + "reference": null, + "shasum": "a80050a22bad3399e146b242be33f6717fe15d26" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Captcha" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-0.74.0-beta2.zip", + "reference": null, + "shasum": "d4259a0113a3b8eece9bdf88ad24b5cdee349de0" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-catalog-rule": "0.74.0-beta2", + "magento/module-catalog-url-rewrite": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-indexer": "0.74.0-beta2", + "magento/module-log": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-msrp": "0.74.0-beta2", + "magento/module-page-cache": "0.74.0-beta2", + "magento/module-product-alert": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-url-rewrite": "0.74.0-beta2", + "magento/module-widget": "0.74.0-beta2", + "magento/module-wishlist": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-cookie": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Catalog" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-import-export", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-import-export-0.74.0-beta2.zip", + "reference": null, + "shasum": "3a26206abf71888d300c9d72b2190ff0f66eafd2" + }, + "require": { + "ext-ctype": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-import-export": "0.74.0-beta2", + "magento/module-indexer": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-inventory", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-inventory-0.74.0-beta2.zip", + "reference": null, + "shasum": "805c2bb2fb2c2f038dd73e4030a02e1208ea23da" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-indexer": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogInventory" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-rule", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-rule-0.74.0-beta2.zip", + "reference": null, + "shasum": "e9fe8b0f65dea1f8feba125e7d2974d48d1e0eef" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-import-export": "0.74.0-beta2", + "magento/module-indexer": "0.74.0-beta2", + "magento/module-rule": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogRule" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-search", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-search-0.74.0-beta2.zip", + "reference": null, + "shasum": "e8239e3dbbdccda266347d1ca5f286c1e9a2cb4b" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-indexer": "0.74.0-beta2", + "magento/module-search": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogSearch" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-url-rewrite", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-url-rewrite-0.74.0-beta2.zip", + "reference": null, + "shasum": "c3cc582396cc97970e2d0dd92e5315190cde0971" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-import-export": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-import-export": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-url-rewrite": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogUrlRewrite" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-widget", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-catalog-widget-0.74.0-beta2.zip", + "reference": null, + "shasum": "7dad3ad909bc97610211f4f008fa1817f1aac22a" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-rule": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-widget": "0.74.0-beta2", + "magento/module-wishlist": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CatalogWidget" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-centinel", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-centinel-0.74.0-beta2.zip", + "reference": null, + "shasum": "069e94cd124c0d078eeb3174afdc1e49031a7288" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Centinel" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-checkout", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-checkout-0.74.0-beta2.zip", + "reference": null, + "shasum": "8161dcc6c2bba44981cb63cd24cf137900d37db7" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-gift-message": "0.74.0-beta2", + "magento/module-msrp": "0.74.0-beta2", + "magento/module-page-cache": "0.74.0-beta2", + "magento/module-payment": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-ui": "0.74.0-beta2", + "magento/module-wishlist": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-cookie": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Checkout" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-checkout-agreements", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-checkout-agreements-0.74.0-beta2.zip", + "reference": null, + "shasum": "be00ed9e3c1e3e4bacf7efc00b67c7cbb2065715" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CheckoutAgreements" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cms", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cms-0.74.0-beta2.zip", + "reference": null, + "shasum": "15ae95a27b5ff0c82fbdb43ca8570e0cee4b21f5" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-email": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-ui": "0.74.0-beta2", + "magento/module-variable": "0.74.0-beta2", + "magento/module-widget": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Cms" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cms-url-rewrite", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cms-url-rewrite-0.74.0-beta2.zip", + "reference": null, + "shasum": "6a3775d7705efcf5b43bfbe327d6ef1db2a1c09c" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-cms": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-url-rewrite": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CmsUrlRewrite" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-config", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-config-0.74.0-beta2.zip", + "reference": null, + "shasum": "a4be4800b197ab3a73bbfc0d23d5a1f753a07a57" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-cron": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-email": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Config" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-configurable-import-export", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-configurable-import-export-0.74.0-beta2.zip", + "reference": null, + "shasum": "bb6d242228bcbe7c35253dc244c7977994b24b8e" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-import-export": "0.74.0-beta2", + "magento/module-configurable-product": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-import-export": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/ConfigurableImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-configurable-product", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-configurable-product-0.74.0-beta2.zip", + "reference": null, + "shasum": "fe8e4536a59f60be79211fc0072e640102d3be06" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-catalog-rule": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-webapi": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/ConfigurableProduct" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-contact", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-contact-0.74.0-beta2.zip", + "reference": null, + "shasum": "b53d65b91dd1f596d0a4f7b8bacf73e6eaff98c9" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-cms": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Contact" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cookie", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cookie-0.74.0-beta2.zip", + "reference": null, + "shasum": "a8a4e29967524214fb6af5c12681d7b410a63bc6" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-store": "0.74.0-beta2", + "php": "~5.4.11|~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-backend": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Cookie" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cron", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-cron-0.74.0-beta2.zip", + "reference": null, + "shasum": "0e91ec4ade457797e7db0fe1aa4794747817fa6a" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-config": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Cron" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-currency-symbol", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-currency-symbol-0.74.0-beta2.zip", + "reference": null, + "shasum": "261c0a4e05295f852a7986ef2d15509e4c2ad26c" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-page-cache": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CurrencySymbol" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-customer-0.74.0-beta2.zip", + "reference": null, + "shasum": "135623f9517f12f4dc17e062280eaf5f5071e7b7" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta2", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-integration": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-newsletter": "0.74.0-beta2", + "magento/module-page-cache": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-review": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-ui": "0.74.0-beta2", + "magento/module-wishlist": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-cookie": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Customer" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer-import-export", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-customer-import-export-0.74.0-beta2.zip", + "reference": null, + "shasum": "9b4f6b059fecce79c7f8ce9fc163858b8a47c7ca" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-import-export": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/CustomerImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-design-editor", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-design-editor-0.74.0-beta2.zip", + "reference": null, + "shasum": "c506ce273b4578b949346ee4cdb4481ebdf1e3dc" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-translation": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/DesignEditor" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-developer", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-developer-0.74.0-beta2.zip", + "reference": null, + "shasum": "1a1077d963ec6310df7080defaadc9bd87ed6e21" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Developer" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-dhl", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-dhl-0.74.0-beta2.zip", + "reference": null, + "shasum": "f525d0b48189b60e2c0def9a8804933133995104" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-shipping": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Dhl" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-directory", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-directory-0.74.0-beta2.zip", + "reference": null, + "shasum": "3cb3ed72d237966f9deab3ac0386c3b6701cf66e" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Directory" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-downloadable", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-downloadable-0.74.0-beta2.zip", + "reference": null, + "shasum": "5bd1cabf95a5c44e329f1263f40e165b3aa6070e" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-gift-message": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-msrp": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-wishlist": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Downloadable" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-eav", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-eav-0.74.0-beta2.zip", + "reference": null, + "shasum": "5594f375105dc1921f38772fbb069ff57c2e8f01" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Eav" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-email", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-email-0.74.0-beta2.zip", + "reference": null, + "shasum": "8ff7affa3d22107bd5e519dc24c098acccc44bf8" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-variable": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Email" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-fedex", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-fedex-0.74.0-beta2.zip", + "reference": null, + "shasum": "cdc61b901b080b14e42b10889c8fb6f639f520af" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-shipping": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Fedex" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-gift-message", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-gift-message-0.74.0-beta2.zip", + "reference": null, + "shasum": "76ea03167970205295c95d88f871f7ce0547cdbf" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-multishipping": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GiftMessage" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-adwords", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-google-adwords-0.74.0-beta2.zip", + "reference": null, + "shasum": "45dfa690b1f183b0a87e6db39e6399ff0024bc66" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GoogleAdwords" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-analytics", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-google-analytics-0.74.0-beta2.zip", + "reference": null, + "shasum": "7460860110d6942c3375db4a05cf079134e8ab6a" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-cookie": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GoogleAnalytics" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-optimizer", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-google-optimizer-0.74.0-beta2.zip", + "reference": null, + "shasum": "90565d6ecc18276ef08c324caae5178ca8ba82ed" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-google-analytics": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GoogleOptimizer" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-shopping", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-google-shopping-0.74.0-beta2.zip", + "reference": null, + "shasum": "f86c5696c215900805df27dcc6f8d6df5bd8453a" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GoogleShopping" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-grouped-import-export", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-grouped-import-export-0.74.0-beta2.zip", + "reference": null, + "shasum": "3cbf803098dd03d361b51f730930c9c3e6a9292c" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-import-export": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-grouped-product": "0.74.0-beta2", + "magento/module-import-export": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GroupedImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-grouped-product", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-grouped-product-0.74.0-beta2.zip", + "reference": null, + "shasum": "8ad968c974e321d99a9bccfd04721ccfb4bfb86f" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-msrp": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/GroupedProduct" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-import-export", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-import-export-0.74.0-beta2.zip", + "reference": null, + "shasum": "c16b13bdf9efb2a9d52b6423ee641ca47d60da36" + }, + "require": { + "ext-ctype": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-indexer": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/ImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-indexer", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-indexer-0.74.0-beta2.zip", + "reference": null, + "shasum": "d1c6e17c92d766f8f3f578d290da957deb5d9a7c" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-page-cache": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Indexer" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-integration", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-integration-0.74.0-beta2.zip", + "reference": null, + "shasum": "8e9a7d4df606513a67a649f63abdd31557061665" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta2", + "magento/module-backend": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-user": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Integration" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-layered-navigation", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-layered-navigation-0.74.0-beta2.zip", + "reference": null, + "shasum": "a20af59f1ffcf9565e2fab9ead134ee129bdcc8d" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/LayeredNavigation" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-log", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-log-0.74.0-beta2.zip", + "reference": null, + "shasum": "108169619b608577c34411d7ba717298ba40d641" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Log" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-media-storage", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-media-storage-0.74.0-beta2.zip", + "reference": null, + "shasum": "7c1b9232bf83b123c2a3c6b03973bd637f34e0f6" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/MediaStorage" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-msrp", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-msrp-0.74.0-beta2.zip", + "reference": null, + "shasum": "16bda583d7a876262fdc740c9513a4fb1739c3eb" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-bundle": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-downloadable": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-grouped-product": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Msrp" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-multishipping", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-multishipping-0.74.0-beta2.zip", + "reference": null, + "shasum": "53b01c1acc039dec9e603681264a450f708d5fb6" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-payment": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Multishipping" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-newsletter", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-newsletter-0.74.0-beta2.zip", + "reference": null, + "shasum": "a9e11c0ab106ea0aec8709a5a17169be826680c3" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-cron": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-email": "0.74.0-beta2", + "magento/module-require-js": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-widget": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Newsletter" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-offline-payments", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-offline-payments-0.74.0-beta2.zip", + "reference": null, + "shasum": "d3b7cd008994bef7456496094f397c82a9f3a8ef" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-payment": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/OfflinePayments" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-offline-shipping", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-offline-shipping-0.74.0-beta2.zip", + "reference": null, + "shasum": "94f097652ea87bc0504837366a51b7065ca864d4" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-sales-rule": "0.74.0-beta2", + "magento/module-shipping": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/OfflineShipping" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-page-cache", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-page-cache-0.74.0-beta2.zip", + "reference": null, + "shasum": "9db7b9c8d035e0eb3f619d37c8ff439b9f225e8f" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/PageCache" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-payment", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-payment-0.74.0-beta2.zip", + "reference": null, + "shasum": "9da0894c984887cf2e3c6c5a32f84616867495ae" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-centinel": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Payment" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-persistent", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-persistent-0.74.0-beta2.zip", + "reference": null, + "shasum": "891f5f3f5c23dd19e2f815754f4c5e8b4da6af1c" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-cron": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-page-cache": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Persistent" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-product-alert", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-product-alert-0.74.0-beta2.zip", + "reference": null, + "shasum": "43292b34d4078dddc73b7bb4bcdb889292b578a6" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/ProductAlert" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-quote", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-quote-0.74.0-beta2.zip", + "reference": null, + "shasum": "8c3033317c359e5fc20e9308ed796ae6760fa22f" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta2", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-catalog-rule": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-payment": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Quote" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-reports", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-reports-0.74.0-beta2.zip", + "reference": null, + "shasum": "38b1c0ddfbd756666cb0bc05e687d01ced515464" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-downloadable": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-log": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-review": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-sales-rule": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "magento/module-widget": "0.74.0-beta2", + "magento/module-wishlist": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Reports" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-require-js", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-require-js-0.74.0-beta2.zip", + "reference": null, + "shasum": "6e94b63070fd1c174ab55c109d384d5b3bb04131" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/RequireJs" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-review", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-review-0.74.0-beta2.zip", + "reference": null, + "shasum": "45385eac2767e9165bfd88bcbc6a69dccca29f38" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-newsletter": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-ui": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-cookie": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Review" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-rss", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-rss-0.74.0-beta2.zip", + "reference": null, + "shasum": "0706c2102a0003e2f214c35b77c1e628519b727a" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Rss" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-rule", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-rule-0.74.0-beta2.zip", + "reference": null, + "shasum": "762edf4eabfe082b589b09bcf47a3ef2ac8a7f35" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Rule" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sales-0.74.0-beta2.zip", + "reference": null, + "shasum": "bf591f1f3033aa2fd3fe8bfb2732a6e7b81a499c" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta2", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-email": "0.74.0-beta2", + "magento/module-gift-message": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-payment": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-reports": "0.74.0-beta2", + "magento/module-sales-rule": "0.74.0-beta2", + "magento/module-shipping": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-ui": "0.74.0-beta2", + "magento/module-widget": "0.74.0-beta2", + "magento/module-wishlist": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Sales" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-rule", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sales-rule-0.74.0-beta2.zip", + "reference": null, + "shasum": "fdb556db9915f50b0bbbc3fd5f004c21fdf144ac" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-rule": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-payment": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-reports": "0.74.0-beta2", + "magento/module-rule": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-shipping": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-widget": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/SalesRule" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-search", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-search-0.74.0-beta2.zip", + "reference": null, + "shasum": "a9605f79153be5e6206e269161ec6b0fe27b4b1a" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog-search": "0.74.0-beta2", + "magento/module-reports": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Search" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sendfriend", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sendfriend-0.74.0-beta2.zip", + "reference": null, + "shasum": "3830393608a4c34ef05eb26de6543ffe3739e1f4" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Sendfriend" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-shipping", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-shipping-0.74.0-beta2.zip", + "reference": null, + "shasum": "0793baf12096494d141c3e6419f53a9c57aef0df" + }, + "require": { + "ext-gd": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-contact": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-payment": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-fedex": "0.74.0-beta2", + "magento/module-ups": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Shipping" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sitemap", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-sitemap-0.74.0-beta2.zip", + "reference": null, + "shasum": "55e734ce8228a6e0b39eccb1829ae617845f9e53" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-url-rewrite": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Sitemap" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-store", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-store-0.74.0-beta2.zip", + "reference": null, + "shasum": "b53f0f39a5eceb85e0b28bcf32d5bb68314b3027" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-config": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-ui": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Store" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-tax", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-tax-0.74.0-beta2.zip", + "reference": null, + "shasum": "ed22d2db556957de4ab5406d4d0edce811855b9b" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-reports": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-shipping": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Tax" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-tax-import-export", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-tax-import-export-0.74.0-beta2.zip", + "reference": null, + "shasum": "90716decbf4c0eb8fb29523530471fc2f8fbb426" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/TaxImportExport" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-theme", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-theme-0.74.0-beta2.zip", + "reference": null, + "shasum": "4754e71f25664ca7d010351e63c8c017e3c649dd" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-media-storage": "0.74.0-beta2", + "magento/module-require-js": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-widget": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-translation": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Theme" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-translation", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-translation-0.74.0-beta2.zip", + "reference": null, + "shasum": "68e633ff0380bb3d9660c17149935a0cdeda4edb" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-developer": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Translation" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-ui", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-ui-0.74.0-beta2.zip", + "reference": null, + "shasum": "6edb28f5c771ccb9e747ea71922ecbea80a32391" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Ui" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-ups", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-ups-0.74.0-beta2.zip", + "reference": null, + "shasum": "70a8139468124067bfb07bf1c071638484136883" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-shipping": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Ups" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-url-rewrite", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-url-rewrite-0.74.0-beta2.zip", + "reference": null, + "shasum": "8e781525600ff9d43383816283807ebcff07a8bf" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-url-rewrite": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-cms-url-rewrite": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/UrlRewrite" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-user", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-user-0.74.0-beta2.zip", + "reference": null, + "shasum": "023375251bc6104b31984e4509d01907f6661c6b" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta2", + "magento/module-backend": "0.74.0-beta2", + "magento/module-integration": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/User" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-usps", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-usps-0.74.0-beta2.zip", + "reference": null, + "shasum": "22eecac7075ca9c6ecaa08e482b59f5c29ba465c" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-config": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-shipping": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Usps" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-variable", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-variable-0.74.0-beta2.zip", + "reference": null, + "shasum": "73cb1fdc0ff84722f854736a4016e3f5fa331ec1" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-email": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.4.11|~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Variable" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-version", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-version-0.74.0-beta2.zip", + "reference": null, + "shasum": "de77cb875f16d6eec9c785df117eddf469bec459" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Version" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-webapi", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-webapi-0.74.0-beta2.zip", + "reference": null, + "shasum": "c189f264c1bb186e052a2ed375b4b9e00295f3a6" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "0.74.0-beta2", + "magento/module-backend": "0.74.0-beta2", + "magento/module-integration": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-user": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Webapi" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-weee", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-weee-0.74.0-beta2.zip", + "reference": null, + "shasum": "cc524f7211673263beb1f4c6b96bf32ffa04527b" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-directory": "0.74.0-beta2", + "magento/module-eav": "0.74.0-beta2", + "magento/module-quote": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-tax": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Weee" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-widget", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-widget-0.74.0-beta2.zip", + "reference": null, + "shasum": "f23668007563d5b7f9122e3eb453359fab9d1249" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-cms": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-variable": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Widget" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-wishlist", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_module-wishlist-0.74.0-beta2.zip", + "reference": null, + "shasum": "fca56783501ad2b8f2c583350cb038f8191634e1" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/module-backend": "0.74.0-beta2", + "magento/module-catalog": "0.74.0-beta2", + "magento/module-catalog-inventory": "0.74.0-beta2", + "magento/module-checkout": "0.74.0-beta2", + "magento/module-customer": "0.74.0-beta2", + "magento/module-grouped-product": "0.74.0-beta2", + "magento/module-rss": "0.74.0-beta2", + "magento/module-sales": "0.74.0-beta2", + "magento/module-store": "0.74.0-beta2", + "magento/module-theme": "0.74.0-beta2", + "magento/module-ui": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "suggest": { + "magento/module-bundle": "0.74.0-beta2", + "magento/module-configurable-product": "0.74.0-beta2", + "magento/module-cookie": "0.74.0-beta2", + "magento/module-downloadable": "0.74.0-beta2" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/Wishlist" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/product-community-edition", + "version": "0.74.0-beta2", + "source": { + "type": "git", + "url": "https://github.com/magento/magento2-community-edition.git", + "reference": "830bba759a180a97375275013b974c4606805466" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento2-community-edition/zipball/830bba759a180a97375275013b974c4606805466", + "reference": "830bba759a180a97375275013b974c4606805466", + "shasum": "" + }, + "require": { + "composer/composer": "1.0.0-alpha8", + "magento/framework": "self.version", + "magento/language-de_de": "self.version", + "magento/language-en_us": "self.version", + "magento/language-es_es": "self.version", + "magento/language-fr_fr": "self.version", + "magento/language-nl_nl": "self.version", + "magento/language-pt_br": "self.version", + "magento/language-zh_cn": "self.version", + "magento/magento-composer-installer": "*", + "magento/magento2-base": "self.version", + "magento/module-admin-notification": "self.version", + "magento/module-authorization": "self.version", + "magento/module-backend": "self.version", + "magento/module-backup": "self.version", + "magento/module-bundle": "self.version", + "magento/module-captcha": "self.version", + "magento/module-catalog": "self.version", + "magento/module-catalog-import-export": "self.version", + "magento/module-catalog-inventory": "self.version", + "magento/module-catalog-rule": "self.version", + "magento/module-catalog-search": "self.version", + "magento/module-catalog-url-rewrite": "self.version", + "magento/module-catalog-widget": "self.version", + "magento/module-centinel": "self.version", + "magento/module-checkout": "self.version", + "magento/module-checkout-agreements": "self.version", + "magento/module-cms": "self.version", + "magento/module-cms-url-rewrite": "self.version", + "magento/module-config": "self.version", + "magento/module-configurable-import-export": "self.version", + "magento/module-configurable-product": "self.version", + "magento/module-contact": "self.version", + "magento/module-cookie": "self.version", + "magento/module-cron": "self.version", + "magento/module-currency-symbol": "self.version", + "magento/module-customer": "self.version", + "magento/module-customer-import-export": "self.version", + "magento/module-design-editor": "self.version", + "magento/module-developer": "self.version", + "magento/module-dhl": "self.version", + "magento/module-directory": "self.version", + "magento/module-downloadable": "self.version", + "magento/module-eav": "self.version", + "magento/module-email": "self.version", + "magento/module-fedex": "self.version", + "magento/module-gift-message": "self.version", + "magento/module-google-adwords": "self.version", + "magento/module-google-analytics": "self.version", + "magento/module-google-optimizer": "self.version", + "magento/module-google-shopping": "self.version", + "magento/module-grouped-import-export": "self.version", + "magento/module-grouped-product": "self.version", + "magento/module-import-export": "self.version", + "magento/module-indexer": "self.version", + "magento/module-integration": "self.version", + "magento/module-layered-navigation": "self.version", + "magento/module-log": "self.version", + "magento/module-media-storage": "self.version", + "magento/module-msrp": "self.version", + "magento/module-multishipping": "self.version", + "magento/module-newsletter": "self.version", + "magento/module-offline-payments": "self.version", + "magento/module-offline-shipping": "self.version", + "magento/module-page-cache": "self.version", + "magento/module-payment": "self.version", + "magento/module-persistent": "self.version", + "magento/module-product-alert": "self.version", + "magento/module-quote": "self.version", + "magento/module-reports": "self.version", + "magento/module-require-js": "self.version", + "magento/module-review": "self.version", + "magento/module-rss": "self.version", + "magento/module-rule": "self.version", + "magento/module-sales": "self.version", + "magento/module-sales-rule": "self.version", + "magento/module-search": "self.version", + "magento/module-sendfriend": "self.version", + "magento/module-shipping": "self.version", + "magento/module-sitemap": "self.version", + "magento/module-store": "self.version", + "magento/module-tax": "self.version", + "magento/module-tax-import-export": "self.version", + "magento/module-theme": "self.version", + "magento/module-translation": "self.version", + "magento/module-ui": "self.version", + "magento/module-ups": "self.version", + "magento/module-url-rewrite": "self.version", + "magento/module-user": "self.version", + "magento/module-usps": "self.version", + "magento/module-variable": "self.version", + "magento/module-version": "self.version", + "magento/module-webapi": "self.version", + "magento/module-weee": "self.version", + "magento/module-widget": "self.version", + "magento/module-wishlist": "self.version", + "magento/theme-adminhtml-backend": "self.version", + "magento/theme-frontend-blank": "self.version", + "magento/theme-frontend-luma": "self.version", + "magento/zendframework1": "1.12.10", + "monolog/monolog": "1.11.0", + "oyejorge/less.php": "1.7.0.3", + "php": "~5.5.0|~5.6.0", + "tubalmartin/cssmin": "2.4.8-p4", + "zendframework/zend-code": "2.3.1", + "zendframework/zend-config": "2.3.1", + "zendframework/zend-console": "2.3.1", + "zendframework/zend-di": "2.3.1", + "zendframework/zend-eventmanager": "2.3.1", + "zendframework/zend-form": "2.3.1", + "zendframework/zend-http": "2.3.1", + "zendframework/zend-json": "2.3.1", + "zendframework/zend-log": "2.3.1", + "zendframework/zend-modulemanager": "2.3.1", + "zendframework/zend-mvc": "2.3.1", + "zendframework/zend-serializer": "2.3.1", + "zendframework/zend-server": "2.3.1", + "zendframework/zend-servicemanager": "2.3.1", + "zendframework/zend-soap": "2.3.1", + "zendframework/zend-stdlib": "2.3.1", + "zendframework/zend-text": "2.3.1", + "zendframework/zend-uri": "2.3.1", + "zendframework/zend-validator": "2.3.1", + "zendframework/zend-view": "2.3.1" + }, + "require-dev": { + "ext-ctype": "*", + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-hash": "*", + "ext-iconv": "*", + "ext-intl": "*", + "ext-mcrypt": "*", + "ext-simplexml": "*", + "ext-spl": "*", + "fabpot/php-cs-fixer": "~1.2", + "lib-libxml": "*", + "lusitanian/oauth": "~0.3", + "pdepend/pdepend": "2.0.6", + "phpmd/phpmd": "@stable", + "phpunit/phpunit": "4.1.0", + "sjparkinson/static-review": "~4.1", + "squizlabs/php_codesniffer": "1.5.3" + }, + "type": "project", + "autoload": { + "psr-4": { + "Magento\\Framework\\": "lib/internal/Magento/Framework/", + "Magento\\Setup\\": "setup/src/Magento/Setup/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "eCommerce Platform for Growth (Community Edition)", + "time": "2015-03-27 15:47:02" + }, + { + "name": "magento/sample-module-minimal", + "version": "1.0.0", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_sample-module-minimal-1.0.0.zip", + "reference": null, + "shasum": "8c8bd3ee4907a6a91bffeac177628bd4f238d6e4" + }, + "require": { + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-module", + "extra": { + "map": [ + [ + "*", + "Magento/SampleMinimal" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "A minimal skeleton Magento 2 module" + }, + { + "name": "magento/theme-adminhtml-backend", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_theme-adminhtml-backend-0.74.0-beta2.zip", + "reference": null, + "shasum": "d8bd8d6b70d65d6f38751f7e9f9cbbebf751c97c" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-theme", + "extra": { + "map": [ + [ + "*", + "adminhtml/Magento/backend" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/theme-frontend-blank", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_theme-frontend-blank-0.74.0-beta2.zip", + "reference": null, + "shasum": "e298ae05894e97ba3d94a87b77086dfe0c2d974a" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-theme", + "extra": { + "map": [ + [ + "*", + "frontend/Magento/blank" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/theme-frontend-luma", + "version": "0.74.0-beta2", + "dist": { + "type": "zip", + "url": "https://packages.magento.com/_packages/magento_theme-frontend-luma-0.74.0-beta2.zip", + "reference": null, + "shasum": "82e29e8fd8d928c33f064fb431d06f3968f37327" + }, + "require": { + "magento/framework": "0.74.0-beta2", + "magento/magento-composer-installer": "*", + "magento/theme-frontend-blank": "0.74.0-beta2", + "php": "~5.5.0|~5.6.0" + }, + "type": "magento2-theme", + "extra": { + "map": [ + [ + "*", + "frontend/Magento/luma" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/zendframework1", + "version": "1.12.10", + "source": { + "type": "git", + "url": "https://github.com/magento/zf1.git", + "reference": "d1e5cd8c9f83229bcdd9bb485c3ce25259c77884" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/zf1/zipball/d1e5cd8c9f83229bcdd9bb485c3ce25259c77884", + "reference": "d1e5cd8c9f83229bcdd9bb485c3ce25259c77884", + "shasum": "" + }, + "require": { + "php": ">=5.2.11" + }, + "require-dev": { + "phpunit/dbunit": "1.3.*", + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "library/" + ], + "license": [ + "BSD-3-Clause" + ], + "description": "Magento Zend Framework 1", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "framework" + ], + "time": "2015-02-06 17:25:45" + }, + { + "name": "monolog/monolog", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "ec3961874c43840e96da3a8a1ed20d8c73d7e5aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/ec3961874c43840e96da3a8a1ed20d8c73d7e5aa", + "reference": "ec3961874c43840e96da3a8a1ed20d8c73d7e5aa", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "~2.4, >2.4.8", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "phpunit/phpunit": "~3.7.0", + "raven/raven": "~0.5", + "ruflin/elastica": "0.90.*", + "videlalvaro/php-amqplib": "~2.4" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "raven/raven": "Allow sending log messages to a Sentry server", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2014-09-30 13:30:58" + }, + { + "name": "oyejorge/less.php", + "version": "v1.7.0.3", + "source": { + "type": "git", + "url": "https://github.com/oyejorge/less.php.git", + "reference": "6e08ecb07e6f6d9170c23e8744c58fdd822ad0de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oyejorge/less.php/zipball/6e08ecb07e6f6d9170c23e8744c58fdd822ad0de", + "reference": "6e08ecb07e6f6d9170c23e8744c58fdd822ad0de", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "bin": [ + "bin/lessc" + ], + "type": "library", + "autoload": { + "psr-0": { + "Less": "lib/" + }, + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Matt Agar", + "homepage": "https://github.com/agar" + }, + { + "name": "Martin JantoÅ¡oviÄ", + "homepage": "https://github.com/Mordred" + }, + { + "name": "Josh Schmidt", + "homepage": "https://github.com/oyejorge" + } + ], + "description": "PHP port of the Javascript version of LESS http://lesscss.org", + "homepage": "http://lessphp.gpeasy.com", + "keywords": [ + "css", + "less", + "less.js", + "lesscss", + "php", + "stylesheet" + ], + "time": "2015-03-10 18:12:59" + }, + { + "name": "psr/log", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "bf2c13de4300e227d7b2fd08027673a79c519987" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/bf2c13de4300e227d7b2fd08027673a79c519987", + "reference": "bf2c13de4300e227d7b2fd08027673a79c519987", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2015-03-26 14:39:45" + }, + { + "name": "seld/jsonlint", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "863ae85c6d3ef60ca49cb12bd051c4a0648c40c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/863ae85c6d3ef60ca49cb12bd051c4a0648c40c4", + "reference": "863ae85c6d3ef60ca49cb12bd051c4a0648c40c4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "time": "2015-01-04 21:18:15" + }, + { + "name": "symfony/console", + "version": "2.8.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "7e857a2b52b5833ed27d78a6b1b846bd440ee8bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/7e857a2b52b5833ed27d78a6b1b846bd440ee8bd", + "reference": "7e857a2b52b5833ed27d78a6b1b846bd440ee8bd", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1|~3.0.0", + "symfony/phpunit-bridge": "~2.7|~3.0.0", + "symfony/process": "~2.1|~3.0.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2015-05-15 14:11:12" + }, + { + "name": "symfony/finder", + "version": "2.8.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "fd26bdbb67bc8753884eff5767a4f1ee90e2284b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/fd26bdbb67bc8753884eff5767a4f1ee90e2284b", + "reference": "fd26bdbb67bc8753884eff5767a4f1ee90e2284b", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7|~3.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2015-05-15 14:11:12" + }, + { + "name": "symfony/process", + "version": "2.8.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "daf96f1491cf0b8d8de60e6d3b5fda8e502b3798" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/daf96f1491cf0b8d8de60e6d3b5fda8e502b3798", + "reference": "daf96f1491cf0b8d8de60e6d3b5fda8e502b3798", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7|~3.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2015-05-15 14:11:12" + }, + { + "name": "tubalmartin/cssmin", + "version": "v2.4.8-p4", + "source": { + "type": "git", + "url": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port.git", + "reference": "fe84d71e8420243544c0ce3bd0f5d7c1936b0f90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tubalmartin/YUI-CSS-compressor-PHP-port/zipball/fe84d71e8420243544c0ce3bd0f5d7c1936b0f90", + "reference": "fe84d71e8420243544c0ce3bd0f5d7c1936b0f90", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "cssmin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Túbal MartÃn", + "homepage": "http://tubalmartin.me/" + } + ], + "description": "A PHP port of the YUI CSS compressor", + "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port", + "keywords": [ + "compress", + "compressor", + "css", + "minify", + "yui" + ], + "time": "2014-09-22 08:08:50" + }, + { + "name": "zendframework/zend-code", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-code.git", + "reference": "a64e90c9ee8c939335ee7e21e39e3342c0e54526" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/a64e90c9ee8c939335ee7e21e39e3342c0e54526", + "reference": "a64e90c9ee8c939335ee7e21e39e3342c0e54526", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version" + }, + "require-dev": { + "doctrine/common": ">=2.1", + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-stdlib": "self.version" + }, + "suggest": { + "doctrine/common": "Doctrine\\Common >=2.1 for annotation features", + "zendframework/zend-stdlib": "Zend\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides facilities to generate arbitrary code using an object oriented interface", + "homepage": "https://github.com/zendframework/zend-code", + "keywords": [ + "code", + "zf2" + ], + "time": "2014-04-15 14:47:18" + }, + { + "name": "zendframework/zend-config", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-config.git", + "reference": "698c139707380b29fd09791ec1c21b837e9a3f15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-config/zipball/698c139707380b29fd09791ec1c21b837e9a3f15", + "reference": "698c139707380b29fd09791ec1c21b837e9a3f15", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json to use the Json reader or writer classes", + "zendframework/zend-servicemanager": "Zend\\ServiceManager for use with the Config Factory to retrieve reader and writer instances" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a nested object property based user interface for accessing this configuration data within application code", + "homepage": "https://github.com/zendframework/zend-config", + "keywords": [ + "config", + "zf2" + ], + "time": "2014-04-15 13:59:53" + }, + { + "name": "zendframework/zend-console", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-console.git", + "reference": "4253efd75a022d97ef326eac38a06c8eebb48a37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-console/zipball/4253efd75a022d97ef326eac38a06c8eebb48a37", + "reference": "4253efd75a022d97ef326eac38a06c8eebb48a37", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "suggest": { + "zendframework/zend-filter": "To support DefaultRouteMatcher usage", + "zendframework/zend-validator": "To support DefaultRouteMatcher usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Console\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-console", + "keywords": [ + "console", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-di", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-di.git", + "reference": "7502db10f8023bfd4e860ce83c9cdeda0db42c31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-di/zipball/7502db10f8023bfd4e860ce83c9cdeda0db42c31", + "reference": "7502db10f8023bfd4e860ce83c9cdeda0db42c31", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-code": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Di\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-di", + "keywords": [ + "di", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-escaper", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-escaper.git", + "reference": "2b2fcb6141cc2a2c6cc0c596e82771c72ef4ddc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/2b2fcb6141cc2a2c6cc0c596e82771c72ef4ddc1", + "reference": "2b2fcb6141cc2a2c6cc0c596e82771c72ef4ddc1", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Escaper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-escaper", + "keywords": [ + "escaper", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "ec158e89d0290f988a29ccd6bf179b561efbb702" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/ec158e89d0290f988a29ccd6bf179b561efbb702", + "reference": "ec158e89d0290f988a29ccd6bf179b561efbb702", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-event-manager", + "keywords": [ + "eventmanager", + "zf2" + ], + "time": "2014-04-15 13:59:53" + }, + { + "name": "zendframework/zend-filter", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-filter.git", + "reference": "307fe694659e08ffd710c70e4db8bc60187bcc84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/307fe694659e08ffd710c70e4db8bc60187bcc84", + "reference": "307fe694659e08ffd710c70e4db8bc60187bcc84", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-crypt": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-crypt": "Zend\\Crypt component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-uri": "Zend\\Uri component for UriNormalize filter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Filter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed data filters", + "homepage": "https://github.com/zendframework/zend-filter", + "keywords": [ + "filter", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-form", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-form.git", + "reference": "d7a1f5bc4626b1df990391502a868b28c37ba65d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-form/zipball/d7a1f5bc4626b1df990391502a868b28c37ba65d", + "reference": "d7a1f5bc4626b1df990391502a868b28c37ba65d", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-inputfilter": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-captcha": "self.version", + "zendframework/zend-code": "self.version", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-validator": "self.version", + "zendframework/zend-view": "self.version", + "zendframework/zendservice-recaptcha": "*" + }, + "suggest": { + "zendframework/zend-captcha": "Zend\\Captcha component", + "zendframework/zend-code": "Zend\\Code component", + "zendframework/zend-eventmanager": "Zend\\EventManager component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-validator": "Zend\\Validator component", + "zendframework/zend-view": "Zend\\View component", + "zendframework/zendservice-recaptcha": "ZendService\\ReCaptcha component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Form\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-form", + "keywords": [ + "form", + "zf2" + ], + "time": "2014-04-15 14:36:41" + }, + { + "name": "zendframework/zend-http", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-http.git", + "reference": "869ce7bdf60727e14d85c305d2948fbe831c3534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-http/zipball/869ce7bdf60727e14d85c305d2948fbe831c3534", + "reference": "869ce7bdf60727e14d85c305d2948fbe831c3534", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-loader": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-uri": "self.version", + "zendframework/zend-validator": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Http\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", + "homepage": "https://github.com/zendframework/zend-http", + "keywords": [ + "http", + "zf2" + ], + "time": "2014-04-15 13:59:53" + }, + { + "name": "zendframework/zend-inputfilter", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-inputfilter.git", + "reference": "abca740015a856d03542f5b6c535b8874f84b622" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/abca740015a856d03542f5b6c535b8874f84b622", + "reference": "abca740015a856d03542f5b6c535b8874f84b622", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-filter": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-validator": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "To support plugin manager support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\InputFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-input-filter", + "keywords": [ + "inputfilter", + "zf2" + ], + "time": "2014-04-15 13:59:53" + }, + { + "name": "zendframework/zend-json", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-json.git", + "reference": "5284687fc3aeab27961d2e17ada08973ae6daafe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-json/zipball/5284687fc3aeab27961d2e17ada08973ae6daafe", + "reference": "5284687fc3aeab27961d2e17ada08973ae6daafe", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-http": "self.version", + "zendframework/zend-server": "self.version" + }, + "suggest": { + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-server": "Zend\\Server component", + "zendframework/zendxml": "To support Zend\\Json\\Json::fromXml() usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Json\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", + "homepage": "https://github.com/zendframework/zend-json", + "keywords": [ + "json", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-loader", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-loader.git", + "reference": "5e0bd7e28c644078685f525cf8ae03d9a01ae292" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-loader/zipball/5e0bd7e28c644078685f525cf8ae03d9a01ae292", + "reference": "5e0bd7e28c644078685f525cf8ae03d9a01ae292", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Loader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-loader", + "keywords": [ + "loader", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-log", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-log.git", + "reference": "217611433f5cb56d4420a1db8f164e5db85d815d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-log/zipball/217611433f5cb56d4420a1db8f164e5db85d815d", + "reference": "217611433f5cb56d4420a1db8f164e5db85d815d", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-console": "self.version", + "zendframework/zend-db": "self.version", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-mail": "self.version", + "zendframework/zend-validator": "self.version" + }, + "suggest": { + "ext-mongo": "*", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-escaper": "Zend\\Escaper component, for use in the XML formatter", + "zendframework/zend-mail": "Zend\\Mail component", + "zendframework/zend-validator": "Zend\\Validator component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Log\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "component for general purpose logging", + "homepage": "https://github.com/zendframework/zend-log", + "keywords": [ + "log", + "logging", + "zf2" + ], + "time": "2014-04-15 13:59:53" + }, + { + "name": "zendframework/zend-math", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-math.git", + "reference": "63225fcebb196fc6e20094f5f01e9354779ec31e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-math/zipball/63225fcebb196fc6e20094f5f01e9354779ec31e", + "reference": "63225fcebb196fc6e20094f5f01e9354779ec31e", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "suggest": { + "ext-bcmath": "If using the bcmath functionality", + "ext-gmp": "If using the gmp functionality", + "ircmaxell/random-lib": "Fallback random byte generator for Zend\\Math\\Rand if OpenSSL/Mcrypt extensions are unavailable", + "zendframework/zend-servicemanager": ">= current version, if using the BigInteger::factory functionality" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-math", + "keywords": [ + "math", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-modulemanager", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-modulemanager.git", + "reference": "d4591b958e40b8f5ae8110d9b203331437aa19f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-modulemanager/zipball/d4591b958e40b8f5ae8110d9b203331437aa19f2", + "reference": "d4591b958e40b8f5ae8110d9b203331437aa19f2", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-config": "self.version", + "zendframework/zend-console": "self.version", + "zendframework/zend-loader": "self.version", + "zendframework/zend-mvc": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-loader": "Zend\\Loader component", + "zendframework/zend-mvc": "Zend\\Mvc component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\ModuleManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-module-manager", + "keywords": [ + "modulemanager", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-mvc", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-mvc.git", + "reference": "ee76ddd009ecb0c507bb8ab396fbe719aea8f1ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-mvc/zipball/ee76ddd009ecb0c507bb8ab396fbe719aea8f1ff", + "reference": "ee76ddd009ecb0c507bb8ab396fbe719aea8f1ff", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-form": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-authentication": "self.version", + "zendframework/zend-console": "self.version", + "zendframework/zend-di": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-form": "self.version", + "zendframework/zend-http": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-inputfilter": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-log": "self.version", + "zendframework/zend-modulemanager": "self.version", + "zendframework/zend-serializer": "self.version", + "zendframework/zend-session": "self.version", + "zendframework/zend-text": "self.version", + "zendframework/zend-uri": "self.version", + "zendframework/zend-validator": "self.version", + "zendframework/zend-version": "self.version", + "zendframework/zend-view": "self.version" + }, + "suggest": { + "zendframework/zend-authentication": "Zend\\Authentication component for Identity plugin", + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-console": "Zend\\Console component", + "zendframework/zend-di": "Zend\\Di component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-form": "Zend\\Form component", + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-i18n": "Zend\\I18n component for translatable segments", + "zendframework/zend-inputfilter": "Zend\\Inputfilter component", + "zendframework/zend-json": "Zend\\Json component", + "zendframework/zend-log": "Zend\\Log component", + "zendframework/zend-modulemanager": "Zend\\ModuleManager component", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-session": "Zend\\Session component for FlashMessenger, PRG, and FPRG plugins", + "zendframework/zend-stdlib": "Zend\\Stdlib component", + "zendframework/zend-text": "Zend\\Text component", + "zendframework/zend-uri": "Zend\\Uri component", + "zendframework/zend-validator": "Zend\\Validator component", + "zendframework/zend-version": "Zend\\Version component", + "zendframework/zend-view": "Zend\\View component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Mvc\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-mvc", + "keywords": [ + "mvc", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-serializer", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-serializer.git", + "reference": "22f73b0d0ff1158216bd5bcacf6bd00f7be1a0f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/22f73b0d0ff1158216bd5bcacf6bd00f7be1a0f6", + "reference": "22f73b0d0ff1158216bd5bcacf6bd00f7be1a0f6", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-json": "self.version", + "zendframework/zend-math": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-servicemanager": "To support plugin manager support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", + "homepage": "https://github.com/zendframework/zend-serializer", + "keywords": [ + "serializer", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-server", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-server.git", + "reference": "bc5fb97f4ac48a5dc54bd18dded21a3e1eea552c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-server/zipball/bc5fb97f4ac48a5dc54bd18dded21a3e1eea552c", + "reference": "bc5fb97f4ac48a5dc54bd18dded21a3e1eea552c", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-code": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-server", + "keywords": [ + "server", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-servicemanager", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-servicemanager.git", + "reference": "7a428b595a1fcd4c2a8026ee5d5f89a56036f682" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/7a428b595a1fcd4c2a8026ee5d5f89a56036f682", + "reference": "7a428b595a1fcd4c2a8026ee5d5f89a56036f682", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-di": "self.version" + }, + "suggest": { + "zendframework/zend-di": "Zend\\Di component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\ServiceManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-service-manager", + "keywords": [ + "servicemanager", + "zf2" + ], + "time": "2014-04-15 13:59:53" + }, + { + "name": "zendframework/zend-soap", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-soap.git", + "reference": "fab9f5309be04cacf01af54f694aed5102592c5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-soap/zipball/fab9f5309be04cacf01af54f694aed5102592c5c", + "reference": "fab9f5309be04cacf01af54f694aed5102592c5c", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-server": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-uri": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-http": "self.version" + }, + "suggest": { + "zendframework/zend-http": "Zend\\Http component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Soap\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-soap", + "keywords": [ + "soap", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-stdlib", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-stdlib.git", + "reference": "6079302963d57f36a9ba92ed3f38b992997aa78d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/6079302963d57f36a9ba92ed3f38b992997aa78d", + "reference": "6079302963d57f36a9ba92ed3f38b992997aa78d", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-serializer": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-eventmanager": "To support aggregate hydrator usage", + "zendframework/zend-filter": "To support naming strategy hydrator usage", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-servicemanager": "To support hydrator plugin manager usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-stdlib", + "keywords": [ + "stdlib", + "zf2" + ], + "time": "2014-04-15 13:59:53" + }, + { + "name": "zendframework/zend-text", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-text.git", + "reference": "e9b3fffcc6241f7cfdb33282ed10979cd8ba9b90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-text/zipball/e9b3fffcc6241f7cfdb33282ed10979cd8ba9b90", + "reference": "e9b3fffcc6241f7cfdb33282ed10979cd8ba9b90", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Text\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-text", + "keywords": [ + "text", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-uri", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-uri.git", + "reference": "0de6ba8c166a235588783ff8e88a19b364630d89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-uri/zipball/0de6ba8c166a235588783ff8e88a19b364630d89", + "reference": "0de6ba8c166a235588783ff8e88a19b364630d89", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-validator": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Uri\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", + "homepage": "https://github.com/zendframework/zend-uri", + "keywords": [ + "uri", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-validator", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-validator.git", + "reference": "a5f97f6c3a27a27b1235f724ad0048715459f013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-validator/zipball/a5f97f6c3a27a27b1235f724ad0048715459f013", + "reference": "a5f97f6c3a27a27b1235f724ad0048715459f013", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-db": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-math": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-session": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-filter": "Zend\\Filter component, required by the Digits validator", + "zendframework/zend-i18n": "Zend\\I18n component to allow translation of validation error messages as well as to use the various Date validators", + "zendframework/zend-math": "Zend\\Math component", + "zendframework/zend-resources": "Translations of validator messages", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", + "zendframework/zend-session": "Zend\\Session component", + "zendframework/zend-uri": "Zend\\Uri component, required by the Uri and Sitemap\\Loc validators" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Validator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed validators", + "homepage": "https://github.com/zendframework/zend-validator", + "keywords": [ + "validator", + "zf2" + ], + "time": "2014-04-14 19:50:30" + }, + { + "name": "zendframework/zend-view", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-view.git", + "reference": "e308d498fa7851f26bd639bfe3ebbfba397c47bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-view/zipball/e308d498fa7851f26bd639bfe3ebbfba397c47bc", + "reference": "e308d498fa7851f26bd639bfe3ebbfba397c47bc", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-loader": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-authentication": "self.version", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-feed": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-http": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-json": "self.version", + "zendframework/zend-mvc": "self.version", + "zendframework/zend-navigation": "self.version", + "zendframework/zend-paginator": "self.version", + "zendframework/zend-permissions-acl": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-authentication": "Zend\\Authentication component", + "zendframework/zend-escaper": "Zend\\Escaper component", + "zendframework/zend-feed": "Zend\\Feed component", + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json component", + "zendframework/zend-mvc": "Zend\\Mvc component", + "zendframework/zend-navigation": "Zend\\Navigation component", + "zendframework/zend-paginator": "Zend\\Paginator component", + "zendframework/zend-permissions-acl": "Zend\\Permissions\\Acl component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-uri": "Zend\\Uri component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\View\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a system of helpers, output filters, and variable escaping", + "homepage": "https://github.com/zendframework/zend-view", + "keywords": [ + "view", + "zf2" + ], + "time": "2014-04-15 14:36:41" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/vendor/README b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/vendor/README new file mode 100644 index 0000000000000000000000000000000000000000..4ff7f39bd61163e93b753517020434e907c3d8bd --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/vendor/README @@ -0,0 +1,5 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + This file is to create a vendor directory for testing \ No newline at end of file diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/vendor_path.php b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/vendor_path.php new file mode 100644 index 0000000000000000000000000000000000000000..3f566fab2c01923dfab8acbae9676cf7d96c220b --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Model/_files/vendor_path.php @@ -0,0 +1,10 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** + * Path to Composer vendor directory + */ +return './vendor'; diff --git a/dev/tests/integration/testsuite/Magento/Tax/Model/TaxClass/RepositoryTest.php b/dev/tests/integration/testsuite/Magento/Tax/Model/TaxClass/RepositoryTest.php index b9c4925d392fa73ebd674a3f79321ee743f35ff7..a38ef69ab30edaecf73533ae60d3f470166262e5 100644 --- a/dev/tests/integration/testsuite/Magento/Tax/Model/TaxClass/RepositoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Tax/Model/TaxClass/RepositoryTest.php @@ -112,6 +112,29 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase $this->assertEquals(TaxClassManagementInterface::TYPE_CUSTOMER, $data->getClassType()); } + /** + * @magentoDbIsolation enabled + */ + public function testGetList() + { + $taxClassName = 'Get Me'; + $taxClassDataObject = $this->taxClassFactory->create(); + $taxClassDataObject->setClassName($taxClassName) + ->setClassType(TaxClassManagementInterface::TYPE_CUSTOMER); + $taxClassId = $this->taxClassRepository->save($taxClassDataObject); + /** @var \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder */ + $searchCriteriaBuilder = Bootstrap::getObjectManager()->create('Magento\Framework\Api\SearchCriteriaBuilder'); + /** @var \Magento\Tax\Api\Data\TaxClassSearchResultsInterface */ + $searchResult = $this->taxClassRepository->getList($searchCriteriaBuilder->create()); + $items = $searchResult->getItems(); + /** @var \Magento\Tax\Api\Data\TaxClassInterface */ + $taxClass = array_pop($items); + $this->assertInstanceOf('Magento\Tax\Api\Data\TaxClassInterface', $taxClass); + $this->assertEquals($taxClassName, $taxClass->getClassName()); + $this->assertEquals($taxClassId, $taxClass->getClassId()); + $this->assertEquals(TaxClassManagementInterface::TYPE_CUSTOMER, $taxClass->getClassType()); + } + /** * @expectedException \Magento\Framework\Exception\NoSuchEntityException * @expectedExceptionMessage No such entity with class_id = -9999 diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 5ef0179a6c9456b3daa107bab3a947ee8591eb31..6cb72ff35e1d7b625a383b34bb0e833217abe27b 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2123,6 +2123,16 @@ return [ 'Magento\Customer\Controller\Account\LoginPost', 'Magento\Customer\Model\Account\Redirect::getRedirect', ], + [ + 'process', + 'Magento\Framework\Api\ExtensionAttributesFactory', + 'Magento\Framework\Api\ExtensionAttribute\JoinProcessor::process' + ], + [ + 'extractExtensionAttributes', + 'Magento\Framework\Api\ExtensionAttributesFactory', + 'Magento\Framework\Api\ExtensionAttribute\JoinProcessor::extractExtensionAttributes' + ], ['isReviewOwner', 'Magento\Review\Block\Customer\View'], ['getRegistration', 'Magento\Customer\Block\Form\Login', 'Magento\Customer\Block\Form\Login\Info::getRegistration'], ['getCreateAccountUrl', 'Magento\Customer\Block\Form\Login', 'Magento\Customer\Block\Form\Login\Info::getCreateAccountUrl'], diff --git a/lib/internal/Magento/Framework/Api/DataObjectHelper.php b/lib/internal/Magento/Framework/Api/DataObjectHelper.php index 80e8587315bd552b5982000250003b6734719741..2fb75d5f841613fb0523cc88e7062112d1fc6729 100644 --- a/lib/internal/Magento/Framework/Api/DataObjectHelper.php +++ b/lib/internal/Magento/Framework/Api/DataObjectHelper.php @@ -35,6 +35,11 @@ class DataObjectHelper */ protected $extensionFactory; + /** + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $joinProcessor; + /** * @var MethodsMap */ @@ -45,6 +50,7 @@ class DataObjectHelper * @param \Magento\Framework\Reflection\DataObjectProcessor $objectProcessor * @param \Magento\Framework\Reflection\TypeProcessor $typeProcessor * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor * @param MethodsMap $methodsMapProcessor */ public function __construct( @@ -52,16 +58,20 @@ class DataObjectHelper \Magento\Framework\Reflection\DataObjectProcessor $objectProcessor, \Magento\Framework\Reflection\TypeProcessor $typeProcessor, \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory, + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor, MethodsMap $methodsMapProcessor ) { $this->objectFactory = $objectFactory; $this->objectProcessor = $objectProcessor; $this->typeProcessor = $typeProcessor; $this->extensionFactory = $extensionFactory; + $this->joinProcessor = $joinProcessor; $this->methodsMapProcessor = $methodsMapProcessor; } /** + * Populate data object using data in array format. + * * @param mixed $dataObject * @param array $data * @param string $interfaceName @@ -70,7 +80,7 @@ class DataObjectHelper public function populateWithArray($dataObject, array $data, $interfaceName) { if ($dataObject instanceof ExtensibleDataInterface) { - $data = $this->extensionFactory->extractExtensionAttributes(get_class($dataObject), $data); + $data = $this->joinProcessor->extractExtensionAttributes(get_class($dataObject), $data); } $this->_setDataValues($dataObject, $data, $interfaceName); return $this; diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config/Converter.php b/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config/Converter.php index f4e9df7cd643a67eccf4893097bb70b257fd2ef2..64fb32ecdf166747f88420fcfa932a3c4e2140aa 100644 --- a/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config/Converter.php +++ b/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config/Converter.php @@ -9,13 +9,15 @@ class Converter implements \Magento\Framework\Config\ConverterInterface { const RESOURCE_PERMISSIONS = "resourceRefs"; const DATA_TYPE = "type"; + const JOIN_DIRECTIVE = "join"; const JOIN_REFERENCE_TABLE = "join_reference_table"; const JOIN_REFERENCE_FIELD = "join_reference_field"; - const JOIN_SELECT_FIELDS = "join_select_fields"; - const JOIN_SELECT_FIELD = "select_field"; - const JOIN_SELECT_FIELD_SETTER = "setter_name"; - const JOIN_JOIN_ON_FIELD= "join_join_on_field"; + const JOIN_ON_FIELD= "join_on_field"; + + const JOIN_FIELDS = "fields"; + const JOIN_FIELD = "field"; + const JOIN_FIELD_COLUMN = "column"; /** * Convert dom node tree to array @@ -83,16 +85,15 @@ class Converter implements \Magento\Framework\Config\ConverterInterface $joinAttributes = $joinElement->attributes; $join = [ self::JOIN_REFERENCE_TABLE => $joinAttributes->getNamedItem('reference_table')->nodeValue, - self::JOIN_JOIN_ON_FIELD => $joinAttributes->getNamedItem('join_on_field')->nodeValue, + self::JOIN_ON_FIELD => $joinAttributes->getNamedItem('join_on_field')->nodeValue, self::JOIN_REFERENCE_FIELD => $joinAttributes->getNamedItem('reference_field')->nodeValue, ]; - $selectElements = $attribute->getElementsByTagName('select_field'); - foreach ($selectElements as $selectElement) { - $selectField = $selectElement->nodeValue; - $setterName = $selectElement->getAttribute('setter_name'); - $join[self::JOIN_SELECT_FIELDS][] = [ - self::JOIN_SELECT_FIELD => $selectField, - self::JOIN_SELECT_FIELD_SETTER => $setterName + $fields = $attribute->getElementsByTagName('field'); + foreach ($fields as $field) { + $column = $field->getAttribute('column'); + $join[self::JOIN_FIELDS][] = [ + self::JOIN_FIELD => $field->nodeValue, + self::JOIN_FIELD_COLUMN => $column ]; } } diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinData.php b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinData.php index 6457c79d1e145c216ebed6b183d23536e0ea1011..27200762555b6260a77168f1cc4088d4d68fa9f7 100644 --- a/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinData.php +++ b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinData.php @@ -11,8 +11,13 @@ namespace Magento\Framework\Api\ExtensionAttribute; * * @codeCoverageIgnore */ -class JoinData +class JoinData implements JoinDataInterface { + /** + * @var string + */ + private $attributeCode; + /** * @var string */ @@ -39,9 +44,24 @@ class JoinData private $selectFields; /** - * Get reference table name. - * - * @return string + * {@inheritdoc} + */ + public function getAttributeCode() + { + return $this->attributeCode; + } + + /** + * {@inheritdoc} + */ + public function setAttributeCode($attributeCode) + { + $this->attributeCode = $attributeCode; + return $this; + } + + /** + * {@inheritdoc} */ public function getReferenceTable() { @@ -49,10 +69,7 @@ class JoinData } /** - * Set reference table name. - * - * @param string $referenceTable - * @return $this + * {@inheritdoc} */ public function setReferenceTable($referenceTable) { @@ -61,9 +78,7 @@ class JoinData } /** - * Get reference table alias. - * - * @return string + * {@inheritdoc} */ public function getReferenceTableAlias() { @@ -71,10 +86,7 @@ class JoinData } /** - * Set reference table alias. - * - * @param string $referenceTableAlias - * @return $this + * {@inheritdoc} */ public function setReferenceTableAlias($referenceTableAlias) { @@ -83,9 +95,7 @@ class JoinData } /** - * Get reference field. - * - * @return string + * {@inheritdoc} */ public function getReferenceField() { @@ -93,10 +103,7 @@ class JoinData } /** - * Set reference field. - * - * @param string $referenceField - * @return $this + * {@inheritdoc} */ public function setReferenceField($referenceField) { @@ -105,9 +112,7 @@ class JoinData } /** - * Get join field. - * - * @return string + * {@inheritdoc} */ public function getJoinField() { @@ -115,10 +120,7 @@ class JoinData } /** - * Set join field. - * - * @param string $joinField - * @return $this + * {@inheritdoc} */ public function setJoinField($joinField) { @@ -127,9 +129,7 @@ class JoinData } /** - * Get select fields. - * - * @return string[] + * {@inheritdoc} */ public function getSelectFields() { @@ -137,10 +137,7 @@ class JoinData } /** - * Set select field. - * - * @param string[] $selectFields - * @return $this + * {@inheritdoc} */ public function setSelectFields(array $selectFields) { diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataInterface.php b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..91000c4e62e29b25221ea31407bbfbc529d32088 --- /dev/null +++ b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataInterface.php @@ -0,0 +1,108 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\Api\ExtensionAttribute; + +/** + * Interface of data holder for extension attribute joins. + */ +interface JoinDataInterface +{ + const SELECT_FIELD_EXTERNAL_ALIAS = 'external_alias'; + const SELECT_FIELD_INTERNAL_ALIAS = 'internal_alias'; + const SELECT_FIELD_WITH_DB_PREFIX = 'with_db_prefix'; + const SELECT_FIELD_SETTER = 'setter'; + + /** + * Get attribute code. + * + * @return string + */ + public function getAttributeCode(); + + /** + * Set attribute code. + * + * @param string $attributeCode + * @return $this + */ + public function setAttributeCode($attributeCode); + + /** + * Get reference table name. + * + * @return string + */ + public function getReferenceTable(); + + /** + * Set reference table name. + * + * @param string $referenceTable + * @return $this + */ + public function setReferenceTable($referenceTable); + + /** + * Get reference table alias. + * + * @return string + */ + public function getReferenceTableAlias(); + + /** + * Set reference table alias. + * + * @param string $referenceTableAlias + * @return $this + */ + public function setReferenceTableAlias($referenceTableAlias); + + /** + * Get reference field. + * + * @return string + */ + public function getReferenceField(); + + /** + * Set reference field. + * + * @param string $referenceField + * @return $this + */ + public function setReferenceField($referenceField); + + /** + * Get join field. + * + * @return string + */ + public function getJoinField(); + + /** + * Set join field. + * + * @param string $joinField + * @return $this + */ + public function setJoinField($joinField); + + /** + * Get select fields. + * + * @return array + */ + public function getSelectFields(); + + /** + * Set select field. + * + * @param array $selectFields + * @return $this + */ + public function setSelectFields(array $selectFields); +} diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataFactory.php b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataInterfaceFactory.php similarity index 90% rename from lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataFactory.php rename to lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataInterfaceFactory.php index a34c41363a2a28664764a04922cc06e2cdf52164..67c6d0cc164b3b110251b7ef6851abc04940b151 100644 --- a/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataFactory.php +++ b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinDataInterfaceFactory.php @@ -8,9 +8,9 @@ namespace Magento\Framework\Api\ExtensionAttribute; /** * Factory class for @see - * \Magento\Framework\Api\ExtensionAttribute\JoinData + * \Magento\Framework\Api\ExtensionAttribute\JoinDataInterface */ -class JoinDataFactory +class JoinDataInterfaceFactory { /** * Object Manager instance @@ -34,7 +34,7 @@ class JoinDataFactory */ public function __construct( \Magento\Framework\ObjectManagerInterface $objectManager, - $instanceName = '\\Magento\\Framework\\Api\\ExtensionAttribute\\JoinData' + $instanceName = '\\Magento\\Framework\\Api\\ExtensionAttribute\\JoinDataInterface' ) { $this->_objectManager = $objectManager; $this->_instanceName = $instanceName; diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinProcessor.php b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinProcessor.php new file mode 100644 index 0000000000000000000000000000000000000000..dbe83d1d343a238f1d5806b86120b89e1059e7b4 --- /dev/null +++ b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinProcessor.php @@ -0,0 +1,258 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\Api\ExtensionAttribute; + +use Magento\Framework\Api\ExtensionAttribute\Config; +use Magento\Framework\Api\ExtensionAttribute\Config\Converter; +use Magento\Framework\Data\Collection\AbstractDb as DbCollection; +use Magento\Framework\Api\ExtensionAttribute\JoinDataInterface; +use Magento\Framework\Api\ExtensionAttribute\JoinDataInterfaceFactory; +use Magento\Framework\Reflection\TypeProcessor; +use Magento\Framework\Api\ExtensibleDataInterface; +use Magento\Framework\Api\ExtensionAttributesFactory; +use Magento\Framework\Api\SimpleDataObjectConverter; + +/** + * Join processor allows to join extension attributes during collections loading. + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class JoinProcessor implements \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface +{ + /** + * Object Manager instance + * + * @var \Magento\Framework\ObjectManagerInterface + */ + protected $objectManager; + + /** + * @var Config + */ + private $config; + + /** + * @var JoinDataInterfaceFactory + */ + private $extensionAttributeJoinDataFactory; + + /** + * @var TypeProcessor + */ + private $typeProcessor; + + /** + * @var ExtensionAttributesFactory + */ + private $extensionAttributesFactory; + + /** + * Initialize dependencies. + * + * @param \Magento\Framework\ObjectManagerInterface $objectManager + * @param Config $config + * @param JoinDataInterfaceFactory $extensionAttributeJoinDataFactory + * @param TypeProcessor $typeProcessor + * @param ExtensionAttributesFactory $extensionAttributesFactory + */ + public function __construct( + \Magento\Framework\ObjectManagerInterface $objectManager, + Config $config, + JoinDataInterfaceFactory $extensionAttributeJoinDataFactory, + TypeProcessor $typeProcessor, + ExtensionAttributesFactory $extensionAttributesFactory + ) { + $this->objectManager = $objectManager; + $this->config = $config; + $this->extensionAttributeJoinDataFactory = $extensionAttributeJoinDataFactory; + $this->typeProcessor = $typeProcessor; + $this->extensionAttributesFactory = $extensionAttributesFactory; + } + + /** + * {@inheritdoc} + */ + public function process(DbCollection $collection, $extensibleEntityClass = null) + { + $extensibleEntityClass = $extensibleEntityClass ?: $collection->getItemObjectClass(); + $joinDirectives = $this->getJoinDirectivesForType($extensibleEntityClass); + foreach ($joinDirectives as $attributeCode => $directive) { + /** @var JoinDataInterface $joinData */ + $joinData = $this->extensionAttributeJoinDataFactory->create(); + $joinData->setAttributeCode($attributeCode) + ->setReferenceTable($directive[Converter::JOIN_REFERENCE_TABLE]) + ->setReferenceTableAlias($this->getReferenceTableAlias($attributeCode)) + ->setReferenceField($directive[Converter::JOIN_REFERENCE_FIELD]) + ->setJoinField($directive[Converter::JOIN_ON_FIELD]); + $joinData->setSelectFields( + $this->getSelectFieldsMap($attributeCode, $directive[Converter::JOIN_FIELDS]) + ); + $collection->joinExtensionAttribute($joinData, $this); + } + } + + /** + * Generate a list of select fields with mapping of client facing attribute names to field names used in SQL select. + * + * @param string $attributeCode + * @param array $selectFields + * @return array + */ + private function getSelectFieldsMap($attributeCode, $selectFields) + { + $referenceTableAlias = $this->getReferenceTableAlias($attributeCode); + $useFieldInAlias = (count($selectFields) > 1); + $selectFieldsAliases = []; + foreach ($selectFields as $selectField) { + $internalFieldName = $selectField[Converter::JOIN_FIELD_COLUMN] + ? $selectField[Converter::JOIN_FIELD_COLUMN] + : $selectField[Converter::JOIN_FIELD]; + $setterName = 'set' + . ucfirst(SimpleDataObjectConverter::snakeCaseToCamelCase($selectField[Converter::JOIN_FIELD])); + $selectFieldsAliases[] = [ + JoinDataInterface::SELECT_FIELD_EXTERNAL_ALIAS => $attributeCode + . ($useFieldInAlias ? '.' . $selectField[Converter::JOIN_FIELD] : ''), + JoinDataInterface::SELECT_FIELD_INTERNAL_ALIAS => $referenceTableAlias . '_' . $internalFieldName, + JoinDataInterface::SELECT_FIELD_WITH_DB_PREFIX => $referenceTableAlias . '.' . $internalFieldName, + JoinDataInterface::SELECT_FIELD_SETTER => $setterName + ]; + } + return $selectFieldsAliases; + } + + /** + * Generate reference table alias. + * + * @param string $attributeCode + * @return string + */ + private function getReferenceTableAlias($attributeCode) + { + return 'extension_attribute_' . $attributeCode; + } + + /** + * {@inheritdoc} + */ + public function extractExtensionAttributes($extensibleEntityClass, array $data) + { + if (!$this->isExtensibleAttributesImplemented($extensibleEntityClass)) { + /* do nothing as there are no extension attributes */ + return $data; + } + + $joinDirectives = $this->getJoinDirectivesForType($extensibleEntityClass); + $extensionData = []; + foreach ($joinDirectives as $attributeCode => $directive) { + $this->populateAttributeCodeWithDirective( + $attributeCode, + $directive, + $data, + $extensionData, + $extensibleEntityClass + ); + } + if (!empty($extensionData)) { + $extensionAttributes = $this->extensionAttributesFactory->create($extensibleEntityClass, $extensionData); + $data[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY] = $extensionAttributes; + } + return $data; + } + + /** + * Populate a specific attribute code with join directive instructions. + * + * @param string $attributeCode + * @param array $directive + * @param array &$data + * @param array &$extensionData + * @param string $extensibleEntityClass + * @return void + */ + private function populateAttributeCodeWithDirective( + $attributeCode, + $directive, + &$data, + &$extensionData, + $extensibleEntityClass + ) { + $attributeType = $directive[Converter::DATA_TYPE]; + $selectFields = $this->getSelectFieldsMap($attributeCode, $directive[Converter::JOIN_FIELDS]); + foreach ($selectFields as $selectField) { + $internalAlias = $selectField[JoinDataInterface::SELECT_FIELD_INTERNAL_ALIAS]; + if (isset($data[$internalAlias])) { + if ($this->typeProcessor->isArrayType($attributeType)) { + throw new \LogicException( + sprintf( + 'Join directives cannot be processed for attribute (%s) of extensible entity (%s),' + . ' which has an Array type (%s).', + $attributeCode, + $this->extensionAttributesFactory->getExtensibleInterfaceName($extensibleEntityClass), + $attributeType + ) + ); + } elseif ($this->typeProcessor->isTypeSimple($attributeType)) { + $extensionData['data'][$attributeCode] = $data[$internalAlias]; + unset($data[$internalAlias]); + break; + } else { + if (!isset($extensionData['data'][$attributeCode])) { + $extensionData['data'][$attributeCode] = $this->objectManager->create($attributeType); + } + $setterName = $selectField[JoinDataInterface::SELECT_FIELD_SETTER]; + $extensionData['data'][$attributeCode]->$setterName($data[$internalAlias]); + unset($data[$internalAlias]); + } + } + } + } + + /** + * Returns the internal join directive config for a given type. + * + * Array returned has all of the \Magento\Framework\Api\ExtensionAttribute\Config\Converter JOIN* fields set. + * + * @param string $extensibleEntityClass + * @return array + */ + private function getJoinDirectivesForType($extensibleEntityClass) + { + $extensibleInterfaceName = $this->extensionAttributesFactory + ->getExtensibleInterfaceName($extensibleEntityClass); + $extensibleInterfaceName = ltrim($extensibleInterfaceName, '\\'); + $config = $this->config->get(); + if (!isset($config[$extensibleInterfaceName])) { + return []; + } + + $typeAttributesConfig = $config[$extensibleInterfaceName]; + $joinDirectives = []; + foreach ($typeAttributesConfig as $attributeCode => $attributeConfig) { + if (isset($attributeConfig[Converter::JOIN_DIRECTIVE])) { + $joinDirectives[$attributeCode] = $attributeConfig[Converter::JOIN_DIRECTIVE]; + $joinDirectives[$attributeCode][Converter::DATA_TYPE] = $attributeConfig[Converter::DATA_TYPE]; + } + } + + return $joinDirectives; + } + + /** + * Determine if the type is an actual extensible data interface. + * + * @param string $typeName + * @return bool + */ + private function isExtensibleAttributesImplemented($typeName) + { + try { + $this->extensionAttributesFactory->getExtensibleInterfaceName($typeName); + return true; + } catch (\LogicException $e) { + return false; + } + } +} diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinProcessorInterface.php b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinProcessorInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..6b9c47b6d10fc805d3d290ff3e6f804775b9a8a0 --- /dev/null +++ b/lib/internal/Magento/Framework/Api/ExtensionAttribute/JoinProcessorInterface.php @@ -0,0 +1,38 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\Api\ExtensionAttribute; + +use Magento\Framework\Data\Collection\AbstractDb as DbCollection; + +/** + * Join processor allows to join extension attributes during collections loading. + */ +interface JoinProcessorInterface +{ + /** + * Processes extension attributes join instructions to add necessary joins to the collection of extensible entities. + * + * @param DbCollection $collection + * @param string|null $extensibleEntityClass + * @return void + * @throws \LogicException + */ + public function process(DbCollection $collection, $extensibleEntityClass = null); + + /** + * Extract extension attributes into separate extension object. + * + * Complex extension attributes will be populated using flat data loaded. + * Data items used for extension object population are unset from the $data. + * + * @param string $extensibleEntityClass + * @param array $data + * @return array + * @throws \LogicException + */ + public function extractExtensionAttributes($extensibleEntityClass, array $data); +} diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php b/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php index 499477cfc17b9f112d78b18eadad834e74d5dfa7..8503b870ab136b13708a78cae896106a1e725c82 100644 --- a/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php +++ b/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php @@ -6,14 +6,6 @@ namespace Magento\Framework\Api; -use Magento\Framework\Api\ExtensionAttribute\Config; -use Magento\Framework\Api\ExtensionAttribute\Config\Converter; -use Magento\Framework\Data\Collection\AbstractDb as DbCollection; -use Magento\Framework\Api\ExtensionAttribute\JoinData; -use Magento\Framework\Api\ExtensionAttribute\JoinDataFactory; -use Magento\Framework\Reflection\TypeProcessor; -use Magento\Framework\Api\ExtensibleDataInterface; - /** * Factory class for instantiation of extension attributes objects. */ @@ -28,21 +20,6 @@ class ExtensionAttributesFactory */ protected $objectManager; - /** - * @var Config - */ - private $config; - - /** - * @var JoinDataFactory - */ - private $extensionAttributeJoinDataFactory; - - /** - * @var TypeProcessor - */ - private $typeProcessor; - /** * Map is used for performance optimization. * @@ -54,20 +31,10 @@ class ExtensionAttributesFactory * Factory constructor * * @param \Magento\Framework\ObjectManagerInterface $objectManager - * @param Config $config - * @param JoinDataFactory $extensionAttributeJoinDataFactory - * @param TypeProcessor $typeProcessor */ - public function __construct( - \Magento\Framework\ObjectManagerInterface $objectManager, - Config $config, - JoinDataFactory $extensionAttributeJoinDataFactory, - TypeProcessor $typeProcessor - ) { + public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager) + { $this->objectManager = $objectManager; - $this->config = $config; - $this->extensionAttributeJoinDataFactory = $extensionAttributeJoinDataFactory; - $this->typeProcessor = $typeProcessor; } /** @@ -110,155 +77,13 @@ class ExtensionAttributesFactory return $extensionFactory->create($data); } - /** - * Processes join instructions to add to the collection for a data interface. - * - * @param DbCollection $collection - * @param string $extensibleEntityClass - * @return void - */ - public function process(DbCollection $collection, $extensibleEntityClass) - { - $joinDirectives = $this->getJoinDirectivesForType($extensibleEntityClass); - foreach ($joinDirectives as $attributeCode => $directive) { - /** @var JoinData $joinData */ - $joinData = $this->extensionAttributeJoinDataFactory->create(); - $joinData->setReferenceTable($directive[Converter::JOIN_REFERENCE_TABLE]) - ->setReferenceTableAlias('extension_attribute_' . $attributeCode) - ->setReferenceField($directive[Converter::JOIN_REFERENCE_FIELD]) - ->setJoinField($directive[Converter::JOIN_JOIN_ON_FIELD]); - $selectFieldsMapper = function ($selectFieldData) { - return $selectFieldData[Converter::JOIN_SELECT_FIELD]; - }; - $joinData->setSelectFields(array_map($selectFieldsMapper, $directive[Converter::JOIN_SELECT_FIELDS])); - $collection->joinExtensionAttribute($joinData, [$this, 'extractExtensionAttributes']); - } - } - - /** - * Extract extension attributes into separate extension object. - * - * @param string $extensibleEntityClass - * @param array $data - * @return array - * @throws \LogicException - */ - public function extractExtensionAttributes($extensibleEntityClass, array $data) - { - if (!$this->isExtensibleAttributesImplemented($extensibleEntityClass)) { - /* do nothing as there are no extension attributes */ - return $data; - } - - $joinDirectives = $this->getJoinDirectivesForType($extensibleEntityClass); - $extensionData = []; - foreach ($joinDirectives as $attributeCode => $directive) { - $this->populateAttributeCodeWithDirective( - $attributeCode, - $directive, - $data, - $extensionData, - $extensibleEntityClass - ); - } - if (!empty($extensionData)) { - $extensionAttributes = $this->create($extensibleEntityClass, $extensionData); - $data[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY] = $extensionAttributes; - } - return $data; - } - - /** - * Populate a specific attribute code with join directive instructions. - * - * @param string $attributeCode - * @param array $directive - * @param array &$data - * @param array &$extensionData - * @param string $extensibleEntityClass - * @return void - */ - private function populateAttributeCodeWithDirective( - $attributeCode, - $directive, - &$data, - &$extensionData, - $extensibleEntityClass - ) { - $attributeType = $directive[Converter::DATA_TYPE]; - $selectFields = $directive[Converter::JOIN_SELECT_FIELDS]; - foreach ($selectFields as $selectField) { - $selectFieldAlias = 'extension_attribute_' . $attributeCode - . '_' . $selectField[Converter::JOIN_SELECT_FIELD]; - if (isset($data[$selectFieldAlias])) { - if ($this->typeProcessor->isArrayType($attributeType)) { - throw new \LogicException( - sprintf( - 'Join directives cannot be processed for attribute (%s) of extensible entity (%s),' - . ' which has an Array type (%s).', - $attributeCode, - $this->getExtensibleInterfaceName($extensibleEntityClass), - $attributeType - ) - ); - } elseif ($this->typeProcessor->isTypeSimple($attributeType)) { - $extensionData['data'][$attributeCode] = $data[$selectFieldAlias]; - unset($data[$selectFieldAlias]); - break; - } else { - if (!isset($extensionData['data'][$attributeCode])) { - $extensionData['data'][$attributeCode] = $this->objectManager->create($attributeType); - } - $setterName = $selectField[Converter::JOIN_SELECT_FIELD_SETTER] - ? $selectField[Converter::JOIN_SELECT_FIELD_SETTER] - :'set' . ucfirst( - SimpleDataObjectConverter::snakeCaseToCamelCase( - $selectField[Converter::JOIN_SELECT_FIELD] - ) - ); - $extensionData['data'][$attributeCode]->$setterName($data[$selectFieldAlias]); - unset($data[$selectFieldAlias]); - } - } - } - } - - /** - * Returns the internal join directive config for a given type. - * - * Array returned has all of the \Magento\Framework\Api\ExtensionAttribute\Config\Converter JOIN* fields set. - * - * @param string $extensibleEntityClass - * @return array - */ - private function getJoinDirectivesForType($extensibleEntityClass) - { - $extensibleInterfaceName = $this->getExtensibleInterfaceName($extensibleEntityClass); - $extensibleInterfaceName = ltrim($extensibleInterfaceName, '\\'); - $config = $this->config->get(); - if (!isset($config[$extensibleInterfaceName])) { - return []; - } - - $typeAttributesConfig = $config[$extensibleInterfaceName]; - $joinDirectives = []; - foreach ($typeAttributesConfig as $attributeCode => $attributeConfig) { - if (isset($attributeConfig[Converter::JOIN_DIRECTIVE])) { - $joinDirectives[$attributeCode] = $attributeConfig[Converter::JOIN_DIRECTIVE]; - $joinDirectives[$attributeCode][Converter::DATA_TYPE] = $attributeConfig[Converter::DATA_TYPE]; - } - } - - return $joinDirectives; - } - /** * Identify concrete extensible interface name based on the class name. * * @param string $extensibleClassName * @return string */ - private function getExtensibleInterfaceName($extensibleClassName) + public function getExtensibleInterfaceName($extensibleClassName) { $exceptionMessage = "Class '{$extensibleClassName}' must implement an interface, " . "which extends from '" . self::EXTENSIBLE_INTERFACE_NAME . "'"; @@ -289,20 +114,4 @@ class ExtensionAttributesFactory $this->classInterfaceMap[$extensibleClassName] = $notExtensibleClassFlag; throw new \LogicException($exceptionMessage); } - - /** - * Determine if the type is an actual extensible data interface. - * - * @param string $typeName - * @return bool - */ - private function isExtensibleAttributesImplemented($typeName) - { - try { - $this->getExtensibleInterfaceName($typeName); - return true; - } catch (\LogicException $e) { - return false; - } - } } diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/DataObjectHelperTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/DataObjectHelperTest.php index 079ebbaec7832fa40b5cb260a32fecae1524a774..484920c2a6740a21789a00a4ce9550f3464ade83 100644 --- a/lib/internal/Magento/Framework/Api/Test/Unit/DataObjectHelperTest.php +++ b/lib/internal/Magento/Framework/Api/Test/Unit/DataObjectHelperTest.php @@ -44,14 +44,14 @@ class DataObjectHelperTest extends \PHPUnit_Framework_TestCase protected $attributeValueFactoryMock; /** - * @var \Magento\Framework\Api\ExtensionAttributesFactory|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Reflection\MethodsMap|\PHPUnit_Framework_MockObject_MockObject */ - protected $extensionFactoryMock; + protected $methodsMapProcessor; /** - * @var \Magento\Framework\Reflection\MethodsMap|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessor|\PHPUnit_Framework_MockObject_MockObject */ - protected $methodsMapProcessor; + protected $joinProcessorMock; public function setUp() { @@ -69,22 +69,23 @@ class DataObjectHelperTest extends \PHPUnit_Framework_TestCase $this->attributeValueFactoryMock = $this->getMockBuilder('Magento\Framework\Api\AttributeValueFactory') ->disableOriginalConstructor() ->getMock(); - $this->extensionFactoryMock = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttributesFactory') + $this->joinProcessorMock = $this->getMockBuilder('\Magento\Framework\Api\ExtensionAttribute\JoinProcessor') ->setMethods(['extractExtensionAttributes']) ->disableOriginalConstructor() ->getMock(); - $this->extensionFactoryMock->expects($this->any()) + $this->joinProcessorMock->expects($this->any()) ->method('extractExtensionAttributes') ->willReturnArgument(1); $this->typeProcessor = $this->objectManager->getObject('Magento\Framework\Reflection\TypeProcessor'); + $this->dataObjectHelper = $this->objectManager->getObject( 'Magento\Framework\Api\DataObjectHelper', [ 'objectFactory' => $this->objectFactoryMock, 'typeProcessor' => $this->typeProcessor, 'objectProcessor' => $this->objectProcessorMock, - 'extensionFactory' => $this->extensionFactoryMock, 'methodsMapProcessor' => $this->methodsMapProcessor, + 'joinProcessor' => $this->joinProcessorMock ] ); } diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/ConverterTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/ConverterTest.php index 46b46456c828ace6fa6183ceb0aad5bb76991704..dca3d3af4382f388b08b7d2f1d84521fb4c19f3d 100644 --- a/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/ConverterTest.php +++ b/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/ConverterTest.php @@ -105,13 +105,13 @@ class ConverterTest extends \PHPUnit_Framework_TestCase Converter::RESOURCE_PERMISSIONS => [], Converter::JOIN_DIRECTIVE => [ Converter::JOIN_REFERENCE_TABLE => "library_account", - Converter::JOIN_SELECT_FIELDS => [ + Converter::JOIN_FIELDS => [ [ - Converter::JOIN_SELECT_FIELD => "library_card_id", - Converter::JOIN_SELECT_FIELD_SETTER => "" + Converter::JOIN_FIELD => "library_card_id", + Converter::JOIN_FIELD_COLUMN => "" ] ], - Converter::JOIN_JOIN_ON_FIELD => "id", + Converter::JOIN_ON_FIELD => "id", Converter::JOIN_REFERENCE_FIELD => "customer_id", ], ], @@ -120,17 +120,17 @@ class ConverterTest extends \PHPUnit_Framework_TestCase Converter::RESOURCE_PERMISSIONS => [], Converter::JOIN_DIRECTIVE => [ Converter::JOIN_REFERENCE_TABLE => "reviews", - Converter::JOIN_SELECT_FIELDS => [ + Converter::JOIN_FIELDS => [ [ - Converter::JOIN_SELECT_FIELD => "comment", - Converter::JOIN_SELECT_FIELD_SETTER => "" + Converter::JOIN_FIELD => "comment", + Converter::JOIN_FIELD_COLUMN => "" ], [ - Converter::JOIN_SELECT_FIELD => "rating", - Converter::JOIN_SELECT_FIELD_SETTER => "" + Converter::JOIN_FIELD => "rating", + Converter::JOIN_FIELD_COLUMN => "" ] ], - Converter::JOIN_JOIN_ON_FIELD => "customer_id", + Converter::JOIN_ON_FIELD => "customer_id", Converter::JOIN_REFERENCE_FIELD => "customer_id", ], ], diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/XsdTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/XsdTest.php index c599760f5934ff67f679db1186f44d205ee46b34..9dab40a9ad26cae94f41b13f15770c4304257efa 100644 --- a/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/XsdTest.php +++ b/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/XsdTest.php @@ -89,7 +89,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase reference_field="customer_id" join_on_field="id" > - <select_field>library_card_id</select_field> + <field>library_card_id</field> </join> </attribute> </extension_attributes> @@ -107,7 +107,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase reference_field="customer_id" join_on_field="id" > - <select_field>library_card_id</select_field> + <field>library_card_id</field> </join> </attribute> </extension_attributes> @@ -142,7 +142,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase "Element 'join': The attribute 'reference_table' is required but missing.", "Element 'join': The attribute 'join_on_field' is required but missing.", "Element 'join': The attribute 'reference_field' is required but missing.", - "Element 'join': Missing child element(s). Expected is ( select_field ).", + "Element 'join': Missing child element(s). Expected is ( field ).", ], ], ]; diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/_files/extension_attributes_with_join_directives.xml b/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/_files/extension_attributes_with_join_directives.xml index bdf8f3920bb19091f5b49bf991c500027247b108..baacb34779535867a463cb8feee35b01f246ac41 100644 --- a/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/_files/extension_attributes_with_join_directives.xml +++ b/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/_files/extension_attributes_with_join_directives.xml @@ -12,7 +12,7 @@ reference_field="customer_id" join_on_field="id" > - <select_field>library_card_id</select_field> + <field>library_card_id</field> </join> </attribute> <attribute code="reviews" type="Magento\Reviews\Api\Data\Reviews[]"> @@ -20,8 +20,8 @@ reference_field="customer_id" join_on_field="customer_id" > - <select_field>comment</select_field> - <select_field>rating</select_field> + <field>comment</field> + <field>rating</field> </join> </attribute> </extension_attributes> diff --git a/lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd b/lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd index 6bccd9b1643b0c515e4c16bdbd8eb200f9c568dc..ef21443cec8b43c3308542d15d26ac7f71aecdda 100644 --- a/lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd +++ b/lib/internal/Magento/Framework/Api/etc/extension_attributes.xsd @@ -41,13 +41,13 @@ <xs:complexType name="selectFieldType"> <xs:simpleContent> <xs:extension base="xs:string"> - <xs:attribute type="xs:string" name="setter_name" use="optional"/> + <xs:attribute type="xs:string" name="column" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="joinType"> <xs:sequence> - <xs:element type="selectFieldType" name="select_field" maxOccurs="unbounded" minOccurs="1"/> + <xs:element type="selectFieldType" name="field" maxOccurs="unbounded" minOccurs="1"/> </xs:sequence> <xs:attribute type="xs:string" name="reference_table" use="required"/> <xs:attribute type="xs:string" name="join_on_field" use="required"/> diff --git a/lib/internal/Magento/Framework/App/Cache/StateInterface.php b/lib/internal/Magento/Framework/App/Cache/StateInterface.php index 67d47666347bc61a626e9cb69066666c94cad609..9e6ae602b005924bb6a252a23e53d2e16cf8933a 100644 --- a/lib/internal/Magento/Framework/App/Cache/StateInterface.php +++ b/lib/internal/Magento/Framework/App/Cache/StateInterface.php @@ -5,6 +5,9 @@ */ namespace Magento\Framework\App\Cache; +/** + * @api + */ interface StateInterface { /** diff --git a/lib/internal/Magento/Framework/App/Cache/TypeListInterface.php b/lib/internal/Magento/Framework/App/Cache/TypeListInterface.php index fbd4313f6eaab523cf9fa0cfa3637f088edc0677..f00d511cc8588d2d0a4509b8bc1839391a8d6ff4 100644 --- a/lib/internal/Magento/Framework/App/Cache/TypeListInterface.php +++ b/lib/internal/Magento/Framework/App/Cache/TypeListInterface.php @@ -5,6 +5,9 @@ */ namespace Magento\Framework\App\Cache; +/** + * @api + */ interface TypeListInterface { /** diff --git a/lib/internal/Magento/Framework/App/CacheInterface.php b/lib/internal/Magento/Framework/App/CacheInterface.php index a2216876e1878adebca11f894f2d72134e5d0c0c..cc760fe6ce3acff66bf4f50bfa3a954370958fe8 100644 --- a/lib/internal/Magento/Framework/App/CacheInterface.php +++ b/lib/internal/Magento/Framework/App/CacheInterface.php @@ -1,12 +1,16 @@ <?php /** - * System cache model interface * * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\App; +/** + * System cache model interface + * + * @api + */ interface CacheInterface { /** diff --git a/lib/internal/Magento/Framework/App/Filesystem/DirectoryList.php b/lib/internal/Magento/Framework/App/Filesystem/DirectoryList.php index cb3767cc11fce65c015b2e6bcedcee9e253fca17..64422cb528d82b21631b67118a50fc60695e36ea 100644 --- a/lib/internal/Magento/Framework/App/Filesystem/DirectoryList.php +++ b/lib/internal/Magento/Framework/App/Filesystem/DirectoryList.php @@ -110,6 +110,11 @@ class DirectoryList extends \Magento\Framework\Filesystem\DirectoryList */ const UPLOAD = 'upload'; + /** + * Directory to store composer related files (config, cache etc.) in case if composer runs by Magento Application + */ + const COMPOSER_HOME = 'composer_home'; + /** * A suffix for temporary materialization directory where pre-processed files will be written (if necessary) */ @@ -145,6 +150,7 @@ class DirectoryList extends \Magento\Framework\Filesystem\DirectoryList self::TMP_MATERIALIZATION_DIR => [parent::PATH => 'var/view_preprocessed'], self::TEMPLATE_MINIFICATION_DIR => [parent::PATH => 'var/view_preprocessed/html'], self::SETUP => [parent::PATH => 'setup/src'], + self::COMPOSER_HOME => [parent::PATH => 'var/composer_home'], ]; return parent::getDefaultConfig() + $result; } diff --git a/lib/internal/Magento/Framework/Archive/ArchiveInterface.php b/lib/internal/Magento/Framework/Archive/ArchiveInterface.php index ae9ab9b3d5f21abe939099da248510aedb2e109c..94512cafee53d3de65aee9ed29f968b3806074c7 100644 --- a/lib/internal/Magento/Framework/Archive/ArchiveInterface.php +++ b/lib/internal/Magento/Framework/Archive/ArchiveInterface.php @@ -11,6 +11,9 @@ */ namespace Magento\Framework\Archive; +/** + * @api + */ interface ArchiveInterface { /** diff --git a/lib/internal/Magento/Framework/Archive/Tar.php b/lib/internal/Magento/Framework/Archive/Tar.php index 0b69b98930cd7aea95415e29615e8fe6655152e6..c9e5fe5eebe9a727844cafcfa1b70b23eaeadda3 100644 --- a/lib/internal/Magento/Framework/Archive/Tar.php +++ b/lib/internal/Magento/Framework/Archive/Tar.php @@ -470,8 +470,8 @@ class Tar extends \Magento\Framework\Archive\AbstractArchive implements \Magento $checksumOk = $header['checksum'] == $checksum; if (isset($header['name']) && $checksumOk) { + $header['name'] = trim($header['name']); if (!($header['name'] == '././@LongLink' && $header['type'] == 'L')) { - $header['name'] = trim($header['name']); return $header; } diff --git a/lib/internal/Magento/Framework/Backup/Filesystem/Rollback/Fs.php b/lib/internal/Magento/Framework/Backup/Filesystem/Rollback/Fs.php index ff750d3c8b1e49e89659822ddc944c73995ca815..16219421a64b104b8cef0fa7a6c8428f62e8df9b 100644 --- a/lib/internal/Magento/Framework/Backup/Filesystem/Rollback/Fs.php +++ b/lib/internal/Magento/Framework/Backup/Filesystem/Rollback/Fs.php @@ -54,6 +54,7 @@ class Fs extends AbstractRollback new \Magento\Framework\Archive\Gz(); new \Magento\Framework\Archive\Helper\File(''); new \Magento\Framework\Archive\Helper\File\Gz(''); + new \Magento\Framework\Exception\LocalizedException(new \Magento\Framework\Phrase('')); $fsHelper->rm($this->_snapshot->getRootDir(), $this->_snapshot->getIgnorePaths()); $archiver->unpack($snapshotPath, $this->_snapshot->getRootDir()); diff --git a/lib/internal/Magento/Framework/Cache/FrontendInterface.php b/lib/internal/Magento/Framework/Cache/FrontendInterface.php index ccc69600622a7bb240ab28acb40b935e9f79c93f..5c658ce8f23bbe2685655afb600ecf20520db414 100644 --- a/lib/internal/Magento/Framework/Cache/FrontendInterface.php +++ b/lib/internal/Magento/Framework/Cache/FrontendInterface.php @@ -24,6 +24,7 @@ interface FrontendInterface * * @param string $identifier * @return string|bool + * @api */ public function load($identifier); @@ -35,6 +36,7 @@ interface FrontendInterface * @param array $tags * @param int|bool|null $lifeTime * @return bool + * @api */ public function save($data, $identifier, array $tags = [], $lifeTime = null); @@ -43,6 +45,7 @@ interface FrontendInterface * * @param string $identifier * @return bool + * @api */ public function remove($identifier); @@ -52,6 +55,7 @@ interface FrontendInterface * @param string $mode * @param array $tags * @return bool + * @api */ public function clean($mode = \Zend_Cache::CLEANING_MODE_ALL, array $tags = []); diff --git a/lib/internal/Magento/Framework/Composer/ComposerInformation.php b/lib/internal/Magento/Framework/Composer/ComposerInformation.php new file mode 100644 index 0000000000000000000000000000000000000000..5ba195f386dba1d3e489993b423c00bde17aa295 --- /dev/null +++ b/lib/internal/Magento/Framework/Composer/ComposerInformation.php @@ -0,0 +1,152 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\Composer; + +use Composer\Factory as ComposerFactory; +use Composer\Package\PackageInterface; +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Filesystem; + +/** + * Class ComposerInformation uses Composer to determine dependency information. + */ +class ComposerInformation +{ + /** + * @var \Composer\Composer + */ + private $composer; + + /** + * @var \Composer\Package\Locker + */ + private $locker; + + /** + * Constructor + * + * @param Filesystem $filesystem + */ + public function __construct( + Filesystem $filesystem + ) { + $vendor = $filesystem->getDirectoryRead(DirectoryList::CONFIG)->getAbsolutePath('vendor_path.php'); + $vendorPath = $filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath() . include $vendor; + // Create Composer + $io = new \Composer\IO\BufferIO(); + $this->composer = ComposerFactory::create($io, $vendorPath . '/../composer.json'); + $this->locker = $this->composer->getLocker(); + } + + /** + * Retrieves required php version + * + * @return string + * @throws \Exception If attributes are missing in composer.lock file. + */ + public function getRequiredPhpVersion() + { + if ($this->isMagentoRoot()) { + $allPlatformReqs = $this->locker->getPlatformRequirements(true); + $requiredPhpVersion = $allPlatformReqs['php']->getPrettyConstraint(); + } else { + $packages = $this->locker->getLockedRepository()->getPackages(); + foreach ($packages as $package) { + /** @var \Composer\Package\CompletePackage $package */ + $packageName = $package->getPrettyName(); + if ($packageName === 'magento/product-community-edition') { + $phpRequirementLink = $package->getRequires()['php']; + $requiredPhpVersion = $phpRequirementLink->getPrettyConstraint(); + } + } + } + + if (!isset($requiredPhpVersion)) { + throw new \Exception('Cannot find php version requirement in \'composer.lock\' file'); + } + return $requiredPhpVersion; + } + + /** + * Retrieve list of required extensions + * + * Collect required extensions from composer.lock file + * + * @return array + * @throws \Exception If attributes are missing in composer.lock file. + */ + public function getRequiredExtensions() + { + if ($this->isMagentoRoot()) { + $allPlatformReqs = $this->locker->getPlatformRequirements(true); + foreach ($allPlatformReqs as $reqIndex => $constraint) { + if (substr($reqIndex, 0, 4) === 'ext-') { + $requiredExtensions[] = substr($reqIndex, 4); + } + } + } else { + $requiredExtensions = []; + + /** @var \Composer\Package\CompletePackage $package */ + foreach ($this->locker->getLockedRepository()->getPackages() as $package) { + $requires = $package->getRequires(); + $requires = array_merge($requires, $package->getDevRequires()); + foreach ($requires as $reqIndex => $constraint) { + if (substr($reqIndex, 0, 4) === 'ext-') { + $requiredExtensions[] = substr($reqIndex, 4); + } + } + } + } + + if (!isset($requiredExtensions)) { + throw new \Exception('Cannot find extensions in \'composer.lock\' file'); + } + return $requiredExtensions; + } + + /** + * Collect required packages from root composer.lock file + * + * @return array + */ + public function getRootRequiredPackages() + { + $packages = []; + /** @var PackageInterface $package */ + foreach ($this->locker->getLockedRepository()->getPackages() as $package) { + $packages[] = $package->getName(); + } + return $packages; + } + + /** + * Collect required packages and types from root composer.lock file + * + * @return array + */ + public function getRootRequiredPackagesAndTypes() + { + $packages = []; + /** @var PackageInterface $package */ + foreach ($this->locker->getLockedRepository()->getPackages() as $package) { + $packages[$package->getName()] = $package->getType(); + } + return $packages; + } + + /** + * Determines if Magento is the root package or it is included as a requirement. + * + * @return bool + */ + private function isMagentoRoot() + { + $rootPackage = $this->composer->getPackage(); + return ('magento/magento2ce' == $rootPackage->getName()); + } +} diff --git a/lib/internal/Magento/Framework/Composer/DependencyChecker.php b/lib/internal/Magento/Framework/Composer/DependencyChecker.php new file mode 100644 index 0000000000000000000000000000000000000000..edb3189d17b8c5e22313d07e48a8d9943f49229e --- /dev/null +++ b/lib/internal/Magento/Framework/Composer/DependencyChecker.php @@ -0,0 +1,90 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Composer; + +use Composer\Console\Application; +use Magento\Framework\App\Filesystem\DirectoryList; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Output\BufferedOutput; + +/** + * A class to check if there are any dependency to package(s) that exists in the codebase, regardless of package type + */ +class DependencyChecker +{ + /** + * @var Application + */ + private $composerApp; + + /** + * @var DirectoryList + */ + private $directoryList; + + /** + * Constructor + * + * @param Application $composerApp + * @param DirectoryList $directoryList + */ + public function __construct(Application $composerApp, DirectoryList $directoryList) + { + $this->composerApp = $composerApp; + $this->directoryList = $directoryList; + } + + /** + * Checks dependencies to package(s), returns array of dependencies in the format of + * 'package A' => [array of package names depending on package A] + * If $excludeSelf is set to true, items in $packages will be excluded in all + * "array of package names depending on package A" + * + * @param string[] $packages + * @param bool $excludeSelf + * @return string[] + */ + public function checkDependencies(array $packages, $excludeSelf = false) + { + $this->composerApp->setAutoExit(false); + $dependencies = []; + foreach ($packages as $package) { + $buffer = new BufferedOutput(); + $this->composerApp->resetComposer(); + $this->composerApp->run( + new ArrayInput( + ['command' => 'depends', '--working-dir' => $this->directoryList->getRoot(), 'package' => $package] + ), + $buffer + ); + $dependingPackages = $this->parseComposerOutput($buffer->fetch()); + if ($excludeSelf === true) { + $dependingPackages = array_values(array_diff($dependingPackages, $packages)); + } + $dependencies[$package] = $dependingPackages; + } + return $dependencies; + } + + /** + * Parse output from running composer remove command into an array of depending packages + * + * @param string $output + * @return string[] + */ + private function parseComposerOutput($output) + { + $rawLines = explode(PHP_EOL, $output); + $packages = []; + foreach ($rawLines as $rawLine) { + $parts = explode(' ', $rawLine); + if (count(explode('/', $parts[0])) == 2) { + $packages[] = $parts[0]; + } + } + return $packages; + } +} diff --git a/lib/internal/Magento/Framework/Composer/Remove.php b/lib/internal/Magento/Framework/Composer/Remove.php new file mode 100644 index 0000000000000000000000000000000000000000..7238d5439180f31fe1356f746f84424652f20db4 --- /dev/null +++ b/lib/internal/Magento/Framework/Composer/Remove.php @@ -0,0 +1,64 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Composer; + +use Composer\Console\Application; +use Magento\Framework\App\Filesystem\DirectoryList; +use Symfony\Component\Console\Input\ArrayInput; + +/** + * Class to run composer remove command + */ +class Remove +{ + /** + * Composer application + * + * @var Application + */ + private $composerApp; + + /** + * Directory List + * + * @var DirectoryList + */ + private $directoryList; + + /** + * Constructor + * + * @param Application $composerApp + * @param DirectoryList $directoryList + */ + public function __construct(Application $composerApp, DirectoryList $directoryList) + { + $this->composerApp = $composerApp; + $this->directoryList = $directoryList; + } + + /** + * Run 'composer remove' + * + * @param array $packages + * @return void + */ + public function remove(array $packages) + { + $this->composerApp->resetComposer(); + $this->composerApp->setAutoExit(false); + $vendor = include $this->directoryList->getPath(DirectoryList::CONFIG) . '/vendor_path.php'; + $this->composerApp->run( + new ArrayInput( + [ + 'command' => 'remove', + 'packages' => $packages, + '--working-dir' => $this->directoryList->getRoot() . '/' . $vendor . '/..' + ] + ) + ); + } +} diff --git a/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php b/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..46279d8fb1065375ed30370a506f70bf867847b5 --- /dev/null +++ b/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php @@ -0,0 +1,99 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Composer\Test\Unit; + +use Magento\Framework\Composer\DependencyChecker; + +class DependencyCheckerTest extends \PHPUnit_Framework_TestCase +{ + public function testCheckDependencies() + { + $composerApp = $this->getMock( + 'Composer\Console\Application', + ['setAutoExit', 'resetComposer', 'run'], + [], + '', + false + ); + $directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); + $directoryList->expects($this->exactly(2))->method('getRoot'); + $composerApp->expects($this->once())->method('setAutoExit')->with(false); + + $composerApp->expects($this->at(2))->method('run')->willReturnCallback( + function ($input, $buffer) { + $output = 'magento/package-b requires magento/package-a (1.0)' . PHP_EOL . + 'magento/package-c requires magento/package-a (1.0)' . PHP_EOL; + $buffer->writeln($output); + } + ); + $composerApp->expects($this->at(4))->method('run')->willReturnCallback( + function ($input, $buffer) { + $output = 'magento/package-c requires magento/package-b (1.0)' . PHP_EOL . + 'magento/package-d requires magento/package-b (1.0)' . PHP_EOL; + $buffer->writeln($output); + } + ); + + $dependencyChecker = new DependencyChecker($composerApp, $directoryList); + $expected = [ + 'magento/package-a' => ['magento/package-b', 'magento/package-c'], + 'magento/package-b' => ['magento/package-c', 'magento/package-d'], + ]; + $this->assertEquals( + $expected, + $dependencyChecker->checkDependencies(['magento/package-a', 'magento/package-b']) + ); + } + + public function testCheckDependenciesExcludeSelf() + { + $composerApp = $this->getMock( + 'Composer\Console\Application', + ['setAutoExit', 'resetComposer', 'run'], + [], + '', + false + ); + $directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); + $directoryList->expects($this->exactly(3))->method('getRoot'); + $composerApp->expects($this->once())->method('setAutoExit')->with(false); + + $composerApp->expects($this->at(2))->method('run')->willReturnCallback( + function ($input, $buffer) { + $output = 'magento/package-b requires magento/package-a (1.0)' . PHP_EOL . + 'magento/package-c requires magento/package-a (1.0)' . PHP_EOL; + $buffer->writeln($output); + } + ); + $composerApp->expects($this->at(4))->method('run')->willReturnCallback( + function ($input, $buffer) { + $output = 'magento/package-c requires magento/package-b (1.0)' . PHP_EOL . + 'magento/package-d requires magento/package-b (1.0)' . PHP_EOL; + $buffer->writeln($output); + } + ); + $composerApp->Expects($this->at(6))->method('run')->willReturnCallback( + function ($input, $buffer) { + $output = 'magento/package-d requires magento/package-c (1.0)' . PHP_EOL; + $buffer->writeln($output); + } + ); + + $dependencyChecker = new DependencyChecker($composerApp, $directoryList); + $expected = [ + 'magento/package-a' => [], + 'magento/package-b' => ['magento/package-d'], + 'magento/package-c' => ['magento/package-d'], + ]; + $this->assertEquals( + $expected, + $dependencyChecker->checkDependencies( + ['magento/package-a', 'magento/package-b', 'magento/package-c'], + true + ) + ); + } +} diff --git a/lib/internal/Magento/Framework/Data/Collection/AbstractDb.php b/lib/internal/Magento/Framework/Data/Collection/AbstractDb.php index e745a916a8092b6302250c7c86f6eda9601da9a1..3573fdb87f541e900636e9ed6d921649e35fedc7 100755 --- a/lib/internal/Magento/Framework/Data/Collection/AbstractDb.php +++ b/lib/internal/Magento/Framework/Data/Collection/AbstractDb.php @@ -8,7 +8,8 @@ namespace Magento\Framework\Data\Collection; use Magento\Framework\Data\Collection\Db\FetchStrategyInterface; use Magento\Framework\DB\Adapter\AdapterInterface; use Magento\Framework\DB\Select; -use Magento\Framework\Api\ExtensionAttribute\JoinData; +use Magento\Framework\Api\ExtensionAttribute\JoinDataInterface; +use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; use Psr\Log\LoggerInterface as Logger; /** @@ -87,11 +88,11 @@ abstract class AbstractDb extends \Magento\Framework\Data\Collection private $_fetchStrategy; /** - * Flag which determines if extension attributes were joined before the collection was loaded. + * Join processor is set only if extension attributes were joined before the collection was loaded. * - * @var callable|null + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface|null */ - protected $extensionAttributesExtractorCallback; + protected $extensionAttributesJoinProcessor; /** * @param EntityFactoryInterface $entityFactory @@ -743,7 +744,7 @@ abstract class AbstractDb extends \Magento\Framework\Data\Collection $this->_setIsLoaded(false); $this->_items = []; $this->_data = null; - $this->extensionAttributesExtractorCallback = null; + $this->extensionAttributesJoinProcessor = null; return $this; } @@ -756,11 +757,11 @@ abstract class AbstractDb extends \Magento\Framework\Data\Collection protected function _fetchAll(\Zend_Db_Select $select) { $data = $this->_fetchStrategy->fetchAll($select, $this->_bindParams); - if ($this->extensionAttributesExtractorCallback && is_callable($this->extensionAttributesExtractorCallback)) { + if ($this->extensionAttributesJoinProcessor) { foreach ($data as $key => $dataItem) { - $data[$key] = call_user_func_array( - $this->extensionAttributesExtractorCallback, - [$this->_itemObjectClass, $dataItem] + $data[$key] = $this->extensionAttributesJoinProcessor->extractExtensionAttributes( + $this->_itemObjectClass, + $dataItem ); } } @@ -812,32 +813,46 @@ abstract class AbstractDb extends \Magento\Framework\Data\Collection /** * Join extension attribute. * - * @param \Magento\Framework\Api\ExtensionAttribute\JoinData $join - * @param callable $extensionAttributesExtractorCallback + * @param JoinDataInterface $join + * @param JoinProcessorInterface $extensionAttributesJoinProcessor * @return $this */ - public function joinExtensionAttribute($join, $extensionAttributesExtractorCallback) - { + public function joinExtensionAttribute( + JoinDataInterface $join, + JoinProcessorInterface $extensionAttributesJoinProcessor + ) { $selectFrom = $this->getSelect()->getPart(\Zend_Db_Select::FROM); $joinRequired = !isset($selectFrom[$join->getReferenceTableAlias()]); if ($joinRequired) { + $joinOn = $this->getMainTableAlias() . '.' . $join->getJoinField() + . ' = ' . $join->getReferenceTableAlias() . '.' . $join->getReferenceField(); $this->getSelect()->joinLeft( [$join->getReferenceTableAlias() => $this->getResource()->getTable($join->getReferenceTable())], - $this->getMainTableAlias() . '.' . $join->getJoinField() - . ' = ' . $join->getReferenceTableAlias() . '.' . $join->getReferenceField(), + $joinOn, [] ); } $columns = []; foreach ($join->getSelectFields() as $selectField) { - $fieldAlias = $join->getReferenceTableAlias() . '_' . $selectField; - $columns[$fieldAlias] = $join->getReferenceTableAlias() . '.' . $selectField; + $fieldWIthDbPrefix = $selectField[JoinDataInterface::SELECT_FIELD_WITH_DB_PREFIX]; + $columns[$selectField[JoinDataInterface::SELECT_FIELD_INTERNAL_ALIAS]] = $fieldWIthDbPrefix; + $this->addFilterToMap($selectField[JoinDataInterface::SELECT_FIELD_EXTERNAL_ALIAS], $fieldWIthDbPrefix); } $this->getSelect()->columns($columns); - $this->extensionAttributesExtractorCallback = $extensionAttributesExtractorCallback; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; return $this; } + /** + * Get collection item object class name. + * + * @return string + */ + public function getItemObjectClass() + { + return $this->_itemObjectClass; + } + /** * Identify main table alias or its name if alias is not defined. * diff --git a/lib/internal/Magento/Framework/Module/ModuleList/Loader.php b/lib/internal/Magento/Framework/Module/ModuleList/Loader.php index b452c389205c5778517c5e27249b341259148d19..0321cc772fc3c683a9b723b10e1c187c5d5456a6 100644 --- a/lib/internal/Magento/Framework/Module/ModuleList/Loader.php +++ b/lib/internal/Magento/Framework/Module/ModuleList/Loader.php @@ -15,6 +15,8 @@ use Magento\Framework\Filesystem\DriverInterface; /** * Loader of module list information from the filesystem + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Loader { @@ -78,12 +80,13 @@ class Loader } /** - * Loads the full module list information + * Loads the full module list information. Excludes modules specified in $exclude. * + * @param array $exclude * @throws \Magento\Framework\Exception\LocalizedException * @return array */ - public function load() + public function load(array $exclude = []) { $result = []; foreach ($this->getModuleConfigs() as list($file, $contents)) { @@ -101,7 +104,9 @@ class Loader $data = $this->converter->convert($this->parser->getDom()); $name = key($data); - $result[$name] = $data[$name]; + if (!in_array($name, $exclude)) { + $result[$name] = $data[$name]; + } } return $this->sortBySequence($result); } diff --git a/lib/internal/Magento/Framework/Module/PackageInfo.php b/lib/internal/Magento/Framework/Module/PackageInfo.php index ad74b5d0cb19bd5b7dd9a20f724099c91e9bfb63..f45173da62d495c89ff64460fed37706419812a6 100644 --- a/lib/internal/Magento/Framework/Module/PackageInfo.php +++ b/lib/internal/Magento/Framework/Module/PackageInfo.php @@ -118,6 +118,18 @@ class PackageInfo return isset($this->packageModuleMap[$packageName]) ? $this->packageModuleMap[$packageName] : ''; } + /** + * Get package name of a module + * + * @param string $moduleName + * @return string + */ + public function getPackageName($moduleName) + { + $this->load(); + return array_search($moduleName, $this->packageModuleMap) ?: ''; + } + /** * Convert an array of package names to module names * diff --git a/lib/internal/Magento/Framework/Module/Test/Unit/ModuleList/LoaderTest.php b/lib/internal/Magento/Framework/Module/Test/Unit/ModuleList/LoaderTest.php index 5cb38c5be6838311f3847a10f0138942facc00a9..6705d04d35c3a67df6554c805cdd69bd063a209d 100644 --- a/lib/internal/Magento/Framework/Module/Test/Unit/ModuleList/LoaderTest.php +++ b/lib/internal/Magento/Framework/Module/Test/Unit/ModuleList/LoaderTest.php @@ -106,6 +106,38 @@ class LoaderTest extends \PHPUnit_Framework_TestCase } } + public function testLoadExclude() + { + $fixture = [ + 'a' => ['name' => 'a', 'sequence' => []], // a is on its own + 'b' => ['name' => 'b', 'sequence' => ['c']], // b is after c + 'c' => ['name' => 'c', 'sequence' => ['a']], // c is after a + 'd' => ['name' => 'd', 'sequence' => ['a']], // d is after a + // exclude d, so expected sequence is a -> c -> b + ]; + $this->dir->expects($this->once())->method('search')->willReturn(['a', 'b', 'c', 'd']); + $this->dir->expects($this->exactly(4))->method('readFile')->will($this->returnValueMap([ + ['a', null, null, self::$sampleXml], + ['b', null, null, self::$sampleXml], + ['c', null, null, self::$sampleXml], + ['d', null, null, self::$sampleXml], + ])); + $this->registry->expects($this->once()) + ->method('getModulePaths') + ->willReturn([]); + $this->converter->expects($this->at(0))->method('convert')->willReturn(['a' => $fixture['a']]); + $this->converter->expects($this->at(1))->method('convert')->willReturn(['b' => $fixture['b']]); + $this->converter->expects($this->at(2))->method('convert')->willReturn(['c' => $fixture['c']]); + $this->converter->expects($this->at(3))->method('convert')->willReturn(['d' => $fixture['d']]); + $this->parser->expects($this->atLeastOnce())->method('loadXML'); + $this->parser->expects($this->atLeastOnce())->method('getDom'); + $result = $this->loader->load(['d']); + $this->assertSame(['a', 'c', 'b'], array_keys($result)); + $this->assertSame($fixture['a'], $result['a']); + $this->assertSame($fixture['b'], $result['b']); + $this->assertSame($fixture['c'], $result['c']); + } + /** * @expectedException \Exception * @expectedExceptionMessage Circular sequence reference from 'b' to 'a' diff --git a/lib/internal/Magento/Framework/Module/Test/Unit/PackageInfoTest.php b/lib/internal/Magento/Framework/Module/Test/Unit/PackageInfoTest.php index ddb327f03a5df5a8ee6bcb5bddd16c56209b8b65..45eaa3cbb2f1df5762797793d99b03ae14d87b24 100644 --- a/lib/internal/Magento/Framework/Module/Test/Unit/PackageInfoTest.php +++ b/lib/internal/Magento/Framework/Module/Test/Unit/PackageInfoTest.php @@ -59,6 +59,15 @@ class PackageInfoTest extends \PHPUnit_Framework_TestCase $this->assertEquals('E', $this->packageInfo->getModuleName('e')); } + public function testGetPackageName() + { + $this->assertEquals('a', $this->packageInfo->getPackageName('A')); + $this->assertEquals('b', $this->packageInfo->getPackageName('B')); + $this->assertEquals('c', $this->packageInfo->getPackageName('C')); + $this->assertEquals('d', $this->packageInfo->getPackageName('D')); + $this->assertEquals('e', $this->packageInfo->getPackageName('E')); + } + public function testGetRequireReturnModuleName() { $this->assertEquals(['B'], $this->packageInfo->getRequire('A')); diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php index 22857fcf9bcfae8bfe3f0de7f675263cfdae33ee..496ba2e8d173a62d6fbc89560d3925af7ff43234 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php +++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php @@ -73,6 +73,19 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract ], ] ], + [ + 'name' => 'extensionAttributesJoinProcessor', + 'visibility' => 'protected', + 'docblock' => [ + 'shortDescription' => 'Extension attributes join processor.', + 'tags' => [ + [ + 'name' => 'var', + 'description' => '\Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface', + ], + ], + ] + ], ]; return $properties; } @@ -138,13 +151,18 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract 'name' => $this->_getSourceCollectionFactoryPropertyName(), 'type' => $this->_getCollectionFactoryClassName(), ], + [ + 'name' => 'extensionAttributesJoinProcessor', + 'type' => '\Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface', + ], ], 'body' => "\$this->" . $this->_getSourcePersistorPropertyName() . " = \$" . $this->_getSourcePersistorPropertyName() . ";\n" . "\$this->" . $this->_getSourceCollectionFactoryPropertyName() - . " = \$" . $this->_getSourceCollectionFactoryPropertyName() . ";" + . " = \$" . $this->_getSourceCollectionFactoryPropertyName() . ";\n" + . "\$this->extensionAttributesJoinProcessor = \$extensionAttributesJoinProcessor;" , 'docblock' => [ 'shortDescription' => ucfirst(static::ENTITY_TYPE) . ' constructor', @@ -158,6 +176,11 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract 'description' => $this->_getCollectionFactoryClassName() . " \$" . $this->_getSourceCollectionFactoryPropertyName() ], + [ + 'name' => 'param', + 'description' => '\Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface' + . " \$extensionAttributesJoinProcessor" + ], ], ] ]; @@ -362,6 +385,10 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract 'name' => 'param', 'description' => $this->getSourceClassName() . ' $entity', ], + [ + 'name' => 'return', + 'description' => 'bool', + ], ], ] ]; @@ -393,6 +420,10 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract 'name' => 'param', 'description' => 'int $id', ], + [ + 'name' => 'return', + 'description' => 'bool', + ], ], ] ]; @@ -428,14 +459,15 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract } /** - * Returns find() method + * Returns getList() method * * @return string */ protected function _getGetListMethod() { $body = "\$collection = \$this->" . $this->_getSourceCollectionFactoryPropertyName() . "->create();\n" - . "foreach(\$criteria->getFilterGroups() as \$filterGroup) {\n" + . "\$this->extensionAttributesJoinProcessor->process(\$collection);\n" + . "foreach (\$criteria->getFilterGroups() as \$filterGroup) {\n" . " foreach (\$filterGroup->getFilters() as \$filter) {\n" . " \$condition = \$filter->getConditionType() ? \$filter->getConditionType() : 'eq';\n" . " \$collection->addFieldToFilter(\$filter->getField(), [\$condition => \$filter->getValue()]);\n" diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/GenerateRepositoryTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/GenerateRepositoryTest.php index 33ff3368e02de494477962c581144a384092bf0e..a2744ca17becda4478dff35173d9982b33ba2ae3 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/GenerateRepositoryTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/GenerateRepositoryTest.php @@ -58,8 +58,12 @@ class GenerateRepositoryTest extends \PHPUnit_Framework_TestCase ->with('\Magento\Framework\ObjectManager\Code\Generator\SampleRepository') ->willReturn('SampleRepository.php'); + $repositoryCode = file_get_contents(__DIR__ . '/_files/SampleRepository.txt'); + $this->ioObjectMock->expects($this->once())->method('writeResultFile') + ->with('SampleRepository.php', $repositoryCode); + $model->expects($this->once())->method('_validateData')->willReturn(true); - $this->assertEquals('SampleRepository.php', $model->generate()); + $this->assertEquals('SampleRepository.php', $model->generate(), "Generated repository is invalid."); } /** diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt index 4b1ee7b0108376ec5bfb89532fbe07aeed3b77d5..d135ca64dd1fccfc3382920cd9d3a6d02daa6750 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt @@ -1,7 +1,7 @@ namespace Magento\Framework\ObjectManager\Code\Generator; /** - * Repository class for + * Repository class for @see * \Magento\Framework\ObjectManager\Code\Generator\SampleInterface */ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generator\SampleRepositoryInterface @@ -22,7 +22,7 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato protected $sampleInterfaceSearchResultFactory = null; /** - * Magento\Framework\ObjectManager\Code\Generator\SampleInterface[] + * \Magento\Framework\ObjectManager\Code\Generator\SampleInterface[] * * @var array */ @@ -30,6 +30,13 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato ); + /** + * Extension attributes join processor. + * + * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + */ + protected $extensionAttributesJoinProcessor = null; + /** * Repository constructor * @@ -38,11 +45,14 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato * @param * \Magento\Framework\ObjectManager\Code\Generator\SampleSearchResultInterfaceFactory * $sampleInterfaceSearchResultFactory + * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface + * $extensionAttributesJoinProcessor */ - public function __construct(\Magento\Framework\ObjectManager\Code\Generator\SampleInterfacePersistor $sampleInterfacePersistor, \Magento\Framework\ObjectManager\Code\Generator\SampleSearchResultInterfaceFactory $sampleInterfaceSearchResultFactory) + public function __construct(\Magento\Framework\ObjectManager\Code\Generator\SampleInterfacePersistor $sampleInterfacePersistor, \Magento\Framework\ObjectManager\Code\Generator\SampleSearchResultInterfaceFactory $sampleInterfaceSearchResultFactory, \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor) { $this->sampleInterfacePersistor = $sampleInterfacePersistor; $this->sampleInterfaceSearchResultFactory = $sampleInterfaceSearchResultFactory; + $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; } /** @@ -53,13 +63,13 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato * @throws \Magento\Framework\Exception\InputException * @throws \Magento\Framework\Exception\NoSuchEntityException */ - public function get($id, $arguments = array()) + public function get($id) { if (!$id) { throw new \Magento\Framework\Exception\InputException('ID required'); } if (!isset($this->registry[$id])) { - $entity = $this->sampleInterfacePersistor->loadEntity($id, $arguments); + $entity = $this->sampleInterfacePersistor->loadEntity($id); if (!$entity->getId()) { throw new \Magento\Framework\Exception\NoSuchEntityException('Requested entity doesn\'t exist'); } @@ -94,13 +104,13 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato * Find entities by criteria * * @param \Magento\Framework\Api\SearchCriteria $criteria - * @param array $arguments - * @return \Magento\Framework\ObjectManager\Code\Generator\Sample[] + * @return \Magento\Framework\ObjectManager\Code\Generator\SampleInterface[] */ - public function find(\Magento\Framework\Api\SearchCriteria $criteria, $arguments = array()) + public function getList(\Magento\Framework\Api\SearchCriteria $criteria) { $collection = $this->sampleInterfaceSearchResultFactory->create(); - foreach($criteria->getFilterGroups() as $filterGroup) { + $this->extensionAttributesJoinProcessor->process($collection); + foreach ($criteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); @@ -125,11 +135,25 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato * Register entity to delete * * @param \Magento\Framework\ObjectManager\Code\Generator\SampleInterface $entity + * @return bool + */ + public function delete(\Magento\Framework\ObjectManager\Code\Generator\SampleInterface $entity) + { + $this->sampleInterfacePersistor->registerDeleted($entity); + return $this->sampleInterfacePersistor->doPersistEntity($entity); + } + + /** + * Delete entity by Id + * + * @param int $id + * @return bool */ - public function delete(\Magento\Framework\ObjectManager\Code\Generator\SampleInterface $entity, $arguments = array()) + public function deleteById($id) { + $entity = $this->get($id); $this->sampleInterfacePersistor->registerDeleted($entity); - $this->sampleInterfacePersistor->save($entity); + return $this->sampleInterfacePersistor->doPersistEntity($entity); } /** @@ -147,9 +171,11 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato * Perform persist operations for one entity * * @param \Magento\Framework\ObjectManager\Code\Generator\SampleInterface $entity + * @return \Magento\Framework\ObjectManager\Code\Generator\SampleInterface */ - public function save(\Magento\Framework\ObjectManager\Code\Generator\SampleInterface $entity, $arguments = array()) + public function save(\Magento\Framework\ObjectManager\Code\Generator\SampleInterface $entity) { - return $this->sampleInterfacePersistor->doPersistEntity($entity); + $this->sampleInterfacePersistor->doPersistEntity($entity); + return $entity; } } diff --git a/lib/internal/Magento/Framework/Setup/BackupRollback.php b/lib/internal/Magento/Framework/Setup/BackupRollback.php new file mode 100755 index 0000000000000000000000000000000000000000..57aaafd526a7da206994ae347742256aeb9d75e6 --- /dev/null +++ b/lib/internal/Magento/Framework/Setup/BackupRollback.php @@ -0,0 +1,293 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\Setup; + +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Backup\Factory; +use Magento\Framework\Backup\Exception\NotEnoughPermissions; +use Magento\Framework\Backup\Filesystem; +use Magento\Framework\Backup\Filesystem\Helper; +use Magento\Framework\Exception\LocalizedException; +use Magento\Framework\Filesystem\Driver\File; +use Magento\Framework\ObjectManagerInterface; +use Magento\Framework\Phrase; + +/** + * Class to deal with backup and rollback functionality for database and Code base + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class BackupRollback +{ + /** + * Default backup directory + */ + const DEFAULT_BACKUP_DIRECTORY = 'backups'; + + /** + * Object Manager + * + * @var ObjectManagerInterface + */ + private $objectManager; + + /** + * Logger + * + * @var LoggerInterface + */ + private $log; + + /** + * Filesystem Directory List + * + * @var DirectoryList + */ + private $directoryList; + + /** + * File + * + * @var File + */ + private $file; + + /** + * Constructor + * + * @param ObjectManagerInterface $objectManager + * @param LoggerInterface $log + * @param DirectoryList $directoryList + * @param File $file + */ + public function __construct( + ObjectManagerInterface $objectManager, + LoggerInterface $log, + DirectoryList $directoryList, + File $file + ) { + $this->objectManager = $objectManager; + $this->log = $log; + $this->directoryList = $directoryList; + $this->file = $file; + } + + /** + * Take backup for code base + * + * @param int $time + * @param string $type + * @return void + * @throws LocalizedException + */ + public function codeBackup($time, $type = Factory::TYPE_FILESYSTEM) + { + /** @var \Magento\Framework\Backup\Filesystem $fsBackup */ + $fsBackup = $this->objectManager->create('Magento\Framework\Backup\Filesystem'); + $fsBackup->setRootDir($this->directoryList->getRoot()); + if ($type === Factory::TYPE_FILESYSTEM) { + $fsBackup->addIgnorePaths($this->getCodeBackupIgnorePaths()); + $granularType = 'Code'; + $fsBackup->setName('code'); + } elseif ($type === Factory::TYPE_MEDIA) { + $fsBackup->addIgnorePaths($this->getMediaBackupIgnorePaths()); + $granularType = 'Media'; + $fsBackup->setName('media'); + } else { + throw new LocalizedException(new Phrase("This backup type \'$type\' is not supported.")); + } + $backupsDir = $this->directoryList->getPath(DirectoryList::VAR_DIR) . '/' . self::DEFAULT_BACKUP_DIRECTORY; + if (!$this->file->isExists($backupsDir)) { + $this->file->createDirectory($backupsDir, 0777); + } + $fsBackup->setBackupsDir($backupsDir); + $fsBackup->setBackupExtension('tgz'); + $fsBackup->setTime($time); + $this->log->log($granularType . ' backup is starting...'); + $fsBackup->create(); + $this->log->log( + $granularType. ' backup filename: ' . $fsBackup->getBackupFilename() + . ' (The archive can be uncompressed with 7-Zip on Windows systems)' + ); + $this->log->log($granularType . ' backup path: ' . $fsBackup->getBackupPath()); + $this->log->logSuccess($granularType . ' backup completed successfully.'); + } + + /** + * Roll back code base + * + * @param string $rollbackFile + * @param string $type + * @return void + * @throws LocalizedException + */ + public function codeRollback($rollbackFile, $type = Factory::TYPE_FILESYSTEM) + { + if (preg_match('/[0-9]_(filesystem)_(code|media)\.(tgz)$/', $rollbackFile) !== 1) { + throw new LocalizedException(new Phrase('Invalid rollback file.')); + } + $backupsDir = $this->directoryList->getPath(DirectoryList::VAR_DIR) . '/' . self::DEFAULT_BACKUP_DIRECTORY; + if (!$this->file->isExists($backupsDir . '/' . $rollbackFile)) { + throw new LocalizedException(new Phrase('The rollback file does not exist.')); + } + /** @var \Magento\Framework\Backup\Filesystem $fsRollback */ + $fsRollback = $this->objectManager->create('Magento\Framework\Backup\Filesystem'); + if ($type === Factory::TYPE_FILESYSTEM) { + $ignorePaths = $this->getCodeBackupIgnorePaths(); + $granularType = 'Code'; + $fsRollback->setName('code'); + } elseif ($type === Factory::TYPE_MEDIA) { + $ignorePaths = $this->getMediaBackupIgnorePaths(); + $granularType = 'Media'; + $fsRollback->setName('media'); + } else { + throw new LocalizedException(new Phrase("This backup type \'$type\' is not supported.")); + } + /** @var Helper $checkWritable */ + $checkWritable = $this->objectManager->create('Magento\Framework\Backup\Filesystem\Helper'); + $filesInfo = $checkWritable->getInfo( + $this->directoryList->getRoot(), + Helper::INFO_WRITABLE, + $ignorePaths + ); + if (!$filesInfo['writable']) { + throw new NotEnoughPermissions( + new Phrase('Unable to make rollback because not all files are writable') + ); + } + $fsRollback->setRootDir($this->directoryList->getRoot()); + $fsRollback->addIgnorePaths($ignorePaths); + $fsRollback->setBackupsDir($backupsDir); + $fsRollback->setBackupExtension('tgz'); + $time = explode('_', $rollbackFile); + $fsRollback->setTime($time[0]); + $this->log->log($granularType . ' rollback is starting ...'); + $fsRollback->rollback(); + $this->log->log($granularType . ' rollback filename: ' . $fsRollback->getBackupFilename()); + $this->log->log($granularType . ' rollback file path: ' . $fsRollback->getBackupPath()); + $this->log->logSuccess($granularType . ' rollback completed successfully.'); + } + + /** + * Take backup for database + * + * @param int $time + * @return void + */ + public function dbBackup($time) + { + $this->setAreaCode(); + /** @var \Magento\Framework\Backup\Db $dbBackup */ + $dbBackup = $this->objectManager->create('Magento\Framework\Backup\Db'); + $dbBackup->setRootDir($this->directoryList->getRoot()); + $backupsDir = $this->directoryList->getPath(DirectoryList::VAR_DIR) . '/' . self::DEFAULT_BACKUP_DIRECTORY; + if (!$this->file->isExists($backupsDir)) { + $this->file->createDirectory($backupsDir, 0777); + } + $dbBackup->setBackupsDir($backupsDir); + $dbBackup->setBackupExtension('gz'); + $dbBackup->setTime($time); + $this->log->log('DB backup is starting...'); + $dbBackup->create(); + $this->log->log( + 'DB backup filename: ' . $dbBackup->getBackupFilename() + . ' (The archive can be uncompressed with 7-Zip on Windows systems)' + ); + $this->log->log('DB backup path: ' . $dbBackup->getBackupPath()); + $this->log->logSuccess('DB backup completed successfully.'); + } + + /** + * Roll back database + * + * @param string $rollbackFile + * @return void + * @throws LocalizedException + */ + public function dbRollback($rollbackFile) + { + if (preg_match('/[0-9]_(db).(gz)$/', $rollbackFile) !== 1) { + throw new LocalizedException(new Phrase('Invalid rollback file.')); + } + $backupsDir = $this->directoryList->getPath(DirectoryList::VAR_DIR) . '/' . self::DEFAULT_BACKUP_DIRECTORY; + if (!$this->file->isExists($backupsDir . '/' . $rollbackFile)) { + throw new LocalizedException(new Phrase('The rollback file does not exist.')); + } + $this->setAreaCode(); + /** @var \Magento\Framework\Backup\Db $dbRollback */ + $dbRollback = $this->objectManager->create('Magento\Framework\Backup\Db'); + $dbRollback->setRootDir($this->directoryList->getRoot()); + $dbRollback->setBackupsDir($backupsDir); + $dbRollback->setBackupExtension('gz'); + $time = explode('_', $rollbackFile); + if (count($time) === 3) { + $thirdPart = explode('.', $time[2]); + $dbRollback->setName($thirdPart[0]); + } + $dbRollback->setTime($time[0]); + $this->log->log('DB rollback is starting...'); + $dbRollback->setResourceModel($this->objectManager->create('Magento\Backup\Model\Resource\Db')); + $dbRollback->rollback(); + $this->log->log('DB rollback filename: ' . $dbRollback->getBackupFilename()); + $this->log->log('DB rollback path: ' . $dbRollback->getBackupPath()); + $this->log->logSuccess('DB rollback completed successfully.'); + } + + /** + * Sets area code to start a session for database backup and rollback + * + * @return void + */ + private function setAreaCode() + { + $areaCode = 'adminhtml'; + /** @var \Magento\Framework\App\State $appState */ + $appState = $this->objectManager->get('Magento\Framework\App\State'); + $appState->setAreaCode($areaCode); + /** @var \Magento\Framework\App\ObjectManager\ConfigLoader $configLoader */ + $configLoader = $this->objectManager->get('Magento\Framework\App\ObjectManager\ConfigLoader'); + $this->objectManager->configure($configLoader->load($areaCode)); + } + + /** + * Get paths that should be excluded during iterative searches for locations for code backup only + * + * @return array + */ + private function getCodeBackupIgnorePaths() + { + return [ + $this->directoryList->getPath(DirectoryList::MEDIA), + $this->directoryList->getPath(DirectoryList::STATIC_VIEW), + $this->directoryList->getPath(DirectoryList::VAR_DIR), + $this->directoryList->getRoot() . '/.idea', + $this->directoryList->getRoot() . '/.svn', + $this->directoryList->getRoot() . '/.git' + ]; + } + + /** + * Get paths that should be excluded during iterative searches for locations for media backup only + * + * @return array + */ + private function getMediaBackupIgnorePaths() + { + $ignorePaths = []; + foreach (new \DirectoryIterator($this->directoryList->getRoot()) as $item) { + if (!$item->isDot() && ($this->directoryList->getPath(DirectoryList::PUB) !== $item->getPathname())) { + $ignorePaths[] = str_replace('\\', '/', $item->getPathname()); + } + } + foreach (new \DirectoryIterator($this->directoryList->getPath(DirectoryList::PUB)) as $item) { + if (!$item->isDot() && ($this->directoryList->getPath(DirectoryList::MEDIA) !== $item->getPathname())) { + $ignorePaths[] = str_replace('\\', '/', $item->getPathname()); + } + } + return $ignorePaths; + } +} diff --git a/lib/internal/Magento/Framework/Setup/BackupRollbackFactory.php b/lib/internal/Magento/Framework/Setup/BackupRollbackFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..a52448c745f247a80ad7bff0928e32d4713097fd --- /dev/null +++ b/lib/internal/Magento/Framework/Setup/BackupRollbackFactory.php @@ -0,0 +1,39 @@ +<?php +/** + * Factory for Acl resource + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Setup; + +use Magento\Framework\ObjectManagerInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class BackupRollbackFactory +{ + /** + * @var ObjectManagerInterface + */ + protected $_objectManager; + + /** + * @param ObjectManagerInterface $objectManager + */ + public function __construct(ObjectManagerInterface $objectManager) + { + $this->_objectManager = $objectManager; + } + + /** + * Create and return BackupRollback + * + * @param OutputInterface $output + * @return BackupRollback + */ + public function create($output) + { + $log = $this->_objectManager->create('Magento\Framework\Setup\ConsoleLogger', ['output' => $output]); + return $this->_objectManager->create('Magento\Framework\Setup\BackupRollback', ['log' => $log]); + } +} diff --git a/setup/src/Magento/Setup/Model/ConsoleLogger.php b/lib/internal/Magento/Framework/Setup/ConsoleLogger.php similarity index 98% rename from setup/src/Magento/Setup/Model/ConsoleLogger.php rename to lib/internal/Magento/Framework/Setup/ConsoleLogger.php index 3bcd21aabe083ce1066554ca661e2b4e270e2916..6deb7259c0c854a7d6eb472ce0550f3093231c57 100644 --- a/setup/src/Magento/Setup/Model/ConsoleLogger.php +++ b/lib/internal/Magento/Framework/Setup/ConsoleLogger.php @@ -4,7 +4,7 @@ * See COPYING.txt for license details. */ -namespace Magento\Setup\Model; +namespace Magento\Framework\Setup; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Formatter\OutputFormatterStyle; diff --git a/setup/src/Magento/Setup/Model/LoggerInterface.php b/lib/internal/Magento/Framework/Setup/LoggerInterface.php similarity index 96% rename from setup/src/Magento/Setup/Model/LoggerInterface.php rename to lib/internal/Magento/Framework/Setup/LoggerInterface.php index 8803acd58883e879987b38f9b22f87986f4ac697..7ebe3838e265c22d81cd4023757e09f00748e947 100644 --- a/setup/src/Magento/Setup/Model/LoggerInterface.php +++ b/lib/internal/Magento/Framework/Setup/LoggerInterface.php @@ -4,7 +4,7 @@ * See COPYING.txt for license details. */ -namespace Magento\Setup\Model; +namespace Magento\Framework\Setup; /** * Interface to Log Message in Setup diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackFactoryTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackFactoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2ad4407f0e3d15ac6f79b6dad096a16478a79895 --- /dev/null +++ b/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackFactoryTest.php @@ -0,0 +1,32 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Setup\Test\Unit; + +use Magento\Framework\Setup\BackupRollbackFactory; + +class BackupRollbackFactoryTest extends \PHPUnit_Framework_TestCase +{ + public function testCreate() + { + $objectManager = $this->getMockForAbstractClass('Magento\Framework\ObjectManagerInterface', [], '', false); + $consoleLogger = $this->getMock('Magento\Framework\Setup\ConsoleLogger', [], [], '', false); + $factory = $this->getMock('Magento\Framework\Setup\BackupRollback', [], [], '', false); + $output = $this->getMockForAbstractClass( + 'Symfony\Component\Console\Output\OutputInterface', + [], + '', + false + ); + $objectManager->expects($this->exactly(2)) + ->method('create') + ->will($this->returnValueMap([ + ['Magento\Framework\Setup\ConsoleLogger', ['output' => $output], $consoleLogger], + ['Magento\Framework\Setup\BackupRollback', ['log' => $consoleLogger], $factory], + ])); + $model = new BackupRollbackFactory($objectManager); + $this->assertInstanceOf('Magento\Framework\Setup\BackupRollback', $model->create($output)); + } +} diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e29f90c800fd32cc860d54661c8491a8800d1014 --- /dev/null +++ b/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackTest.php @@ -0,0 +1,227 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Setup\Test\Unit; + +use Magento\Framework\Backup\Factory; +use Magento\Framework\Setup\BackupRollback; +use Magento\Framework\Setup\LoggerInterface; + +class BackupRollbackTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $objectManager; + + /** + * @var LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $log; + + /** + * @var \Magento\Framework\App\Filesystem\DirectoryList|\PHPUnit_Framework_MockObject_MockObject + */ + private $directoryList; + + /** + * @var BackupRollback + */ + private $model; + + /** + * @var \Magento\Framework\Filesystem\Driver\File|\PHPUnit_Framework_MockObject_MockObject + */ + private $file; + + /** + * @var \Magento\Framework\Backup\Filesystem|\PHPUnit_Framework_MockObject_MockObject + */ + private $filesystem; + + /** + * @var \Magento\Framework\Backup\Db|\PHPUnit_Framework_MockObject_MockObject + */ + private $database; + + /** + * @var string + */ + private $path; + + public function setUp() + { + $this->objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface', [], [], '', false); + $this->log = $this->getMock('Magento\Framework\Setup\LoggerInterface', [], [], '', false); + $this->directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); + $this->path = realpath(__DIR__); + $this->directoryList->expects($this->any()) + ->method('getRoot') + ->willReturn($this->path); + $this->directoryList->expects($this->any()) + ->method('getPath') + ->willReturn($this->path); + $this->file = $this->getMock('Magento\Framework\Filesystem\Driver\File', [], [], '', false); + $this->filesystem = $this->getMock('Magento\Framework\Backup\Filesystem', [], [], '', false); + $this->database = $this->getMock('Magento\Framework\Backup\Db', [], [], '', false); + $helper = $this->getMock('Magento\Framework\Backup\Filesystem\Helper', [], [], '', false); + $helper->expects($this->any()) + ->method('getInfo') + ->willReturn(['writable' => true]); + $configLoader = $this->getMock('Magento\Framework\App\ObjectManager\ConfigLoader', [], [], '', false); + $configLoader->expects($this->any()) + ->method('load') + ->willReturn([]); + $this->objectManager->expects($this->any()) + ->method('get') + ->will($this->returnValueMap([ + ['Magento\Framework\App\State', $this->getMock('Magento\Framework\App\State', [], [], '', false)], + ['Magento\Framework\App\ObjectManager\ConfigLoader', $configLoader], + ])); + $this->objectManager->expects($this->any()) + ->method('create') + ->will($this->returnValueMap([ + ['Magento\Framework\Backup\Filesystem\Helper', [], $helper], + ['Magento\Framework\Backup\Filesystem', [], $this->filesystem], + ['Magento\Framework\Backup\Db', [], $this->database], + ])); + $this->model = new BackupRollback( + $this->objectManager, + $this->log, + $this->directoryList, + $this->file + ); + } + + public function testCodeBackup() + { + $this->setupCodeBackupRollback(); + $this->filesystem->expects($this->once()) + ->method('create'); + $this->file->expects($this->once())->method('isExists')->with($this->path . '/backups')->willReturn(false); + $this->file->expects($this->once())->method('createDirectory')->with($this->path . '/backups', 0777); + $this->model->codeBackup(time()); + } + + /** + * @expectedException \Magento\Framework\Exception\LocalizedException + * @expectedExceptionMessage This backup type \'txt\' is not supported. + */ + public function testCodeBackupWithInvalidType() + { + $this->model->codeBackup(time(), 'txt'); + } + + public function testCodeRollback() + { + $this->filesystem->expects($this->once())->method('rollback'); + $this->setupCodeBackupRollback(); + $this->file->expects($this->once()) + ->method('isExists') + ->with($this->path . '/backups/12345_filesystem_code.tgz') + ->willReturn(true); + $this->model->codeRollback('12345_filesystem_code.tgz'); + } + + /** + * @expectedException \Magento\Framework\Exception\LocalizedException + * @expectedExceptionMessage The rollback file does not exist. + */ + public function testCodeRollbackWithInvalidFilePath() + { + $this->file->expects($this->once()) + ->method('isExists') + ->willReturn(false); + $this->model->codeRollback('12345_filesystem_code.tgz'); + } + + /** + * @expectedException \Magento\Framework\Exception\LocalizedException + * @expectedExceptionMessage Invalid rollback file. + */ + public function testCodeRollbackWithInvalidFileType() + { + $this->model->codeRollback('RollbackFile_A.txt'); + } + + public function testMediaBackup() + { + $this->setupCodeBackupRollback(); + $this->filesystem->expects($this->once()) + ->method('create'); + $this->file->expects($this->once())->method('isExists')->with($this->path . '/backups')->willReturn(false); + $this->file->expects($this->once())->method('createDirectory')->with($this->path . '/backups', 0777); + $this->model->codeBackup(time(), Factory::TYPE_MEDIA); + } + + public function testMediaRollback() + { + $this->filesystem->expects($this->once())->method('rollback'); + $this->setupCodeBackupRollback(); + $this->file->expects($this->once()) + ->method('isExists') + ->with($this->path . '/backups/12345_filesystem_media.tgz') + ->willReturn(true); + $this->model->codeRollback('12345_filesystem_media.tgz', Factory::TYPE_MEDIA); + } + + public function testDbBackup() + { + $this->setupDbBackupRollback(); + $this->database->expects($this->once())->method('create'); + $this->file->expects($this->once())->method('isExists')->willReturn(false); + $this->file->expects($this->once())->method('createDirectory'); + $this->model->dbBackup(time()); + } + + public function testDbRollback() + { + $this->setupDbBackupRollback(); + $this->database->expects($this->once())->method('rollback'); + $this->file->expects($this->once()) + ->method('isExists') + ->with($this->path . '/backups/12345_db.gz') + ->willReturn(true); + $this->model->dbRollback('12345_db.gz'); + } + + private function setupCodeBackupRollback() + { + $this->filesystem->expects($this->once()) + ->method('addIgnorePaths'); + $this->filesystem->expects($this->once()) + ->method('setBackupsDir'); + $this->filesystem->expects($this->once()) + ->method('setBackupExtension'); + $this->filesystem->expects($this->once()) + ->method('setTime'); + $this->filesystem->expects($this->once()) + ->method('getBackupFilename') + ->willReturn('RollbackFile_A.tgz'); + $this->filesystem->expects($this->once()) + ->method('getBackupPath') + ->willReturn('pathToFile/12345_filesystem_code.tgz'); + $this->log->expects($this->once()) + ->method('logSuccess'); + } + + private function setupDbBackupRollback() + { + $this->database->expects($this->once()) + ->method('setBackupsDir'); + $this->database->expects($this->once()) + ->method('setBackupExtension'); + $this->database->expects($this->once()) + ->method('setTime'); + $this->database->expects($this->once()) + ->method('getBackupFilename') + ->willReturn('RollbackFile_A.gz'); + $this->database->expects($this->once()) + ->method('getBackupPath') + ->willReturn('pathToFile/12345_db.tgz'); + $this->log->expects($this->once()) + ->method('logSuccess'); + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Model/ConsoleLoggerTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/ConsoleLoggerTest.php similarity index 93% rename from setup/src/Magento/Setup/Test/Unit/Model/ConsoleLoggerTest.php rename to lib/internal/Magento/Framework/Setup/Test/Unit/ConsoleLoggerTest.php index af381ada33f4db5564b64cc1ad1cfe359c3a68ac..24f07ae459f9efac0dd9e50e47e5d27f0abbf2c1 100644 --- a/setup/src/Magento/Setup/Test/Unit/Model/ConsoleLoggerTest.php +++ b/lib/internal/Magento/Framework/Setup/Test/Unit/ConsoleLoggerTest.php @@ -4,9 +4,9 @@ * See COPYING.txt for license details. */ -namespace Magento\Setup\Test\Unit\Model; +namespace Magento\Framework\Setup\Test\Unit; -use Magento\Setup\Model\ConsoleLogger; +use Magento\Framework\Setup\ConsoleLogger; class ConsoleLoggerTest extends \PHPUnit_Framework_TestCase { @@ -16,7 +16,7 @@ class ConsoleLoggerTest extends \PHPUnit_Framework_TestCase private $console; /** - * @var \PHPUnit_Framework_MockObject_MockObject |\Magento\Setup\Model\ConsoleLogger + * @var \PHPUnit_Framework_MockObject_MockObject|ConsoleLogger */ private $consoleLoggerModel; diff --git a/lib/internal/Magento/Framework/Setup/UninstallInterface.php b/lib/internal/Magento/Framework/Setup/UninstallInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..13a5aa9fd13ccdd80bb56dc3db30b2d486ee756f --- /dev/null +++ b/lib/internal/Magento/Framework/Setup/UninstallInterface.php @@ -0,0 +1,21 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Setup; + +/** + * Interface for handling data removal during module uninstall + */ +interface UninstallInterface +{ + /** + * Invoked when remove-data flag is set during module uninstall. + * + * @param SchemaSetupInterface $setup + * @param ModuleContextInterface $context + * @return void + */ + public function uninstall(SchemaSetupInterface $setup, ModuleContextInterface $context); +} diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadata.php b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadata.php index 679225c25fd7aedd6186ef15eff1e25c9c6d58fe..d4f774fac7dd81a218e3c18deff52e9425478063 100644 --- a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadata.php +++ b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadata.php @@ -7,7 +7,7 @@ namespace Magento\Framework\Stdlib\Cookie; /** * Class CookieMetadata - * + * @api */ class CookieMetadata { diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadataFactory.php b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadataFactory.php index 4902a5934818f52422f4c00c0194d2dc1636bedc..ee8c517aa33d51a68aa7f26667eb87e9755162ff 100644 --- a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadataFactory.php +++ b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadataFactory.php @@ -10,6 +10,7 @@ use Magento\Framework\ObjectManagerInterface; /** * CookieMetadataFactory is used to construct SensitiveCookieMetadata and PublicCookieMetadata objects. + * @api */ class CookieMetadataFactory { diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieReaderInterface.php b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieReaderInterface.php index d50828020e4d8904217e43a8af3563683b73bfe4..c828eee3718fcb5a2951e3de54a84fba09357e92 100644 --- a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieReaderInterface.php +++ b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieReaderInterface.php @@ -8,6 +8,7 @@ namespace Magento\Framework\Stdlib\Cookie; /** * CookieReaderInterface provides the ability to read cookies sent in a request. + * @api */ interface CookieReaderInterface { diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieScopeInterface.php b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieScopeInterface.php index c448bc7bcef7c5f88bd31954c991395c78393696..43db7983eeed826da6748ed88bf1d6784fbe3376 100644 --- a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieScopeInterface.php +++ b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieScopeInterface.php @@ -7,6 +7,7 @@ namespace Magento\Framework\Stdlib\Cookie; /** * CookieScope is used to store default scope metadata. + * @api */ interface CookieScopeInterface { diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/PublicCookieMetadata.php b/lib/internal/Magento/Framework/Stdlib/Cookie/PublicCookieMetadata.php index e92901f25b81a767ea1155e1c54a86d778a135e6..8db596ba3cbfb05f91ee9440354d184d305c28db 100644 --- a/lib/internal/Magento/Framework/Stdlib/Cookie/PublicCookieMetadata.php +++ b/lib/internal/Magento/Framework/Stdlib/Cookie/PublicCookieMetadata.php @@ -41,6 +41,7 @@ class PublicCookieMetadata extends CookieMetadata * The cookie duration can be translated into an expiration date at the time the cookie is sent. * * @return int|null Time in seconds. + * @api */ public function getDuration() { @@ -52,6 +53,7 @@ class PublicCookieMetadata extends CookieMetadata * * @param bool $httpOnly * @return $this + * @api */ public function setHttpOnly($httpOnly) { @@ -63,6 +65,7 @@ class PublicCookieMetadata extends CookieMetadata * * @param bool $secure * @return $this + * @api */ public function setSecure($secure) { diff --git a/lib/internal/Magento/Framework/Stdlib/CookieManagerInterface.php b/lib/internal/Magento/Framework/Stdlib/CookieManagerInterface.php index 1f7483b7439451664c6e78af4deacaa679396299..b976fa2d595f1f89ea76205cbe359652a51b189c 100644 --- a/lib/internal/Magento/Framework/Stdlib/CookieManagerInterface.php +++ b/lib/internal/Magento/Framework/Stdlib/CookieManagerInterface.php @@ -20,6 +20,7 @@ use Magento\Framework\Exception\InputException; * The cookie manager will make it possible for an application to indicate if a cookie contains sensitive data, * this will allow extra protection to be added to the contents of the cookie as well sending directives to the browser * about how the cookie should be stored and whether JavaScript can access the cookie. + * @api */ interface CookieManagerInterface extends CookieReaderInterface { diff --git a/lib/internal/Magento/Framework/Stdlib/DateTime.php b/lib/internal/Magento/Framework/Stdlib/DateTime.php index 1de1a555645bd34e09bfe7bb793ca444089fa6ec..f589316e3efbdd382dab65aa926316d62e87d9c6 100644 --- a/lib/internal/Magento/Framework/Stdlib/DateTime.php +++ b/lib/internal/Magento/Framework/Stdlib/DateTime.php @@ -40,6 +40,7 @@ class DateTime * @param string|\DateTime|bool|null $date * @param boolean $includeTime * @return string|null + * @api */ public function formatDate($date, $includeTime = true) { diff --git a/lib/internal/Magento/Framework/Stdlib/DateTime/DateTime.php b/lib/internal/Magento/Framework/Stdlib/DateTime/DateTime.php index dfc2d9b0e5d048f15b85b005b82ac90acd6c0fbf..eefc5291aeee7bdeb9e68d397d5f7fb40eadee7d 100644 --- a/lib/internal/Magento/Framework/Stdlib/DateTime/DateTime.php +++ b/lib/internal/Magento/Framework/Stdlib/DateTime/DateTime.php @@ -39,6 +39,7 @@ class DateTime * * @param string|null $timezone * @return int offset between timezone and gmt + * @api */ public function calculateOffset($timezone = null) { @@ -86,6 +87,7 @@ class DateTime * @param string $format * @param int|string $input date in GMT timezone * @return string + * @api */ public function date($format = null, $input = null) { @@ -148,6 +150,7 @@ class DateTime * * @param string $type * @return int + * @api */ public function getGmtOffset($type = 'seconds') { diff --git a/lib/internal/Magento/Framework/Stdlib/DateTime/TimezoneInterface.php b/lib/internal/Magento/Framework/Stdlib/DateTime/TimezoneInterface.php index 75c865b542a0ab78a4d77870f7de12308b2bdec8..bbfc9116f250d2b896e6fc14edba869b08fbdbd7 100644 --- a/lib/internal/Magento/Framework/Stdlib/DateTime/TimezoneInterface.php +++ b/lib/internal/Magento/Framework/Stdlib/DateTime/TimezoneInterface.php @@ -8,6 +8,9 @@ namespace Magento\Framework\Stdlib\DateTime; +/** + * @api + */ interface TimezoneInterface { /** diff --git a/lib/internal/Magento/Framework/Validator/AbstractValidator.php b/lib/internal/Magento/Framework/Validator/AbstractValidator.php index 581b0b829a19708f5bd69f282d38e0140ca1e294..277fc2c089fb7cead3ac2c13b5426dd7d7eaab7d 100644 --- a/lib/internal/Magento/Framework/Validator/AbstractValidator.php +++ b/lib/internal/Magento/Framework/Validator/AbstractValidator.php @@ -31,6 +31,7 @@ abstract class AbstractValidator implements \Magento\Framework\Validator\Validat * * @param \Magento\Framework\Translate\AdapterInterface|null $translator * @return void + * @api */ public static function setDefaultTranslator(\Magento\Framework\Translate\AdapterInterface $translator = null) { @@ -41,6 +42,7 @@ abstract class AbstractValidator implements \Magento\Framework\Validator\Validat * Get default translator * * @return \Magento\Framework\Translate\AdapterInterface|null + * @api */ public static function getDefaultTranslator() { @@ -86,6 +88,7 @@ abstract class AbstractValidator implements \Magento\Framework\Validator\Validat * Get validation failure messages * * @return string[] + * @api */ public function getMessages() { @@ -96,6 +99,7 @@ abstract class AbstractValidator implements \Magento\Framework\Validator\Validat * Whether it has failure messages * * @return bool + * @api */ public function hasMessages() { diff --git a/lib/internal/Magento/Framework/Validator/Constraint.php b/lib/internal/Magento/Framework/Validator/Constraint.php index 49805ac1226bf53db751331ad3615afaec22a8df..53eee6b8972ccc917d7741c16713de6292504a2c 100644 --- a/lib/internal/Magento/Framework/Validator/Constraint.php +++ b/lib/internal/Magento/Framework/Validator/Constraint.php @@ -40,6 +40,7 @@ class Constraint extends \Magento\Framework\Validator\AbstractValidator * * @param mixed $value * @return boolean + * @api */ public function isValid($value) { @@ -72,6 +73,7 @@ class Constraint extends \Magento\Framework\Validator\AbstractValidator * Get constraint alias * * @return string + * @api */ public function getAlias() { diff --git a/lib/internal/Magento/Framework/Validator/ConstraintFactory.php b/lib/internal/Magento/Framework/Validator/ConstraintFactory.php index afd466ddb153c76bb6ae741f854085078d8ec54a..453f734b1a6b445152810c03779e72bd01a88523 100644 --- a/lib/internal/Magento/Framework/Validator/ConstraintFactory.php +++ b/lib/internal/Magento/Framework/Validator/ConstraintFactory.php @@ -44,6 +44,7 @@ class ConstraintFactory * * @param array $data * @return \Magento\Framework\Validator\Constraint + * @api */ public function create(array $data = []) { diff --git a/lib/internal/Magento/Framework/Validator/Currency.php b/lib/internal/Magento/Framework/Validator/Currency.php index 7f08b17170bdc31af8a84bf6c7396f50b97e5a3c..f6ed876d0c7fb7cb400d3e4ca025dc3573f478f7 100644 --- a/lib/internal/Magento/Framework/Validator/Currency.php +++ b/lib/internal/Magento/Framework/Validator/Currency.php @@ -33,6 +33,7 @@ class Currency * * @param string $currencyCode * @return bool + * @api */ public function isValid($currencyCode) { diff --git a/lib/internal/Magento/Framework/Validator/Entity/Properties.php b/lib/internal/Magento/Framework/Validator/Entity/Properties.php index 59e0044b56b2910df880a6bbf893154387dd2994..0da6192342713e7760d4e4070ba0cb8ddf02fd78 100644 --- a/lib/internal/Magento/Framework/Validator/Entity/Properties.php +++ b/lib/internal/Magento/Framework/Validator/Entity/Properties.php @@ -36,6 +36,7 @@ class Properties extends \Magento\Framework\Validator\AbstractValidator * @param AbstractModel $value * @return bool * @throws \InvalidArgumentException when $value is not instanceof \Magento\Framework\Object + * @api */ public function isValid($value) { diff --git a/lib/internal/Magento/Framework/Validator/Object.php b/lib/internal/Magento/Framework/Validator/Object.php index 8fff8b98277f9f44d90ece4d666ad0ef29e75f57..9593d6a29362c2ff20af70502db03a853ef619b5 100644 --- a/lib/internal/Magento/Framework/Validator/Object.php +++ b/lib/internal/Magento/Framework/Validator/Object.php @@ -32,6 +32,7 @@ class Object implements \Zend_Validate_Interface * @param \Zend_Validate_Interface $validator * @param string $fieldName Field name to apply validation to, or empty value to validate entity as a whole * @return \Magento\Framework\Validator\Object + * @api */ public function addRule(\Zend_Validate_Interface $validator, $fieldName = '') { @@ -56,6 +57,7 @@ class Object implements \Zend_Validate_Interface * @return bool * * @throws \Exception + * @api */ public function isValid($entity) { diff --git a/lib/internal/Magento/Framework/Validator/Timezone.php b/lib/internal/Magento/Framework/Validator/Timezone.php index 33094ab747bdb48f29b17007c6634b29e4f1e209..2d2c23502d5fe419c3d36676b019b0574d4cc1cb 100644 --- a/lib/internal/Magento/Framework/Validator/Timezone.php +++ b/lib/internal/Magento/Framework/Validator/Timezone.php @@ -33,6 +33,7 @@ class Timezone * * @param string $timezoneCode * @return bool + * @api */ public function isValid($timezoneCode) { diff --git a/lib/internal/Magento/Framework/Validator/ValidatorInterface.php b/lib/internal/Magento/Framework/Validator/ValidatorInterface.php index df40388f2bc806fbfe64cba2469d46c683769196..d3af9ccfe5cac7c6911f046e4756389da86c7ce4 100644 --- a/lib/internal/Magento/Framework/Validator/ValidatorInterface.php +++ b/lib/internal/Magento/Framework/Validator/ValidatorInterface.php @@ -7,6 +7,9 @@ */ namespace Magento\Framework\Validator; +/** + * @api + */ interface ValidatorInterface extends \Zend_Validate_Interface { /** diff --git a/setup/src/Magento/Setup/Console/Command/AbstractModuleCommand.php b/setup/src/Magento/Setup/Console/Command/AbstractModuleCommand.php index b6e38f7ec2b7530a0fe1e4d0741d8b08a6ca4c7b..dd75e0392ebaafa4f6e17966895cc7b7e85fc56c 100644 --- a/setup/src/Magento/Setup/Console/Command/AbstractModuleCommand.php +++ b/setup/src/Magento/Setup/Console/Command/AbstractModuleCommand.php @@ -5,6 +5,7 @@ */ namespace Magento\Setup\Console\Command; +use Magento\Framework\ObjectManagerInterface; use Magento\Setup\Model\ObjectManagerProvider; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -20,16 +21,14 @@ abstract class AbstractModuleCommand extends AbstractSetupCommand * Names of input arguments or options */ const INPUT_KEY_MODULES = 'module'; - const INPUT_KEY_ALL = 'all'; - const INPUT_KEY_FORCE = 'force'; const INPUT_KEY_CLEAR_STATIC_CONTENT = 'clear-static-content'; /** - * Object manager provider + * Object manager * - * @var ObjectManagerProvider + * @var ObjectManagerInterface */ - private $objectManagerProvider; + protected $objectManager; /** * Inject dependencies @@ -38,7 +37,7 @@ abstract class AbstractModuleCommand extends AbstractSetupCommand */ public function __construct(ObjectManagerProvider $objectManagerProvider) { - $this->objectManagerProvider = $objectManagerProvider; + $this->objectManager = $objectManagerProvider->get(); parent::__construct(); } @@ -47,122 +46,27 @@ abstract class AbstractModuleCommand extends AbstractSetupCommand */ protected function configure() { - $this->setDefinition([ - new InputArgument( - self::INPUT_KEY_MODULES, - InputArgument::IS_ARRAY | InputArgument::OPTIONAL, - 'Name of the module' - ), - new InputOption( - self::INPUT_KEY_CLEAR_STATIC_CONTENT, - 'c', - InputOption::VALUE_NONE, - 'Clear generated static view files. Necessary, if the module(s) have static view files' - ), - new InputOption( - self::INPUT_KEY_FORCE, - 'f', - InputOption::VALUE_NONE, - 'Bypass dependencies check' - ), - new InputOption( - self::INPUT_KEY_ALL, - null, - InputOption::VALUE_NONE, - ($this->isEnable() ? 'Enable' : 'Disable') . ' all modules' - ), - ]); - parent::configure(); - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $isEnable = $this->isEnable(); - if ($input->getOption(self::INPUT_KEY_ALL)) { - /** @var \Magento\Framework\Module\FullModuleList $fullModulesList */ - $fullModulesList = $this->objectManagerProvider->get()->get('Magento\Framework\Module\FullModuleList'); - $modules = $fullModulesList->getNames(); - } else { - $modules = $input->getArgument(self::INPUT_KEY_MODULES); - } - $messages = $this->validate($modules); - if (!empty($messages)) { - $output->writeln(implode(PHP_EOL, $messages)); - return; - } - /** - * @var \Magento\Framework\Module\Status $status - */ - $status = $this->objectManagerProvider->get()->get('Magento\Framework\Module\Status'); - try { - $modulesToChange = $status->getModulesToChange($isEnable, $modules); - } catch (\LogicException $e) { - $output->writeln('<error>' . $e->getMessage() . '</error>'); - return; - } - if (!empty($modulesToChange)) { - $force = $input->getOption(self::INPUT_KEY_FORCE); - if (!$force) { - $constraints = $status->checkConstraints($isEnable, $modulesToChange); - if ($constraints) { - $output->writeln( - "<error>Unable to change status of modules because of the following constraints:</error>" - ); - $output->writeln('<error>' . implode("\n", $constraints) . '</error>'); - return; - } - } - $status->setIsEnabled($isEnable, $modulesToChange); - if ($isEnable) { - $output->writeln('<info>The following modules have been enabled:</info>'); - $output->writeln('<info>- ' . implode("\n- ", $modulesToChange) . '</info>'); - $output->writeln(''); - $output->writeln( - '<info>To make sure the modules are properly enabled,' - . " run 'setup:upgrade'.</info>" - ); - } else { - $output->writeln('<info>The following modules have been disabled:</info>'); - $output->writeln('<info>- ' . implode("\n- ", $modulesToChange) . '</info>'); - $output->writeln(''); - } - $this->cleanup($input, $output); - if ($force) { - $output->writeln( - '<error>Alert: You used the --force option.' - . ' As a result, modules might not function properly.</error>' - ); - } - } else { - $output->writeln('<info>No modules were changed.</info>'); - } - } + $this->addArgument( + self::INPUT_KEY_MODULES, + InputArgument::IS_ARRAY | ($this->isModuleRequired() ? InputArgument::REQUIRED : InputArgument::OPTIONAL), + 'Name of the module' + ); + $this->addOption( + self::INPUT_KEY_CLEAR_STATIC_CONTENT, + 'c', + InputOption::VALUE_NONE, + 'Clear generated static view files. Necessary, if the module(s) have static view files' + ); - /** - * Validate list of modules and return error messages - * - * @param string[] $modules - * @return string[] - */ - protected function validate(array $modules) - { - $messages = []; - if (empty($modules)) { - $messages[] = '<error>No modules specified. Specify a space-separated list of modules' . - ' or use the --all option</error>'; - } - return $messages; + parent::configure(); } /** - * Is it "enable" or "disable" command + * Returns if module argument is required * * @return bool */ - abstract protected function isEnable(); + abstract protected function isModuleRequired(); /** * Cleanup after updated modules status @@ -171,15 +75,14 @@ abstract class AbstractModuleCommand extends AbstractSetupCommand * @param OutputInterface $output * @return void */ - private function cleanup(InputInterface $input, OutputInterface $output) + protected function cleanup(InputInterface $input, OutputInterface $output) { - $objectManager = $this->objectManagerProvider->get(); /** @var \Magento\Framework\App\Cache $cache */ - $cache = $objectManager->get('Magento\Framework\App\Cache'); + $cache = $this->objectManager->get('Magento\Framework\App\Cache'); $cache->clean(); $output->writeln('<info>Cache cleared successfully.</info>'); /** @var \Magento\Framework\App\State\CleanupFiles $cleanupFiles */ - $cleanupFiles = $objectManager->get('Magento\Framework\App\State\CleanupFiles'); + $cleanupFiles = $this->objectManager->get('Magento\Framework\App\State\CleanupFiles'); $cleanupFiles->clearCodeGeneratedClasses(); $output->writeln('<info>Generated classes cleared successfully.</info>'); if ($input->getOption(self::INPUT_KEY_CLEAR_STATIC_CONTENT)) { diff --git a/setup/src/Magento/Setup/Console/Command/AbstractModuleManageCommand.php b/setup/src/Magento/Setup/Console/Command/AbstractModuleManageCommand.php new file mode 100644 index 0000000000000000000000000000000000000000..644ee7dbcfa7b8d2bc0b1a420bd0fa5683d994d3 --- /dev/null +++ b/setup/src/Magento/Setup/Console/Command/AbstractModuleManageCommand.php @@ -0,0 +1,137 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Console\Command; + +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +abstract class AbstractModuleManageCommand extends AbstractModuleCommand +{ + /** + * Names of input arguments or options + */ + const INPUT_KEY_ALL = 'all'; + const INPUT_KEY_FORCE = 'force'; + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->addOption( + self::INPUT_KEY_FORCE, + 'f', + InputOption::VALUE_NONE, + 'Bypass dependencies check' + ); + $this->addOption( + self::INPUT_KEY_ALL, + null, + InputOption::VALUE_NONE, + ($this->isEnable() ? 'Enable' : 'Disable') . ' all modules' + ); + + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function isModuleRequired() + { + return false; + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $isEnable = $this->isEnable(); + if ($input->getOption(self::INPUT_KEY_ALL)) { + /** @var \Magento\Framework\Module\FullModuleList $fullModulesList */ + $fullModulesList = $this->objectManager->get('Magento\Framework\Module\FullModuleList'); + $modules = $fullModulesList->getNames(); + } else { + $modules = $input->getArgument(self::INPUT_KEY_MODULES); + } + $messages = $this->validate($modules); + if (!empty($messages)) { + $output->writeln(implode(PHP_EOL, $messages)); + return; + } + /** + * @var \Magento\Framework\Module\Status $status + */ + $status = $this->objectManager->get('Magento\Framework\Module\Status'); + try { + $modulesToChange = $status->getModulesToChange($isEnable, $modules); + } catch (\LogicException $e) { + $output->writeln('<error>' . $e->getMessage() . '</error>'); + return; + } + if (!empty($modulesToChange)) { + $force = $input->getOption(self::INPUT_KEY_FORCE); + if (!$force) { + $constraints = $status->checkConstraints($isEnable, $modulesToChange); + if ($constraints) { + $output->writeln( + "<error>Unable to change status of modules because of the following constraints:</error>" + ); + $output->writeln('<error>' . implode("\n", $constraints) . '</error>'); + return; + } + } + $status->setIsEnabled($isEnable, $modulesToChange); + if ($isEnable) { + $output->writeln('<info>The following modules have been enabled:</info>'); + $output->writeln('<info>- ' . implode("\n- ", $modulesToChange) . '</info>'); + $output->writeln(''); + $output->writeln( + '<info>To make sure that the enabled modules are properly registered,' + . " run 'setup:upgrade'.</info>" + ); + } else { + $output->writeln('<info>The following modules have been disabled:</info>'); + $output->writeln('<info>- ' . implode("\n- ", $modulesToChange) . '</info>'); + $output->writeln(''); + } + $this->cleanup($input, $output); + if ($force) { + $output->writeln( + '<error>Alert: You used the --force option.' + . ' As a result, modules might not function properly.</error>' + ); + } + } else { + $output->writeln('<info>No modules were changed.</info>'); + } + } + + /** + * Validate list of modules and return error messages + * + * @param string[] $modules + * @return string[] + */ + protected function validate(array $modules) + { + $messages = []; + if (empty($modules)) { + $messages[] = '<error>No modules specified. Specify a space-separated list of modules' . + ' or use the --all option</error>'; + } + return $messages; + } + + /** + * Is it "enable" or "disable" command + * + * @return bool + */ + abstract protected function isEnable(); +} diff --git a/setup/src/Magento/Setup/Console/Command/AdminUserCreateCommand.php b/setup/src/Magento/Setup/Console/Command/AdminUserCreateCommand.php index 78b1b41a711041712ee53c04630380a1af86d114..f432cc52d1bfa56fd488c7157bd823de1f69b146 100644 --- a/setup/src/Magento/Setup/Console/Command/AdminUserCreateCommand.php +++ b/setup/src/Magento/Setup/Console/Command/AdminUserCreateCommand.php @@ -7,7 +7,7 @@ namespace Magento\Setup\Console\Command; use Magento\Setup\Model\AdminAccount; -use Magento\Setup\Model\ConsoleLogger; +use Magento\Framework\Setup\ConsoleLogger; use Magento\Setup\Model\InstallerFactory; use Magento\User\Model\UserValidationRules; use Symfony\Component\Console\Input\InputOption; diff --git a/setup/src/Magento/Setup/Console/Command/BackupCommand.php b/setup/src/Magento/Setup/Console/Command/BackupCommand.php new file mode 100644 index 0000000000000000000000000000000000000000..e9e6e16fdf5b425b12b6acdea5278fa0aa71377a --- /dev/null +++ b/setup/src/Magento/Setup/Console/Command/BackupCommand.php @@ -0,0 +1,150 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Console\Command; + +use Magento\Framework\App\DeploymentConfig; +use Magento\Framework\App\MaintenanceMode; +use Magento\Framework\Backup\Factory; +use Magento\Framework\ObjectManagerInterface; +use Magento\Framework\Setup\BackupRollbackFactory; +use Magento\Setup\Model\ObjectManagerProvider; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Command to backup code base and user data + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class BackupCommand extends AbstractSetupCommand +{ + /** + * Name of input options + */ + const INPUT_KEY_CODE = 'code'; + const INPUT_KEY_MEDIA = 'media'; + const INPUT_KEY_DB = 'db'; + + /** + * Object Manager + * + * @var ObjectManagerInterface + */ + private $objectManager; + + /** + * Handler for maintenance mode + * + * @var MaintenanceMode + */ + private $maintenanceMode; + + /** + * Factory for BackupRollback + * + * @var BackupRollbackFactory + */ + private $backupRollbackFactory; + + /** + * Existing deployment config + * + * @var DeploymentConfig + */ + private $deploymentConfig; + + /** + * Constructor + * + * @param ObjectManagerProvider $objectManagerProvider + * @param MaintenanceMode $maintenanceMode + * @param DeploymentConfig $deploymentConfig + */ + public function __construct( + ObjectManagerProvider $objectManagerProvider, + MaintenanceMode $maintenanceMode, + DeploymentConfig $deploymentConfig + ) { + $this->objectManager = $objectManagerProvider->get(); + $this->maintenanceMode = $maintenanceMode; + $this->backupRollbackFactory = $this->objectManager->get('Magento\Framework\Setup\BackupRollbackFactory'); + $this->deploymentConfig = $deploymentConfig; + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $options = [ + new InputOption( + self::INPUT_KEY_CODE, + null, + InputOption::VALUE_NONE, + 'Take code and configuration files backup (excluding temporary files)' + ), + new InputOption( + self::INPUT_KEY_MEDIA, + null, + InputOption::VALUE_NONE, + 'Take media backup' + ), + new InputOption( + self::INPUT_KEY_DB, + null, + InputOption::VALUE_NONE, + 'Take complete database backup' + ), + ]; + $this->setName('setup:backup') + ->setDescription('Takes backup of Magento Application code base, media and database') + ->setDefinition($options); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable() + && ($input->getOption(self::INPUT_KEY_MEDIA) || $input->getOption(self::INPUT_KEY_DB))) { + $output->writeln("<info>No information is available: the Magento application is not installed.</info>"); + return; + } + try { + $inputOptionProvided = false; + $output->writeln('<info>Enabling maintenance mode</info>'); + $this->maintenanceMode->set(true); + $time = time(); + $backupHandler = $this->backupRollbackFactory->create($output); + if ($input->getOption(self::INPUT_KEY_CODE)) { + $backupHandler->codeBackup($time); + $inputOptionProvided = true; + } + if ($input->getOption(self::INPUT_KEY_MEDIA)) { + $backupHandler->codeBackup($time, Factory::TYPE_MEDIA); + $inputOptionProvided = true; + } + if ($input->getOption(self::INPUT_KEY_DB)) { + $backupHandler->dbBackup($time); + $inputOptionProvided = true; + } + if (!$inputOptionProvided) { + throw new \InvalidArgumentException( + 'Not enough information provided to take backup.' + ); + } + } catch (\Exception $e) { + $output->writeln('<error>' . $e->getMessage() . '</error>'); + } finally { + $output->writeln('<info>Disabling maintenance mode</info>'); + $this->maintenanceMode->set(false); + } + } +} diff --git a/setup/src/Magento/Setup/Console/Command/DbDataUpgradeCommand.php b/setup/src/Magento/Setup/Console/Command/DbDataUpgradeCommand.php index 258646ca9da717a080935e4cc93eee7faa1af7b0..c541e2f820f887b41dd8e4e3be06789a11506a46 100644 --- a/setup/src/Magento/Setup/Console/Command/DbDataUpgradeCommand.php +++ b/setup/src/Magento/Setup/Console/Command/DbDataUpgradeCommand.php @@ -8,7 +8,7 @@ namespace Magento\Setup\Console\Command; use Magento\Framework\App\DeploymentConfig; use Magento\Setup\Model\InstallerFactory; -use Magento\Setup\Model\ConsoleLogger; +use Magento\Framework\Setup\ConsoleLogger; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; diff --git a/setup/src/Magento/Setup/Console/Command/DbSchemaUpgradeCommand.php b/setup/src/Magento/Setup/Console/Command/DbSchemaUpgradeCommand.php index 5dc06e06300ba9108714001312fe537c6186dce6..96eda1b9b281c020d9f33d5f31ea76669734b6b1 100644 --- a/setup/src/Magento/Setup/Console/Command/DbSchemaUpgradeCommand.php +++ b/setup/src/Magento/Setup/Console/Command/DbSchemaUpgradeCommand.php @@ -8,7 +8,7 @@ namespace Magento\Setup\Console\Command; use Magento\Framework\App\DeploymentConfig; use Magento\Setup\Model\InstallerFactory; -use Magento\Setup\Model\ConsoleLogger; +use Magento\Framework\Setup\ConsoleLogger; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; diff --git a/setup/src/Magento/Setup/Console/Command/InfoBackupsListCommand.php b/setup/src/Magento/Setup/Console/Command/InfoBackupsListCommand.php new file mode 100644 index 0000000000000000000000000000000000000000..6d3bf3b54536dd820db8816d0ea003e580df7ac1 --- /dev/null +++ b/setup/src/Magento/Setup/Console/Command/InfoBackupsListCommand.php @@ -0,0 +1,105 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Console\Command; + +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Backup\Factory; +use Magento\Framework\Filesystem\Driver\File; +use Magento\Framework\Setup\BackupRollback; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Command prints list of available backup files + */ +class InfoBackupsListCommand extends Command +{ + /** + * File + * + * @var File + */ + private $file; + + /** + * Filesystem Directory List + * + * @var DirectoryList + */ + private $directoryList; + + /** + * @param DirectoryList $directoryList + * @param File $file + */ + public function __construct( + DirectoryList $directoryList, + File $file + ) { + $this->directoryList = $directoryList; + $this->file = $file; + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('info:backups:list') + ->setDescription('Prints list of available backup files'); + + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $backupsDir = $this->directoryList->getPath(DirectoryList::VAR_DIR) + . '/' . BackupRollback::DEFAULT_BACKUP_DIRECTORY; + if ($this->file->isExists($backupsDir)) { + $contents = $this->file->readDirectoryRecursively($backupsDir); + $tempTable = []; + foreach ($contents as $path) { + $partsOfPath = explode('/', str_replace('\\', '/', $path)); + $fileName = $partsOfPath[count($partsOfPath) - 1]; + // if filename starts with '.' skip, e.g. '.git' + if (!(strpos($fileName, '.') === 0)) { + $filenameWithoutExtension = explode('.', $fileName); + // actually first part of $filenameWithoutExtension contains only the filename without extension + // and filename contains the type of backup separated by '_' + $fileNameParts = explode('_', $filenameWithoutExtension[0]); + if (in_array(Factory::TYPE_MEDIA, $fileNameParts)) { + $tempTable[$fileName] = Factory::TYPE_MEDIA; + } elseif (in_array(Factory::TYPE_DB, $fileNameParts)) { + $tempTable[$fileName] = Factory::TYPE_DB; + } elseif (in_array('code', $fileNameParts)) { + $tempTable[$fileName] = 'code'; + } + } + } + if (empty($tempTable)) { + $output->writeln('<info>No backup files found.</info>'); + return; + } + $output->writeln("<info>Showing backup files in $backupsDir.</info>"); + /** @var \Symfony\Component\Console\Helper\Table $table */ + $table = $this->getHelperSet()->get('table'); + $table->setHeaders(['Backup Filename', 'Backup Type']); + asort($tempTable); + foreach ($tempTable as $key => $value) { + $table->addRow([$key, $value]); + } + $table->render($output); + } else { + $output->writeln('<info>No backup files found.</info>'); + } + } +} diff --git a/setup/src/Magento/Setup/Console/Command/InstallCommand.php b/setup/src/Magento/Setup/Console/Command/InstallCommand.php index f11f0ff3646bb5d4ffe5e7bb67c79fbd0d99dcbd..242da0bfb5760ff82032f1d4e317117bda014f1d 100644 --- a/setup/src/Magento/Setup/Console/Command/InstallCommand.php +++ b/setup/src/Magento/Setup/Console/Command/InstallCommand.php @@ -8,7 +8,7 @@ namespace Magento\Setup\Console\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Magento\Setup\Model\InstallerFactory; -use Magento\Setup\Model\ConsoleLogger; +use Magento\Framework\Setup\ConsoleLogger; use Symfony\Component\Console\Input\InputOption; use Magento\Setup\Model\ConfigModel; diff --git a/setup/src/Magento/Setup/Console/Command/InstallStoreConfigurationCommand.php b/setup/src/Magento/Setup/Console/Command/InstallStoreConfigurationCommand.php index 425ed23f6e1796be07cceeec64d7fe52fcefcc77..5eeae872008f86a29acaf448df70222e314ecd95 100644 --- a/setup/src/Magento/Setup/Console/Command/InstallStoreConfigurationCommand.php +++ b/setup/src/Magento/Setup/Console/Command/InstallStoreConfigurationCommand.php @@ -6,7 +6,7 @@ namespace Magento\Setup\Console\Command; -use Magento\Setup\Model\ConsoleLogger; +use Magento\Framework\Setup\ConsoleLogger; use Magento\Framework\App\DeploymentConfig; use Magento\Setup\Model\InstallerFactory; use Symfony\Component\Console\Input\InputOption; diff --git a/setup/src/Magento/Setup/Console/Command/ModuleDisableCommand.php b/setup/src/Magento/Setup/Console/Command/ModuleDisableCommand.php index 4e12c46331fca12d966f9bc247b8e9fd4840d36f..f7faf45c778c4ab31fbcdce96bd3e5f47dfe2e12 100644 --- a/setup/src/Magento/Setup/Console/Command/ModuleDisableCommand.php +++ b/setup/src/Magento/Setup/Console/Command/ModuleDisableCommand.php @@ -8,7 +8,7 @@ namespace Magento\Setup\Console\Command; /** * Command for disabling list or all of modules */ -class ModuleDisableCommand extends AbstractModuleCommand +class ModuleDisableCommand extends AbstractModuleManageCommand { /** * {@inheritdoc} diff --git a/setup/src/Magento/Setup/Console/Command/ModuleEnableCommand.php b/setup/src/Magento/Setup/Console/Command/ModuleEnableCommand.php index 0efc1d8928aafd83fe8950a28d8ccf9b1af41224..2428c14c4e5c001aa5f775ef0209e6fd5d3ca1d9 100644 --- a/setup/src/Magento/Setup/Console/Command/ModuleEnableCommand.php +++ b/setup/src/Magento/Setup/Console/Command/ModuleEnableCommand.php @@ -8,7 +8,7 @@ namespace Magento\Setup\Console\Command; /** * Command for enabling list or all of modules */ -class ModuleEnableCommand extends AbstractModuleCommand +class ModuleEnableCommand extends AbstractModuleManageCommand { /** * {@inheritdoc} diff --git a/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php b/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php new file mode 100755 index 0000000000000000000000000000000000000000..edb336437224ac47a19e33279b6692b699e05f16 --- /dev/null +++ b/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php @@ -0,0 +1,448 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Console\Command; + +use Magento\Framework\App\DeploymentConfig; +use Magento\Framework\App\MaintenanceMode; +use Magento\Framework\Backup\Factory; +use Magento\Framework\Composer\ComposerInformation; +use Magento\Framework\Composer\Remove; +use Magento\Framework\Config\ConfigOptionsListConstants; +use Magento\Framework\Config\File\ConfigFilePool; +use Magento\Framework\Module\DependencyChecker; +use Magento\Framework\Module\ModuleList\Loader; +use Magento\Framework\Module\FullModuleList; +use Magento\Framework\Module\PackageInfo; +use Magento\Framework\Module\Resource; +use Magento\Framework\Setup\BackupRollbackFactory; +use Magento\Setup\Model\ModuleContext; +use Magento\Setup\Model\ObjectManagerProvider; +use Magento\Setup\Model\UninstallCollector; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ConfirmationQuestion; + +/** + * Command for uninstalling modules + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ +class ModuleUninstallCommand extends AbstractModuleCommand +{ + /** + * Names of input options + */ + const INPUT_KEY_REMOVE_DATA = 'remove-data'; + const INPUT_KEY_BACKUP_CODE = 'backup-code'; + const INPUT_KEY_BACKUP_MEDIA = 'backup-media'; + const INPUT_KEY_BACKUP_DB = 'backup-db'; + + /** + * Maintenance mode + * + * @var MaintenanceMode + */ + private $maintenanceMode; + + /** + * Deployment Configuration + * + * @var DeploymentConfig + */ + private $deploymentConfig; + + /** + * Full module list + * + * @var FullModuleList + */ + private $fullModuleList; + + /** + * Deployment Configuration writer + * + * @var DeploymentConfig\Writer + */ + private $writer; + + /** + * Module package info + * + * @var PackageInfo + */ + private $packageInfo; + + /** + * Uninstall classes collector + * + * @var UninstallCollector + */ + private $collector; + + /** + * Module Resource + * + * @var Resource + */ + private $moduleResource; + + /** + * Composer general dependency checker + * + * @var DependencyChecker + */ + private $dependencyChecker; + + /** + * Root composer.json information + * + * @var ComposerInformation + */ + private $composer; + + /** + * @var Loader + */ + private $loader; + + /** + * Code remover + * + * @var Remove + */ + private $remove; + + /** + * BackupRollback factory + * + * @var BackupRollbackFactory + */ + private $backupRollbackFactory; + + /** + * Constructor + * + * @param ComposerInformation $composer + * @param DeploymentConfig $deploymentConfig + * @param DeploymentConfig\Writer $writer + * @param FullModuleList $fullModuleList + * @param Loader $loader + * @param MaintenanceMode $maintenanceMode + * @param ObjectManagerProvider $objectManagerProvider + * @param Remove $remove + * @param UninstallCollector $collector + */ + public function __construct( + ComposerInformation $composer, + DeploymentConfig $deploymentConfig, + DeploymentConfig\Writer $writer, + FullModuleList $fullModuleList, + Loader $loader, + MaintenanceMode $maintenanceMode, + ObjectManagerProvider $objectManagerProvider, + Remove $remove, + UninstallCollector $collector + ) { + parent::__construct($objectManagerProvider); + $this->composer = $composer; + $this->deploymentConfig = $deploymentConfig; + $this->writer = $writer; + $this->maintenanceMode = $maintenanceMode; + $this->fullModuleList = $fullModuleList; + $this->packageInfo = $this->objectManager->get('Magento\Framework\Module\PackageInfoFactory')->create(); + $this->collector = $collector; + $this->moduleResource = $this->objectManager->get('Magento\Framework\Module\Resource'); + $this->dependencyChecker = $this->objectManager->get('Magento\Framework\Module\DependencyChecker'); + $this->loader = $loader; + $this->remove = $remove; + $this->backupRollbackFactory = $this->objectManager->get('Magento\Framework\Setup\BackupRollbackFactory'); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $options = [ + new InputOption( + self::INPUT_KEY_REMOVE_DATA, + 'r', + InputOption::VALUE_NONE, + 'Remove data installed by module(s)' + ), + new InputOption( + self::INPUT_KEY_BACKUP_CODE, + null, + InputOption::VALUE_NONE, + 'Take code and configuration files backup (excluding temporary files)' + ), + new InputOption( + self::INPUT_KEY_BACKUP_MEDIA, + null, + InputOption::VALUE_NONE, + 'Take media backup' + ), + new InputOption( + self::INPUT_KEY_BACKUP_DB, + null, + InputOption::VALUE_NONE, + 'Take complete database backup' + ), + ]; + $this->setName('module:uninstall') + ->setDescription('Uninstalls modules installed by composer') + ->setDefinition($options); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function isModuleRequired() + { + return true; + } + + /** + * {@inheritdoc} + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable()) { + $output->writeln( + '<error>You cannot run this command because the Magento application is not installed.</error>' + ); + return; + } + + $modules = $input->getArgument(self::INPUT_KEY_MODULES); + // validate modules input + $messages = $this->validate($modules); + if (!empty($messages)) { + $output->writeln($messages); + return; + } + + // check dependencies + $dependencyMessages = $this->checkDependencies($modules); + if (!empty($dependencyMessages)) { + $output->writeln($dependencyMessages); + return; + } + + $helper = $this->getHelper('question'); + $question = new ConfirmationQuestion( + 'You are about to remove code and/or database tables. Are you sure?[y/N]', + false + ); + if (!$helper->ask($input, $output, $question) && $input->isInteractive()) { + return; + } + try { + $output->writeln('<info>Enabling maintenance mode</info>'); + $this->maintenanceMode->set(true); + $this->takeBackup($input, $output); + $dbBackupOption = $input->getOption(self::INPUT_KEY_BACKUP_DB); + if ($input->getOption(self::INPUT_KEY_REMOVE_DATA)) { + $this->removeData($modules, $output, $dbBackupOption); + } else { + if (!empty($this->collector->collectUninstall())) { + $question = new ConfirmationQuestion( + 'You are about to remove a module(s) that might have database data. ' + . 'Do you want to remove the data from database?[y/N]', + false + ); + if ($helper->ask($input, $output, $question) || !$input->isInteractive()) { + $this->removeData($modules, $output, $dbBackupOption); + } + } else { + $output->writeln( + '<info>You are about to remove a module(s) that might have database data. ' + . 'Remove the database data manually after uninstalling, if desired.</info>' + ); + } + } + $output->writeln('<info>Removing ' . implode(', ', $modules) . ' from module registry in database</info>'); + $this->removeModulesFromDb($modules); + $output->writeln( + '<info>Removing ' . implode(', ', $modules) . ' from module list in deployment configuration</info>' + ); + $this->removeModulesFromDeploymentConfig($modules); + $output->writeln('<info>Removing code from Magento codebase:</info>'); + $this->removeCode($modules); + $this->cleanup($input, $output); + $output->writeln('<info>Disabling maintenance mode</info>'); + $this->maintenanceMode->set(false); + } catch (\Exception $e) { + $output->writeln('<error>' . $e->getMessage() . '</error>'); + $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>'); + } + } + + /** + * Check backup options and take backup appropriately + * + * @param InputInterface $input + * @param OutputInterface $output + * @return void + */ + private function takeBackup(InputInterface $input, OutputInterface $output) + { + $time = time(); + if ($input->getOption(self::INPUT_KEY_BACKUP_CODE)) { + $codeBackup = $this->backupRollbackFactory->create($output); + $codeBackup->codeBackup($time); + } + if ($input->getOption(self::INPUT_KEY_BACKUP_MEDIA)) { + $mediaBackup = $this->backupRollbackFactory->create($output); + $mediaBackup->codeBackup($time, Factory::TYPE_MEDIA); + } + if ($input->getOption(self::INPUT_KEY_BACKUP_DB)) { + $dbBackup = $this->backupRollbackFactory->create($output); + $dbBackup->dbBackup($time); + } + } + + /** + * Invoke remove data routine in each specified module + * + * @param string[] $modules + * @param OutputInterface $output + * @param bool $dbBackupOption + * @return void + */ + private function removeData(array $modules, OutputInterface $output, $dbBackupOption) + { + if (!$dbBackupOption) { + $output->writeln('<error>You are removing data without a database backup.</error>'); + } else { + $output->writeln('<info>Removing data</info>'); + } + $uninstalls = $this->collector->collectUninstall(); + $setupModel = $this->objectManager->get('Magento\Setup\Module\Setup'); + foreach ($modules as $module) { + if (isset($uninstalls[$module])) { + $output->writeln("<info>Removing data of $module</info>"); + $uninstalls[$module]->uninstall( + $setupModel, + new ModuleContext($this->moduleResource->getDbVersion($module) ?: '') + ); + } else { + $output->writeln("<info>No data to clear in $module</info>"); + } + } + } + + /** + * Run 'composer remove' to remove code + * + * @param array $modules + * @return void + */ + private function removeCode(array $modules) + { + $packages = []; + foreach ($modules as $module) { + $packages[] = $this->packageInfo->getPackageName($module); + } + $this->remove->remove($packages); + + } + + /** + * Validate list of modules against installed composer packages and return error messages + * + * @param string[] $modules + * @return string[] + */ + protected function validate(array $modules) + { + $messages = []; + $unknownPackages = []; + $unknownModules = []; + $installedPackages = $this->composer->getRootRequiredPackages(); + foreach ($modules as $module) { + if (array_search($this->packageInfo->getPackageName($module), $installedPackages) === false) { + $unknownPackages[] = $module; + } + if (!$this->fullModuleList->has($module)) { + $unknownModules[] = $module; + } + } + $unknownPackages = array_diff($unknownPackages, $unknownModules); + if (!empty($unknownPackages)) { + $text = count($unknownPackages) > 1 ? + ' are not installed composer packages' : ' is not an installed composer package'; + $messages[] = '<error>' . implode(', ', $unknownPackages) . $text . '</error>'; + } + if (!empty($unknownModules)) { + $messages[] = '<error>Unknown module(s): ' . implode(', ', $unknownModules) . '</error>'; + } + return $messages; + } + + /** + * Check for dependencies to modules, return error messages + * + * @param string[] $modules + * @return string[] + */ + private function checkDependencies(array $modules) + { + $messages = []; + $dependencies = $this->dependencyChecker->checkDependenciesWhenDisableModules( + $modules, + $this->fullModuleList->getNames() + ); + foreach ($dependencies as $module => $dependingModules) { + if (!empty($dependingModules)) { + $messages[] = + "<error>Cannot uninstall module '$module' because the following module(s) depend on it:</error>" . + PHP_EOL . "\t<error>" . implode('</error>' . PHP_EOL . "\t<error>", array_keys($dependingModules)) . + "</error>"; + } + } + return $messages; + } + + /** + * Removes module from setup_module table + * + * @param string[] $modules + * @return void + */ + private function removeModulesFromDb(array $modules) + { + /** @var \Magento\Setup\Module\DataSetup $setup */ + $setup = $this->objectManager->get('Magento\Setup\Module\DataSetup'); + foreach ($modules as $module) { + $setup->deleteTableRow('setup_module', 'module', $module); + } + } + + /** + * Removes module from deployment configuration + * + * @param string[] $modules + * @return void + */ + private function removeModulesFromDeploymentConfig(array $modules) + { + $existingModules = $this->deploymentConfig->getConfigData(ConfigOptionsListConstants::KEY_MODULES); + $newSort = $this->loader->load($modules); + $newModules = []; + foreach (array_keys($newSort) as $module) { + $newModules[$module] = $existingModules[$module]; + } + $this->writer->saveConfig( + [ConfigFilePool::APP_CONFIG => [ConfigOptionsListConstants::KEY_MODULES => $newModules]], + true + ); + } +} diff --git a/setup/src/Magento/Setup/Console/Command/RollbackCommand.php b/setup/src/Magento/Setup/Console/Command/RollbackCommand.php new file mode 100755 index 0000000000000000000000000000000000000000..13be58d9f73b459cf373c09a8d2993e9b1195ccd --- /dev/null +++ b/setup/src/Magento/Setup/Console/Command/RollbackCommand.php @@ -0,0 +1,169 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Console\Command; + +use Magento\Framework\App\DeploymentConfig; +use Magento\Framework\App\MaintenanceMode; +use Magento\Framework\Backup\Factory; +use Magento\Framework\ObjectManagerInterface; +use Magento\Framework\Setup\BackupRollbackFactory; +use Magento\Setup\Model\ObjectManagerProvider; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ConfirmationQuestion; + +/** + * Command to rollback code, media and DB + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class RollbackCommand extends AbstractSetupCommand +{ + /** + * Name of input arguments or options + */ + const INPUT_KEY_CODE_BACKUP_FILE = 'code-file'; + const INPUT_KEY_MEDIA_BACKUP_FILE = 'media-file'; + const INPUT_KEY_DB_BACKUP_FILE = 'db-file'; + + /** + * Object Manager + * + * @var ObjectManagerInterface + */ + private $objectManager; + + /** + * @var MaintenanceMode + */ + private $maintenanceMode; + + /** + * @var BackupRollbackFactory + */ + private $backupRollbackFactory; + + /** + * Existing deployment config + * + * @var DeploymentConfig + */ + private $deploymentConfig; + + /** + * Constructor + * + * @param ObjectManagerProvider $objectManagerProvider + * @param MaintenanceMode $maintenanceMode + * @param DeploymentConfig $deploymentConfig + */ + public function __construct( + ObjectManagerProvider $objectManagerProvider, + MaintenanceMode $maintenanceMode, + DeploymentConfig $deploymentConfig + ) { + $this->objectManager = $objectManagerProvider->get(); + $this->maintenanceMode = $maintenanceMode; + $this->backupRollbackFactory = $this->objectManager->get('Magento\Framework\Setup\BackupRollbackFactory'); + $this->deploymentConfig = $deploymentConfig; + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $options = [ + new InputOption( + self::INPUT_KEY_CODE_BACKUP_FILE, + 'c', + InputOption::VALUE_REQUIRED, + 'Basename of the code backup file in var/backups' + ), + new InputOption( + self::INPUT_KEY_MEDIA_BACKUP_FILE, + 'm', + InputOption::VALUE_REQUIRED, + 'Basename of the media backup file in var/backups' + ), + new InputOption( + self::INPUT_KEY_DB_BACKUP_FILE, + 'd', + InputOption::VALUE_REQUIRED, + 'Basename of the db backup file in var/backups' + ), + ]; + $this->setName('setup:rollback') + ->setDescription('Rolls back Magento Application codebase, media and database') + ->setDefinition($options); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable() && ($input->getOption(self::INPUT_KEY_MEDIA_BACKUP_FILE) + || $input->getOption(self::INPUT_KEY_DB_BACKUP_FILE))) { + $output->writeln("<info>No information is available: the Magento application is not installed.</info>"); + return; + } + try { + $output->writeln('<info>Enabling maintenance mode</info>'); + $this->maintenanceMode->set(true); + $helper = $this->getHelper('question'); + $question = new ConfirmationQuestion( + '<info>You are about to remove current code and/or database tables. Are you sure?[y/N]<info>', + false + ); + if (!$helper->ask($input, $output, $question) && $input->isInteractive()) { + return; + } + $this->doRollback($input, $output); + $output->writeln('<info>Please set file permission of bin/magento to executable</info>'); + + } catch (\Exception $e) { + $output->writeln('<error>' . $e->getMessage() . '</error>'); + } finally { + $output->writeln('<info>Disabling maintenance mode</info>'); + $this->maintenanceMode->set(false); + } + } + + /** + * Check rollback options and rolls back appropriately + * + * @param InputInterface $input + * @param OutputInterface $output + * @return void + * @throws \InvalidArgumentException + */ + private function doRollback(InputInterface $input, OutputInterface $output) + { + $inputOptionProvided = false; + $rollbackHandler = $this->backupRollbackFactory->create($output); + if ($input->getOption(self::INPUT_KEY_CODE_BACKUP_FILE)) { + $rollbackHandler->codeRollback($input->getOption(self::INPUT_KEY_CODE_BACKUP_FILE)); + $inputOptionProvided = true; + } + if ($input->getOption(self::INPUT_KEY_MEDIA_BACKUP_FILE)) { + $rollbackHandler->codeRollback($input->getOption(self::INPUT_KEY_MEDIA_BACKUP_FILE), Factory::TYPE_MEDIA); + $inputOptionProvided = true; + } + if ($input->getOption(self::INPUT_KEY_DB_BACKUP_FILE)) { + $rollbackHandler->dbRollback($input->getOption(self::INPUT_KEY_DB_BACKUP_FILE)); + $inputOptionProvided = true; + } + if (!$inputOptionProvided) { + throw new \InvalidArgumentException( + 'Not enough information provided to roll back.' + ); + } + } +} diff --git a/setup/src/Magento/Setup/Console/Command/UninstallCommand.php b/setup/src/Magento/Setup/Console/Command/UninstallCommand.php index 802b3c51cd8e3784b773748a8036f5f00dfcd522..f352ffdba8df4bf682061a827ce5a6ad1f20afd5 100644 --- a/setup/src/Magento/Setup/Console/Command/UninstallCommand.php +++ b/setup/src/Magento/Setup/Console/Command/UninstallCommand.php @@ -10,7 +10,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; use Magento\Setup\Model\InstallerFactory; -use Magento\Setup\Model\ConsoleLogger; +use Magento\Framework\Setup\ConsoleLogger; class UninstallCommand extends AbstractSetupCommand { diff --git a/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php b/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php index c070a795331ae83e9765de8f1c979a2828cfa361..7197865542cd53c7d110166fceb0d815b55cfc9c 100644 --- a/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php +++ b/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php @@ -8,7 +8,7 @@ namespace Magento\Setup\Console\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Magento\Setup\Model\InstallerFactory; -use Magento\Setup\Model\ConsoleLogger; +use Magento\Framework\Setup\ConsoleLogger; /** * Command for updating installed application after the code base has changed diff --git a/setup/src/Magento/Setup/Console/CommandList.php b/setup/src/Magento/Setup/Console/CommandList.php index da9f1a45ff92d41769cb2898d7b2145de2b1dfb2..590e2c9789a1c257a13a796fd4b34087c2b4998b 100644 --- a/setup/src/Magento/Setup/Console/CommandList.php +++ b/setup/src/Magento/Setup/Console/CommandList.php @@ -39,6 +39,7 @@ class CommandList { return [ 'Magento\Setup\Console\Command\AdminUserCreateCommand', + 'Magento\Setup\Console\Command\BackupCommand', 'Magento\Setup\Console\Command\ConfigSetCommand', 'Magento\Setup\Console\Command\DbDataUpgradeCommand', 'Magento\Setup\Console\Command\DbSchemaUpgradeCommand', @@ -52,6 +53,7 @@ class CommandList 'Magento\Setup\Console\Command\GenerateFixturesCommand', 'Magento\Setup\Console\Command\I18nCollectPhrasesCommand', 'Magento\Setup\Console\Command\I18nPackCommand', + 'Magento\Setup\Console\Command\InfoBackupsListCommand', 'Magento\Setup\Console\Command\InfoCurrencyListCommand', 'Magento\Setup\Console\Command\InfoLanguageListCommand', 'Magento\Setup\Console\Command\InfoTimezoneListCommand', @@ -60,10 +62,12 @@ class CommandList 'Magento\Setup\Console\Command\ModuleEnableCommand', 'Magento\Setup\Console\Command\ModuleDisableCommand', 'Magento\Setup\Console\Command\ModuleStatusCommand', + 'Magento\Setup\Console\Command\ModuleUninstallCommand', 'Magento\Setup\Console\Command\MaintenanceAllowIpsCommand', 'Magento\Setup\Console\Command\MaintenanceDisableCommand', 'Magento\Setup\Console\Command\MaintenanceEnableCommand', 'Magento\Setup\Console\Command\MaintenanceStatusCommand', + 'Magento\Setup\Console\Command\RollbackCommand', 'Magento\Setup\Console\Command\UpgradeCommand', 'Magento\Setup\Console\Command\UninstallCommand', ]; diff --git a/setup/src/Magento/Setup/Controller/Environment.php b/setup/src/Magento/Setup/Controller/Environment.php index 527cbeafabd022dcabe7e92fc0e87e8516eb117e..e88ed5e59602a0485f5bbfc2bf42bbdc69404b8f 100644 --- a/setup/src/Magento/Setup/Controller/Environment.php +++ b/setup/src/Magento/Setup/Controller/Environment.php @@ -5,13 +5,18 @@ */ namespace Magento\Setup\Controller; -use Composer\Package\LinkConstraint\VersionConstraint; use Composer\Package\Version\VersionParser; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\JsonModel; +use Magento\Setup\Model\ComposerInformation; use Magento\Setup\Model\PhpInformation; use Magento\Setup\Model\FilePermissions; +/** + * Class Environment + * + * Provides information and checks about the environment. + */ class Environment extends AbstractActionController { /** @@ -34,15 +39,18 @@ class Environment extends AbstractActionController * @param PhpInformation $phpInformation * @param FilePermissions $permissions * @param VersionParser $versionParser + * @param ComposerInformation $composerInformation */ public function __construct( PhpInformation $phpInformation, FilePermissions $permissions, - VersionParser $versionParser + VersionParser $versionParser, + ComposerInformation $composerInformation ) { $this->phpInformation = $phpInformation; - $this->permissions = $permissions; + $this->permissions = $permissions; $this->versionParser = $versionParser; + $this->composerInformation = $composerInformation; } /** @@ -53,7 +61,7 @@ class Environment extends AbstractActionController public function phpVersionAction() { try { - $requiredVersion = $this->phpInformation->getRequiredPhpVersion(); + $requiredVersion = $this->composerInformation->getRequiredPhpVersion(); } catch (\Exception $e) { return new JsonModel( [ @@ -122,7 +130,7 @@ class Environment extends AbstractActionController public function phpExtensionsAction() { try { - $required = $this->phpInformation->getRequired(); + $required = $this->composerInformation->getRequiredExtensions(); $current = $this->phpInformation->getCurrent(); } catch (\Exception $e) { diff --git a/setup/src/Magento/Setup/Controller/Landing.php b/setup/src/Magento/Setup/Controller/Landing.php index 2e2a39554196fb74c1b74d3c58cd79e150deab84..3cce9b7e9975ae6867085e743c2ce94772b33308 100644 --- a/setup/src/Magento/Setup/Controller/Landing.php +++ b/setup/src/Magento/Setup/Controller/Landing.php @@ -6,28 +6,15 @@ namespace Magento\Setup\Controller; -use Composer\Json\JsonFile; -use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\AppInterface; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; +/** + * Controller for Setup Landing page + */ class Landing extends AbstractActionController { - /** - * @var array - */ - protected $composerJson; - - /** - * @param DirectoryList $directoryList - */ - public function __construct( - DirectoryList $directoryList - ) { - $jsonFile = new JsonFile($directoryList->getRoot() . '/composer.json'); - $this->composerJson = $jsonFile->read(); - } - /** * @return array|ViewModel */ @@ -37,7 +24,7 @@ class Landing extends AbstractActionController $view->setTerminal(true); $view->setVariable('languages', $this->serviceLocator->get('config')['languages']); $view->setVariable('location', 'en_US'); - $view->setVariable('version', $this->composerJson['version']); + $view->setVariable('version', AppInterface::VERSION); return $view; } } diff --git a/setup/src/Magento/Setup/Model/ComposerInformation.php b/setup/src/Magento/Setup/Model/ComposerInformation.php new file mode 100644 index 0000000000000000000000000000000000000000..431f4c8243f7b800ac9c07729c0d52d017e11de5 --- /dev/null +++ b/setup/src/Magento/Setup/Model/ComposerInformation.php @@ -0,0 +1,133 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Model; + +use Composer\Factory as ComposerFactory; +use Composer\IO\BufferIO; +use Composer\Package\Link; +use Composer\Package\PackageInterface; +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Filesystem; + +/** + * Class ComposerInformation uses Composer to determine dependency information. + */ +class ComposerInformation +{ + /** + * @var \Composer\Composer + */ + private $composer; + + /** + * @var \Composer\Package\Locker + */ + private $locker; + + /** + * Constructor + * + * @param Filesystem $filesystem + * @param BufferIO $io + * @throws \Exception + */ + public function __construct( + Filesystem $filesystem, + BufferIO $io + ) { + // composer.json is in same directory as vendor + $vendorPath = $filesystem->getDirectoryRead(DirectoryList::CONFIG)->getAbsolutePath('vendor_path.php'); + $vendorDir = require "{$vendorPath}"; + $composerJson = $filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath() + . "/{$vendorDir}/../composer.json"; + + $composerJsonRealPath = realpath($composerJson); + if ($composerJsonRealPath === false) { + throw new \Exception('Composer file not found: ' . $composerJson); + } + + putenv('COMPOSER_HOME=' . $filesystem->getDirectoryRead(DirectoryList::COMPOSER_HOME)->getAbsolutePath()); + + // Create Composer + $this->composer = ComposerFactory::create($io, $composerJson); + $this->locker = $this->composer->getLocker(); + } + + /** + * Retrieves required php version + * + * @return string + * @throws \Exception If attributes are missing in composer.lock file. + */ + public function getRequiredPhpVersion() + { + if ($this->isMagentoRoot()) { + $allPlatformReqs = $this->locker->getPlatformRequirements(true); + $requiredPhpVersion = $allPlatformReqs['php']->getPrettyConstraint(); + } else { + $packages = $this->locker->getLockedRepository()->getPackages(); + /** @var PackageInterface $package */ + foreach ($packages as $package) { + if ($package instanceof PackageInterface) { + $packageName = $package->getPrettyName(); + if ($packageName === 'magento/product-community-edition') { + $phpRequirementLink = $package->getRequires()['php']; + if ($phpRequirementLink instanceof Link) { + $requiredPhpVersion = $phpRequirementLink->getPrettyConstraint(); + } + } + } + } + } + + if (!isset($requiredPhpVersion)) { + throw new \Exception('Cannot find php version requirement in \'composer.lock\' file'); + } + return $requiredPhpVersion; + } + + /** + * Retrieve list of required extensions + * + * Collect required extensions from composer.lock file + * + * @return array + * @throws \Exception If attributes are missing in composer.lock file. + */ + public function getRequiredExtensions() + { + $requiredExtensions = []; + $allPlatformReqs = array_keys($this->locker->getPlatformRequirements(true)); + + if (!$this->isMagentoRoot()) { + /** @var \Composer\Package\CompletePackage $package */ + foreach ($this->locker->getLockedRepository()->getPackages() as $package) { + $requires = array_keys($package->getRequires()); + $requires = array_merge($requires, array_keys($package->getDevRequires())); + $allPlatformReqs = array_merge($allPlatformReqs, $requires); + } + } + foreach ($allPlatformReqs as $reqIndex) { + if (substr($reqIndex, 0, 4) === 'ext-') { + $requiredExtensions[] = substr($reqIndex, 4); + } + } + return array_unique($requiredExtensions); + } + + /** + * Determines if Magento is the root package or it is included as a requirement. + * + * @return bool + */ + private function isMagentoRoot() + { + $rootPackage = $this->composer->getPackage(); + + return preg_match('/magento\/magento2.e/', $rootPackage->getName()); + } +} diff --git a/setup/src/Magento/Setup/Model/Installer.php b/setup/src/Magento/Setup/Model/Installer.php index 4ff4a044eff51178f651f1304e571d27047df638..b3cdd3ee191891466f70e8f8df4376b768c5825e 100644 --- a/setup/src/Magento/Setup/Model/Installer.php +++ b/setup/src/Magento/Setup/Model/Installer.php @@ -19,6 +19,7 @@ use Magento\Framework\Module\ModuleList\Loader as ModuleLoader; use Magento\Framework\Module\ModuleListInterface; use Magento\Framework\Shell; use Magento\Framework\Setup\InstallSchemaInterface; +use Magento\Framework\Setup\LoggerInterface; use Magento\Framework\Setup\UpgradeSchemaInterface; use Magento\Framework\Setup\InstallDataInterface; use Magento\Framework\Setup\UpgradeDataInterface; diff --git a/setup/src/Magento/Setup/Model/InstallerFactory.php b/setup/src/Magento/Setup/Model/InstallerFactory.php index cddcfd649b7a05fe34d623146171af8c06b40e14..9af552e32d1fcc0354816196bf6b036c37e7fe94 100644 --- a/setup/src/Magento/Setup/Model/InstallerFactory.php +++ b/setup/src/Magento/Setup/Model/InstallerFactory.php @@ -8,6 +8,9 @@ namespace Magento\Setup\Model; use Zend\ServiceManager\ServiceLocatorInterface; use Magento\Setup\Module\ResourceFactory; +use Magento\Framework\App\ErrorHandler; +use Magento\Framework\App\State\CleanupFiles; +use Magento\Framework\Setup\LoggerInterface; class InstallerFactory { @@ -33,6 +36,9 @@ class InstallerFactory { $this->serviceLocator = $serviceLocator; $this->resourceFactory = $resourceFactory; + // For Setup Wizard we are using our customized error handler + $handler = new ErrorHandler(); + set_error_handler([$handler, 'handler']); } /** diff --git a/setup/src/Magento/Setup/Model/PhpInformation.php b/setup/src/Magento/Setup/Model/PhpInformation.php index f6786c8b2b525bb7feae54db994f633a18259141..155d4d8010fc5f476cb31d37cc1921e560ae7e84 100644 --- a/setup/src/Magento/Setup/Model/PhpInformation.php +++ b/setup/src/Magento/Setup/Model/PhpInformation.php @@ -6,9 +6,13 @@ namespace Magento\Setup\Model; -use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; +/** + * Class PhpInformation + * + * Provides information and checks about the current and required PHP settings. + */ class PhpInformation { @@ -17,13 +21,6 @@ class PhpInformation */ const XDEBUG_NESTED_LEVEL = 200; - /** - * List of required extensions - * - * @var array - */ - protected $required; - /** * List of currently installed extensions * @@ -31,40 +28,6 @@ class PhpInformation */ protected $current = []; - /** - * Interface to read composer.lock file - * - * @var \Magento\Framework\Filesystem\Directory\ReadInterface - */ - private $rootDir; - - /** - * Constructor - * - * @param Filesystem $filesystem - */ - public function __construct( - Filesystem $filesystem - ) { - $this->rootDir = $filesystem->getDirectoryRead(DirectoryList::ROOT); - } - - /** - * Retrieves required php version - * - * @return string - * @throws \Exception If attributes are missing in composer.lock file. - */ - public function getRequiredPhpVersion() - { - $composerInfo = $this->getComposerInfo(); - if (!empty($composerInfo['platform']['php'])) { - return $composerInfo['platform']['php']; - } else { - throw new \Exception('Missing key \'platform=>php\' in \'composer.lock\' file'); - } - } - /** * Returns minimum required XDebug nested level * @return int @@ -74,62 +37,6 @@ class PhpInformation return self::XDEBUG_NESTED_LEVEL; } - /** - * Retrieve list of required extensions - * - * Collect required extensions from composer.lock file - * - * @return array - * @throws \Exception If attributes are missing in composer.lock file. - */ - public function getRequired() - { - if (null === $this->required) { - $composerInfo = $this->getComposerInfo(); - $declaredDependencies = []; - - if (!empty($composerInfo['platform-dev'])) { - $declaredDependencies = array_merge($declaredDependencies, array_keys($composerInfo['platform-dev'])); - } else { - throw new \Exception('Missing key \'platform-dev\' in \'composer.lock\' file'); - } - if (!empty($composerInfo['packages'])) { - foreach ($composerInfo['packages'] as $package) { - if (!empty($package['require'])) { - $declaredDependencies = array_merge($declaredDependencies, array_keys($package['require'])); - } - } - } else { - throw new \Exception('Missing key \'packages\' in \'composer.lock\' file'); - } - if ($declaredDependencies) { - $declaredDependencies = array_unique($declaredDependencies); - $phpDependencies = []; - foreach ($declaredDependencies as $dependency) { - if (stripos($dependency, 'ext-') === 0) { - $phpDependencies[] = substr($dependency, 4); - } - } - $this->required = array_unique($phpDependencies); - } - } - return $this->required; - } - - /** - * Checks existence of composer.lock and returns its contents - * - * @return array - * @throws \Exception - */ - private function getComposerInfo() - { - if (!$this->rootDir->isExist('composer.lock')) { - throw new \Exception('Cannot read \'composer.lock\' file'); - } - return json_decode($this->rootDir->readFile('composer.lock'), true); - } - /** * Retrieve list of currently installed extensions * diff --git a/setup/src/Magento/Setup/Model/SampleData.php b/setup/src/Magento/Setup/Model/SampleData.php index a65fb57df40028a9ac20a1e362cd62d71bf11ba7..9d62982610a1629cd65d348c6512c6afc9dd012e 100644 --- a/setup/src/Magento/Setup/Model/SampleData.php +++ b/setup/src/Magento/Setup/Model/SampleData.php @@ -9,6 +9,7 @@ namespace Magento\Setup\Model; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; use Magento\Framework\ObjectManagerInterface; +use Magento\Framework\Setup\LoggerInterface; /** * Sample data installer diff --git a/setup/src/Magento/Setup/Model/UninstallCollector.php b/setup/src/Magento/Setup/Model/UninstallCollector.php new file mode 100644 index 0000000000000000000000000000000000000000..910a583b33700f376d3bd4d7334bb85cac2d1a0e --- /dev/null +++ b/setup/src/Magento/Setup/Model/UninstallCollector.php @@ -0,0 +1,59 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Model; + +use Magento\Framework\Module\FullModuleList; +use Magento\Framework\ObjectManagerInterface; +use Magento\Framework\Setup\UninstallInterface; + +/** + * Class for collecting all Uninstall interfaces in all modules + */ +class UninstallCollector +{ + /** + * Object manager + * + * @var ObjectManagerInterface + */ + private $objectManager; + + /** + * Constructor + * + * @param ObjectManagerProvider $objectManagerProvider + */ + public function __construct( + ObjectManagerProvider $objectManagerProvider + ) { + $this->objectManager = $objectManagerProvider->get(); + } + + /** + * Collect Uninstall classes from modules + * + * @return UninstallInterface[] + */ + public function collectUninstall() + { + $uninstallList = []; + /** @var \Magento\Setup\Module\DataSetup $setup */ + $setup = $this->objectManager->get('Magento\Setup\Module\DataSetup'); + $result = $setup->getConnection()->select()->from($setup->getTable('setup_module'), ['module']); + // go through modules + foreach ($setup->getConnection()->fetchAll($result) as $row) { + $uninstallClassName = str_replace('_', '\\', $row['module']) . '\Setup\Uninstall'; + if (class_exists($uninstallClassName)) { + $uninstallClass = $this->objectManager->create($uninstallClassName); + if (is_subclass_of($uninstallClass, 'Magento\Framework\Setup\UninstallInterface')) { + $uninstallList[$row['module']] = $uninstallClass; + } + } + } + + return $uninstallList; + } +} diff --git a/setup/src/Magento/Setup/Model/WebLogger.php b/setup/src/Magento/Setup/Model/WebLogger.php index 47fe78fe61d41eebf3de6c05cf1363379244d1e5..fc2064fcf12d04a5638d80ff71f4fab3d925d214 100644 --- a/setup/src/Magento/Setup/Model/WebLogger.php +++ b/setup/src/Magento/Setup/Model/WebLogger.php @@ -8,6 +8,7 @@ namespace Magento\Setup\Model; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; +use Magento\Framework\Setup\LoggerInterface; /** * Web UI Logger diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e676d1a0144ab5c565fd60cf9fc93c586cde57a4 --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php @@ -0,0 +1,128 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Test\Unit\Console\Command; + +use Magento\Setup\Console\Command\BackupCommand; +use Symfony\Component\Console\Tester\CommandTester; + +class BackupCommandTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $objectManager; + + /** + * @var \Magento\Framework\Setup\BackupRollback|\PHPUnit_Framework_MockObject_MockObject + */ + private $backupRollback; + + /** + * @var CommandTester + */ + private $tester; + + /** + * @var \Magento\Framework\Setup\BackupRollbackFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $backupRollbackFactory; + + /** + * @var \Magento\Framework\App\DeploymentConfig|\PHPUnit_Framework_MockObject_MockObject + */ + private $deploymentConfig; + + public function setUp() + { + $maintenanceMode = $this->getMock('Magento\Framework\App\MaintenanceMode', [], [], '', false); + $objectManagerProvider = $this->getMock('Magento\Setup\Model\ObjectManagerProvider', [], [], '', false); + $this->objectManager = $this->getMockForAbstractClass( + 'Magento\Framework\ObjectManagerInterface', + [], + '', + false + ); + $objectManagerProvider->expects($this->any())->method('get')->willReturn($this->objectManager); + $this->backupRollback = $this->getMock('Magento\Framework\Setup\BackupRollback', [], [], '', false); + $this->backupRollbackFactory = $this->getMock( + 'Magento\Framework\Setup\BackupRollbackFactory', + [], + [], + '', + false + ); + $this->backupRollbackFactory->expects($this->any()) + ->method('create') + ->willReturn($this->backupRollback); + $this->deploymentConfig = $this->getMock('Magento\Framework\App\DeploymentConfig', [], [], '', false); + $this->objectManager->expects($this->any()) + ->method('get') + ->will($this->returnValue($this->backupRollbackFactory)); + $command = new BackupCommand( + $objectManagerProvider, + $maintenanceMode, + $this->deploymentConfig + ); + $this->tester = new CommandTester($command); + } + + public function testExecuteCodeBackup() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(true)); + $this->backupRollback->expects($this->once()) + ->method('codeBackup') + ->willReturn($this->backupRollback); + $this->tester->execute(['--code' => true]); + } + + public function testExecuteMediaBackup() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(true)); + $this->backupRollback->expects($this->once()) + ->method('codeBackup') + ->willReturn($this->backupRollback); + $this->tester->execute(['--media' => true]); + } + + public function testExecuteDBBackup() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(true)); + $this->backupRollback->expects($this->once()) + ->method('dbBackup') + ->willReturn($this->backupRollback); + $this->tester->execute(['--db' => true]); + } + + public function testExecuteNotInstalled() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(false)); + $this->tester->execute(['--db' => true]); + $this->assertStringMatchesFormat( + 'No information is available: the Magento application is not installed.%w', + $this->tester->getDisplay() + ); + } + + public function testExecuteNoOptions() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(false)); + $this->tester->execute([]); + $expected = 'Enabling maintenance mode' . PHP_EOL + . 'Not enough information provided to take backup.' . PHP_EOL + . 'Disabling maintenance mode'; + $this->assertStringMatchesFormat($expected, $this->tester->getDisplay()); + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoBackupsListCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoBackupsListCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e0af9b9d16c0470e1f897be095ba723e6d92f0b3 --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoBackupsListCommandTest.php @@ -0,0 +1,39 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Test\Unit\Console\Command; + +use Magento\Setup\Console\Command\InfoBackupsListCommand; +use Symfony\Component\Console\Tester\CommandTester; + +class InfoBackupsListCommandTest extends \PHPUnit_Framework_TestCase +{ + public function testExecute() + { + $table = $this->getMock('Symfony\Component\Console\Helper\Table', [], [], '', false); + $table->expects($this->once())->method('setHeaders')->with(['Backup Filename', 'Backup Type']); + $table->expects($this->once())->method('addRow')->with(['backupFile_media.tgz', 'media']); + /** @var \Symfony\Component\Console\Helper\HelperSet|\PHPUnit_Framework_MockObject_MockObject $helperSet */ + $helperSet = $this->getMock('Symfony\Component\Console\Helper\HelperSet', [], [], '', false); + $helperSet->expects($this->once())->method('get')->with('table')->will($this->returnValue($table)); + /** @var \Magento\Framework\App\Filesystem\DirectoryList + * |\PHPUnit_Framework_MockObject_MockObject $directoryList + */ + $directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); + /** @var \Magento\Framework\Filesystem\Driver\File|\PHPUnit_Framework_MockObject_MockObject $file */ + $file = $this->getMock('Magento\Framework\Filesystem\Driver\File', [], [], '', false); + $file->expects($this->once())->method('isExists')->will($this->returnValue(true)); + $file->expects($this->once()) + ->method('readDirectoryRecursively') + ->will($this->returnValue(['backupFile_media.tgz'])); + $command = new InfoBackupsListCommand($directoryList, $file); + $command->setHelperSet($helperSet); + $commandTester = new CommandTester($command); + $commandTester->execute([]); + $expected = 'Showing backup files in '; + $this->assertStringStartsWith($expected, $commandTester->getDisplay()); + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8aebb12c567bd177216a1df4161bd37620154cea --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php @@ -0,0 +1,516 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Test\Unit\Console\Command; + +use Magento\Framework\Config\ConfigOptionsListConstants; +use Magento\Framework\Config\File\ConfigFilePool; +use Magento\Setup\Console\Command\ModuleUninstallCommand; +use Symfony\Component\Console\Tester\CommandTester; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.TooManyFields) + */ +class ModuleUninstallCommandTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\App\DeploymentConfig|\PHPUnit_Framework_MockObject_MockObject + */ + private $deploymentConfig; + + /** + * @var \Magento\Framework\App\DeploymentConfig\Writer|\PHPUnit_Framework_MockObject_MockObject + */ + private $writer; + + /** + * @var \Magento\Framework\Module\FullModuleList|\PHPUnit_Framework_MockObject_MockObject + */ + private $fullModuleList; + + /** + * @var \Magento\Framework\App\MaintenanceMode|\PHPUnit_Framework_MockObject_MockObject + */ + private $maintenanceMode; + + /** + * @var \Magento\Setup\Model\UninstallCollector|\PHPUnit_Framework_MockObject_MockObject + */ + private $uninstallCollector; + + /** + * @var \Magento\Framework\Module\PackageInfo|\PHPUnit_Framework_MockObject_MockObject + */ + private $packageInfo; + + /** + * @var \Magento\Framework\Module\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + private $moduleResource; + + /** + * @var \Magento\Framework\Module\DependencyChecker|\PHPUnit_Framework_MockObject_MockObject + */ + private $dependencyChecker; + + /** + * @var \Magento\Setup\Module\DataSetup|\PHPUnit_Framework_MockObject_MockObject + */ + private $dataSetup; + + /** + * @var \Magento\Framework\App\Cache|\PHPUnit_Framework_MockObject_MockObject + */ + private $cache; + + /** + * @var \Magento\Framework\App\State\CleanupFiles|\PHPUnit_Framework_MockObject_MockObject + */ + private $cleanupFiles; + + /** + * @var \Magento\Setup\Module\Setup|\PHPUnit_Framework_MockObject_MockObject + */ + private $setup; + + /** + * @var \Magento\Framework\Setup\BackupRollback|\PHPUnit_Framework_MockObject_MockObject + */ + private $backupRollback; + + /** + * @var \Magento\Framework\Setup\BackupRollbackFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $backupRollbackFactory; + + /** + * @var \Magento\Framework\Module\ModuleList\Loader|\PHPUnit_Framework_MockObject_MockObject + */ + private $loader; + + /** + * @var \Magento\Framework\Composer\Remove|\PHPUnit_Framework_MockObject_MockObject + */ + private $remove; + + /** + * @var \Symfony\Component\Console\Helper\QuestionHelper|\PHPUnit_Framework_MockObject_MockObject + */ + private $question; + + /** + * @var \Symfony\Component\Console\Helper\HelperSet|\PHPUnit_Framework_MockObject_MockObject + */ + private $helperSet; + + /** + * @var ModuleUninstallCommand + */ + private $command; + + /** + * @var CommandTester + */ + private $tester; + + /** + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + */ + public function setUp() + { + $this->remove = $this->getMock('Magento\Framework\Composer\Remove', [], [], '', false); + $this->deploymentConfig = $this->getMock('Magento\Framework\App\DeploymentConfig', [], [], '', false); + $this->writer = $this->getMock('Magento\Framework\App\DeploymentConfig\Writer', [], [], '', false); + $this->fullModuleList = $this->getMock('Magento\Framework\Module\FullModuleList', [], [], '', false); + $this->maintenanceMode = $this->getMock('Magento\Framework\App\MaintenanceMode', [], [], '', false); + $objectManagerProvider = $this->getMock('Magento\Setup\Model\ObjectManagerProvider', [], [], '', false); + $objectManager = $this->getMockForAbstractClass('Magento\Framework\ObjectManagerInterface', [], '', false); + $this->uninstallCollector = $this->getMock('Magento\Setup\Model\UninstallCollector', [], [], '', false); + $this->packageInfo = $this->getMock('Magento\Framework\Module\PackageInfo', [], [], '', false); + $packageInfoFactory = $this->getMock('Magento\Framework\Module\PackageInfoFactory', [], [], '', false); + $packageInfoFactory->expects($this->once())->method('create')->willReturn($this->packageInfo); + $this->moduleResource = $this->getMock('Magento\Framework\Module\Resource', [], [], '', false); + $this->dependencyChecker = $this->getMock('Magento\Framework\Module\DependencyChecker', [], [], '', false); + $this->backupRollback = $this->getMock('Magento\Framework\Setup\BackupRollback', [], [], '', false); + $this->backupRollbackFactory = $this->getMock( + 'Magento\Framework\Setup\BackupRollbackFactory', + [], + [], + '', + false + ); + $this->backupRollbackFactory->expects($this->any()) + ->method('create') + ->willReturn($this->backupRollback); + $this->dataSetup = $this->getMock('Magento\Setup\Module\DataSetup', [], [], '', false); + $this->cache = $this->getMock('Magento\Framework\App\Cache', [], [], '', false); + $this->cleanupFiles = $this->getMock('Magento\Framework\App\State\CleanupFiles', [], [], '', false); + $this->setup = $this->getMock('Magento\Setup\Module\Setup', [], [], '', false); + $objectManagerProvider->expects($this->any())->method('get')->willReturn($objectManager); + $objectManager->expects($this->any()) + ->method('get') + ->will($this->returnValueMap([ + ['Magento\Framework\Module\PackageInfoFactory', $packageInfoFactory], + ['Magento\Framework\Module\Resource', $this->moduleResource], + ['Magento\Framework\Module\DependencyChecker', $this->dependencyChecker], + ['Magento\Setup\Module\DataSetup', $this->dataSetup], + ['Magento\Framework\App\Cache', $this->cache], + ['Magento\Framework\App\State\CleanupFiles', $this->cleanupFiles], + ['Magento\Setup\Module\Setup', $this->setup], + ['Magento\Framework\App\State', $this->getMock('Magento\Framework\App\State', [], [], '', false)], + ['Magento\Framework\Setup\BackupRollbackFactory', $this->backupRollbackFactory], + ])); + $composer = $this->getMock('Magento\Framework\Composer\ComposerInformation', [], [], '', false); + $composer->expects($this->any()) + ->method('getRootRequiredPackages') + ->willReturn(['magento/package-a', 'magento/package-b']); + $this->loader = $this->getMock('Magento\Framework\Module\ModuleList\Loader', [], [], '', false); + $this->command = new ModuleUninstallCommand( + $composer, + $this->deploymentConfig, + $this->writer, + $this->fullModuleList, + $this->loader, + $this->maintenanceMode, + $objectManagerProvider, + $this->remove, + $this->uninstallCollector + ); + $this->question = $this->getMock('Symfony\Component\Console\Helper\QuestionHelper', [], [], '', false); + $this->question + ->expects($this->any()) + ->method('ask') + ->will($this->returnValue(true)); + $this->helperSet = $this->getMock('Symfony\Component\Console\Helper\HelperSet', [], [], '', false); + $this->helperSet + ->expects($this->any()) + ->method('get') + ->with('question') + ->will($this->returnValue($this->question)); + $this->command->setHelperSet($this->helperSet); + $this->tester = new CommandTester($this->command); + } + + public function testExecuteApplicationNotInstalled() + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(false); + $this->tester->execute(['module' => ['Magento_A']]); + $this->assertEquals( + 'You cannot run this command because the Magento application is not installed.' . PHP_EOL, + $this->tester->getDisplay() + ); + } + + /** + * @dataProvider executeFailedValidationDataProvider + * @param array $packageInfoMap + * @param array $fullModuleListMap + * @param array $input + * @param array $expect + */ + public function testExecuteFailedValidation( + array $packageInfoMap, + array $fullModuleListMap, + array $input, + array $expect + ) { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(true); + $this->packageInfo->expects($this->exactly(count($input['module']))) + ->method('getPackageName') + ->will($this->returnValueMap($packageInfoMap)); + $this->fullModuleList->expects($this->exactly(count($input['module']))) + ->method('has') + ->will($this->returnValueMap($fullModuleListMap)); + $this->tester->execute($input); + foreach ($expect as $message) { + $this->assertContains($message, $this->tester->getDisplay()); + } + } + + /** + * @return array + */ + public function executeFailedValidationDataProvider() + { + return [ + 'one non-composer package' => [ + [['Magento_C', 'magento/package-c']], + [['Magento_C', true]], + ['module' => ['Magento_C']], + ['Magento_C is not an installed composer package'] + ], + 'one non-composer package, one valid' => [ + [['Magento_A', 'magento/package-a'], ['Magento_C', 'magento/package-c']], + [['Magento_A', true], ['Magento_C', true]], + ['module' => ['Magento_A', 'Magento_C']], + ['Magento_C is not an installed composer package'] + ], + 'two non-composer packages' => [ + [['Magento_C', 'magento/package-c'], ['Magento_D', 'magento/package-d']], + [['Magento_C', true], ['Magento_D', true]], + ['module' => ['Magento_C', 'Magento_D']], + ['Magento_C, Magento_D are not installed composer packages'] + ], + 'one unknown module' => [ + [['Magento_C', '']], + [['Magento_C', false]], + ['module' => ['Magento_C']], + ['Unknown module(s): Magento_C'] + ], + 'two unknown modules' => [ + [['Magento_C', ''], ['Magento_D', '']], + [['Magento_C', false], ['Magento_D', false]], + ['module' => ['Magento_C', 'Magento_D']], + ['Unknown module(s): Magento_C, Magento_D'] + ], + 'one unknown module, one valid' => [ + [['Magento_C', ''], ['Magento_B', 'magento/package-b']], + [['Magento_C', false], ['Magento_B', true]], + ['module' => ['Magento_C', 'Magento_B']], + ['Unknown module(s): Magento_C'] + ], + 'one non-composer package, one unknown module' => [ + [['Magento_C', 'magento/package-c'], ['Magento_D', '']], + [['Magento_C', true], ['Magento_D', false]], + ['module' => ['Magento_C', 'Magento_D']], + ['Magento_C is not an installed composer package', 'Unknown module(s): Magento_D'] + ], + 'two non-composer package, one unknown module' => [ + [['Magento_C', 'magento/package-c'], ['Magento_D', ''], ['Magento_E', 'magento/package-e']], + [['Magento_C', true], ['Magento_D', false], ['Magento_E', true]], + ['module' => ['Magento_C', 'Magento_D', 'Magento_E']], + ['Magento_C, Magento_E are not installed composer packages', 'Unknown module(s): Magento_D'] + ], + 'two non-composer package, two unknown module' => [ + [ + ['Magento_C', 'magento/package-c'], + ['Magento_D', ''], + ['Magento_E', 'magento/package-e'], + ['Magento_F', ''] + ], + [['Magento_C', true], ['Magento_D', false], ['Magento_E', true], ['Magento_F', false]], + ['module' => ['Magento_C', 'Magento_D', 'Magento_E', 'Magento_F']], + ['Magento_C, Magento_E are not installed composer packages', 'Unknown module(s): Magento_D, Magento_F'] + ], + 'two non-composer package, two unknown module, two valid' => [ + [ + ['Magento_C', 'magento/package-c'], + ['Magento_D', ''], + ['Magento_E', 'magento/package-e'], + ['Magento_F', ''], + ['Magento_A', 'magento/package-a'], + ['Magento_B', 'magento/package-b'], + ], + [ + ['Magento_A', true], + ['Magento_B', true], + ['Magento_C', true], + ['Magento_D', false], + ['Magento_E', true], + ['Magento_F', false] + ], + ['module' => ['Magento_A', 'Magento_B', 'Magento_C', 'Magento_D', 'Magento_E', 'Magento_F']], + ['Magento_C, Magento_E are not installed composer packages', 'Unknown module(s): Magento_D, Magento_F'] + ] + ]; + } + + private function setUpPassValidation() + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(true); + $packageMap = [ + ['Magento_A', 'magento/package-a'], + ['Magento_B', 'magento/package-b'], + ]; + $this->packageInfo->expects($this->any()) + ->method('getPackageName') + ->will($this->returnValueMap($packageMap)); + $this->fullModuleList->expects($this->any()) + ->method('has') + ->willReturn(true); + } + + /** + * @dataProvider executeFailedDependenciesDataProvider + * @param array $dependencies + * @param array $input + * @param array $expect + */ + public function testExecuteFailedDependencies( + array $dependencies, + array $input, + array $expect + ) { + $this->setUpPassValidation(); + $this->dependencyChecker->expects($this->once()) + ->method('checkDependenciesWhenDisableModules') + ->willReturn($dependencies); + $this->tester->execute($input); + foreach ($expect as $message) { + $this->assertContains($message, $this->tester->getDisplay()); + } + } + + /** + * @return array + */ + public function executeFailedDependenciesDataProvider() + { + return [ + [ + ['Magento_A' => ['Magento_D' => ['Magento_D', 'Magento_A']]], + ['module' => ['Magento_A']], + [ + "Cannot uninstall module 'Magento_A' because the following module(s) depend on it:" . + PHP_EOL . "\tMagento_D" + ] + ], + [ + ['Magento_A' => ['Magento_D' => ['Magento_D', 'Magento_A']]], + ['module' => ['Magento_A', 'Magento_B']], + [ + "Cannot uninstall module 'Magento_A' because the following module(s) depend on it:" . + PHP_EOL . "\tMagento_D" + ] + ], + [ + [ + 'Magento_A' => ['Magento_D' => ['Magento_D', 'Magento_A']], + 'Magento_B' => ['Magento_E' => ['Magento_E', 'Magento_A']] + ], + ['module' => ['Magento_A', 'Magento_B']], + [ + "Cannot uninstall module 'Magento_A' because the following module(s) depend on it:" . + PHP_EOL . "\tMagento_D", + "Cannot uninstall module 'Magento_B' because the following module(s) depend on it:" . + PHP_EOL . "\tMagento_E" + ] + ], + ]; + } + + private function setUpExecute($input) + { + $this->setUpPassValidation(); + $this->remove->expects($this->once())->method('remove')->with(['magento/package-a', 'magento/package-b']); + $this->dependencyChecker->expects($this->once()) + ->method('checkDependenciesWhenDisableModules') + ->willReturn(['Magento_A' => [], 'Magento_B' => []]); + $this->dataSetup->expects($this->exactly(count($input['module'])))->method('deleteTableRow'); + $this->deploymentConfig->expects($this->once()) + ->method('getConfigData') + ->with(ConfigOptionsListConstants::KEY_MODULES) + ->willReturn(['Magento_A' => 1, 'Magento_B' => 1, 'Magento_C' => 0, 'Magento_D' => 1]); + + $this->loader->expects($this->once()) + ->method('load') + ->with($input['module']) + ->willReturn(['Magento_C' => [], 'Magento_D' => []]); + $this->writer->expects($this->once()) + ->method('saveConfig') + ->with( + [ + ConfigFilePool::APP_CONFIG => + [ConfigOptionsListConstants::KEY_MODULES => ['Magento_C' => 0, 'Magento_D' => 1]] + ] + ); + $this->cache->expects($this->once())->method('clean'); + $this->cleanupFiles->expects($this->once())->method('clearCodeGeneratedClasses'); + + } + + public function testExecute() + { + $input = ['module' => ['Magento_A', 'Magento_B']]; + $this->setUpExecute($input); + $this->tester->execute($input); + } + + public function testExecuteClearStaticContent() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '-c' => true]; + $this->setUpExecute($input); + $this->cleanupFiles->expects($this->once())->method('clearMaterializedViewFiles'); + $this->tester->execute($input); + } + + public function testExecuteRemoveData() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '-r' => true]; + $this->setUpExecute($input); + $uninstallMock = $this->getMockForAbstractClass('Magento\Framework\Setup\UninstallInterface', [], '', false); + $uninstallMock->expects($this->once()) + ->method('uninstall') + ->with($this->setup, $this->isInstanceOf('Magento\Setup\Model\ModuleContext')); + $this->uninstallCollector->expects($this->once()) + ->method('collectUninstall') + ->willReturn(['Magento_A' => $uninstallMock]); + $this->tester->execute($input); + } + + public function testExecuteAll() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '-c' => true, '-r' => true]; + $this->setUpExecute($input); + $this->cleanupFiles->expects($this->once())->method('clearMaterializedViewFiles'); + $uninstallMock = $this->getMockForAbstractClass('Magento\Framework\Setup\UninstallInterface', [], '', false); + $uninstallMock->expects($this->once()) + ->method('uninstall') + ->with($this->setup, $this->isInstanceOf('Magento\Setup\Model\ModuleContext')); + $this->uninstallCollector->expects($this->once()) + ->method('collectUninstall') + ->willReturn(['Magento_A' => $uninstallMock]); + $this->tester->execute($input); + } + + public function testExecuteCodeBackup() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '--backup-code' => true]; + $this->setUpExecute($input); + $this->backupRollback->expects($this->once()) + ->method('codeBackup') + ->willReturn($this->backupRollback); + $this->tester->execute($input); + } + + public function testExecuteMediaBackup() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '--backup-media' => true]; + $this->setUpExecute($input); + $this->backupRollback->expects($this->once()) + ->method('codeBackup') + ->willReturn($this->backupRollback); + $this->tester->execute($input); + } + + public function testExecuteDBBackup() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '--backup-db' => true]; + $this->setUpExecute($input); + $this->backupRollback->expects($this->once()) + ->method('dbBackup') + ->willReturn($this->backupRollback); + $this->tester->execute($input); + } + + public function testInteraction() + { + $input = ['module' => ['Magento_A', 'Magento_B']]; + $this->setUpExecute($input); + $this->question + ->expects($this->once()) + ->method('ask') + ->will($this->returnValue(false)); + $this->helperSet + ->expects($this->once()) + ->method('get') + ->with('question') + ->will($this->returnValue($this->question)); + $this->command->setHelperSet($this->helperSet); + $this->tester = new CommandTester($this->command); + $this->tester->execute($input); + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..dafa2e6e5e2ded5b2ac36de638af359bafc86f3f --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php @@ -0,0 +1,176 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Test\Unit\Console\Command; + +use Magento\Setup\Console\Command\RollbackCommand; +use Symfony\Component\Console\Tester\CommandTester; + +class RollbackCommandTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $objectManager; + + /** + * @var CommandTester + */ + private $tester; + + /** + * @var \Magento\Framework\App\DeploymentConfig|\PHPUnit_Framework_MockObject_MockObject + */ + private $deploymentConfig; + + /** + * @var \Magento\Framework\Setup\BackupRollback|\PHPUnit_Framework_MockObject_MockObject + */ + private $backupRollback; + + /** + * @var \Magento\Framework\Setup\BackupRollbackFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $backupRollbackFactory; + + /** + * @var \Symfony\Component\Console\Helper\HelperSet|\PHPUnit_Framework_MockObject_MockObject + */ + private $helperSet; + + /** + * @var \Symfony\Component\Console\Helper\QuestionHelper|\PHPUnit_Framework_MockObject_MockObject + */ + private $question; + + /** + * @var RollbackCommand + */ + private $command; + + public function setUp() + { + $this->deploymentConfig = $this->getMock('Magento\Framework\App\DeploymentConfig', [], [], '', false); + $maintenanceMode = $this->getMock('Magento\Framework\App\MaintenanceMode', [], [], '', false); + $this->objectManager = $this->getMockForAbstractClass( + 'Magento\Framework\ObjectManagerInterface', + [], + '', + false + ); + $objectManagerProvider = $this->getMock('Magento\Setup\Model\ObjectManagerProvider', [], [], '', false); + $objectManagerProvider->expects($this->any())->method('get')->willReturn($this->objectManager); + $this->backupRollback = $this->getMock('Magento\Framework\Setup\BackupRollback', [], [], '', false); + $this->backupRollbackFactory = $this->getMock( + 'Magento\Framework\Setup\BackupRollbackFactory', + [], + [], + '', + false + ); + $this->backupRollbackFactory->expects($this->any()) + ->method('create') + ->willReturn($this->backupRollback); + $this->objectManager->expects($this->any()) + ->method('get') + ->will($this->returnValueMap([ + ['Magento\Framework\Setup\BackupRollbackFactory', $this->backupRollbackFactory], + ])); + $this->helperSet = $this->getMock('Symfony\Component\Console\Helper\HelperSet', [], [], '', false); + $this->question = $this->getMock('Symfony\Component\Console\Helper\QuestionHelper', [], [], '', false); + $this->question + ->expects($this->any()) + ->method('ask') + ->will($this->returnValue(true)); + $this->helperSet + ->expects($this->any()) + ->method('get') + ->with('question') + ->will($this->returnValue($this->question)); + $this->command = new RollbackCommand( + $objectManagerProvider, + $maintenanceMode, + $this->deploymentConfig + ); + $this->command->setHelperSet($this->helperSet); + $this->tester = new CommandTester($this->command); + } + + public function testExecuteCodeRollback() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(true)); + $this->backupRollback->expects($this->once()) + ->method('codeRollback') + ->willReturn($this->backupRollback); + $this->tester->execute(['--code-file' => 'A.tgz']); + } + + public function testExecuteMediaRollback() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(true)); + $this->backupRollback->expects($this->once()) + ->method('codeRollback') + ->willReturn($this->backupRollback); + $this->tester->execute(['--media-file' => 'A.tgz']); + } + + public function testExecuteDBRollback() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(true)); + $this->backupRollback->expects($this->once()) + ->method('dbRollback') + ->willReturn($this->backupRollback); + $this->tester->execute(['--db-file' => 'C.gz']); + } + + public function testExecuteNotInstalled() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(false)); + $this->tester->execute(['--db-file' => 'C.gz']); + $this->assertStringMatchesFormat( + 'No information is available: the Magento application is not installed.%w', + $this->tester->getDisplay() + ); + } + + public function testExecuteNoOptions() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(true)); + $this->tester->execute([]); + $expected = 'Enabling maintenance mode' . PHP_EOL + . 'Not enough information provided to roll back.' . PHP_EOL + . 'Disabling maintenance mode'; + $this->assertStringMatchesFormat($expected, $this->tester->getDisplay()); + } + + public function testInteraction() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->will($this->returnValue(true)); + $this->question + ->expects($this->once()) + ->method('ask') + ->will($this->returnValue(false)); + $this->helperSet + ->expects($this->once()) + ->method('get') + ->with('question') + ->will($this->returnValue($this->question)); + $this->command->setHelperSet($this->helperSet); + $this->tester = new CommandTester($this->command); + $this->tester->execute(['--db-file' => 'C.gz']); + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php b/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php index 8e881bada2d989eaa76fba23836eb69349ff5252..28f5eea3921cc39fc00f315a8ef694380f017f3e 100644 --- a/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php @@ -88,7 +88,7 @@ class InstallerFactoryTest extends \PHPUnit_Framework_TestCase ->method('get') ->will($this->returnValueMap($returnValueMap)); - $log = $this->getMockForAbstractClass('Magento\Setup\Model\LoggerInterface'); + $log = $this->getMockForAbstractClass('Magento\Framework\Setup\LoggerInterface'); $resourceFactoryMock = $this->getMock('Magento\Setup\Module\ResourceFactory', [], [], '', false); $resourceFactoryMock ->expects($this->any()) diff --git a/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php b/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php index 931d8e315e68c42205d3687b4ee9d84a539b1de0..1028606309a13b89848b4f42d4a6560774278493 100644 --- a/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php @@ -67,7 +67,7 @@ class InstallerTest extends \PHPUnit_Framework_TestCase private $adminFactory; /** - * @var \Magento\Setup\Model\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Setup\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject */ private $logger; @@ -150,7 +150,7 @@ class InstallerTest extends \PHPUnit_Framework_TestCase $this->moduleLoader = $this->getMock('Magento\Framework\Module\ModuleList\Loader', [], [], '', false); $this->directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); $this->adminFactory = $this->getMock('Magento\Setup\Model\AdminAccountFactory', [], [], '', false); - $this->logger = $this->getMockForAbstractClass('Magento\Setup\Model\LoggerInterface'); + $this->logger = $this->getMockForAbstractClass('Magento\Framework\Setup\LoggerInterface'); $this->random = $this->getMock('Magento\Framework\Math\Random', [], [], '', false); $this->connection = $this->getMockForAbstractClass('Magento\Framework\DB\Adapter\AdapterInterface'); $this->maintenanceMode = $this->getMock('Magento\Framework\App\MaintenanceMode', [], [], '', false); diff --git a/setup/src/Magento/Setup/Test/Unit/Model/PhpInformationTest.php b/setup/src/Magento/Setup/Test/Unit/Model/PhpInformationTest.php index c8be0b5d80437fca31de20612e64e79d0720d8ab..9c1feb0c8e31cb348bb8a1d73dea73b28b197967 100644 --- a/setup/src/Magento/Setup/Test/Unit/Model/PhpInformationTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Model/PhpInformationTest.php @@ -8,151 +8,28 @@ namespace Magento\Setup\Test\Unit\Model; use \Magento\Setup\Model\PhpInformation; +/** + * Tests Magento\Setup\Model\PhpInformation + */ class PhpInformationTest extends \PHPUnit_Framework_TestCase { - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Filesystem\Directory\Read - */ - private $directoryReadMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Filesystem - */ - private $filesystemMock; - - public function setUp() - { - $this->directoryReadMock = $this->getMock('Magento\Framework\Filesystem\Directory\Read', [], [], '', false); - $this->filesystemMock = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); - $this->filesystemMock - ->expects($this->once()) - ->method('getDirectoryRead') - ->will($this->returnValue($this->directoryReadMock)); - } - - public function testGetRequiredPhpVersion() - { - $this->directoryReadMock - ->expects($this->once()) - ->method('isExist') - ->will($this->returnValue(true)); - $this->directoryReadMock - ->expects($this->once()) - ->method('readFile') - ->with('composer.lock') - ->will($this->returnValue('{"platform":{"php":"~a.b.c|~a.e.f"}}')); - - $phpInfo = new PhpInformation($this->filesystemMock); - $this->assertEquals("~a.b.c|~a.e.f", $phpInfo->getRequiredPhpVersion()); - } - - /** - * @expectedException \Exception - * @expectedExceptionMessage Cannot read 'composer.lock' file - */ - public function testGetRequiredPhpVersionExceptionNoComposerLock() - { - $this->directoryReadMock - ->expects($this->once()) - ->method('isExist') - ->will($this->returnValue(false)); - - $phpInfo = new PhpInformation($this->filesystemMock); - $phpInfo->getRequiredPhpVersion(); - } - - /** - * @expectedException \Exception - * @expectedExceptionMessage Missing key 'platform=>php' in 'composer.lock' file - */ - public function testGetRequiredPhpVersionExceptionMissingKey() - { - $this->directoryReadMock - ->expects($this->once()) - ->method('isExist') - ->will($this->returnValue(true)); - $this->directoryReadMock - ->expects($this->once()) - ->method('readFile') - ->with('composer.lock') - ->will($this->returnValue('{}')); - - $phpInfo = new PhpInformation($this->filesystemMock); - $phpInfo->getRequiredPhpVersion(); - } - - public function testGetRequired() + public function testGetRequiredMinimumXDebugNestedLevel() { - $this->directoryReadMock - ->expects($this->once()) - ->method('isExist') - ->will($this->returnValue(true)); - $this->directoryReadMock - ->expects($this->once()) - ->method('readFile') - ->with('composer.lock') - ->will($this->returnValue( - '{"platform-dev":{"ext-e":"*", "f":"*"}, ' . - '"packages":[{"name":"a","require":{"c":"*"}}, {"name":"b","require":{"ext-d":"*"}}]}' - )); - $phpInfo = new PhpInformation($this->filesystemMock); - $this->assertEquals(['e', 'd'], $phpInfo->getRequired()); + $phpInformation = new PhpInformation(); + $this->assertEquals(200, $phpInformation->getRequiredMinimumXDebugNestedLevel()); } - /** - * @expectedException \Exception - * @expectedExceptionMessage Cannot read 'composer.lock' file - */ - public function testGetRequiredNoComposerLock() + public function testGetCurrent() { - $this->directoryReadMock - ->expects($this->once()) - ->method('isExist') - ->will($this->returnValue(false)); - - $phpInfo = new PhpInformation($this->filesystemMock); - $phpInfo->getRequired(); - } + $phpInformation = new PhpInformation(); - /** - * @expectedException \Exception - * @expectedExceptionMessage Missing key 'platform-dev' in 'composer.lock' file - */ - public function testGetRequiredExceptionMissingPlatformDev() - { - $this->directoryReadMock - ->expects($this->once()) - ->method('isExist') - ->will($this->returnValue(true)); - $this->directoryReadMock - ->expects($this->once()) - ->method('readFile') - ->with('composer.lock') - ->will( - $this->returnValue( - '{"packages":[{"name":"a","require":{"c":"*"}}, {"name":"b","require":{"ext-d":"*"}}]}' - ) - ); - $phpInfo = new PhpInformation($this->filesystemMock); - $phpInfo->getRequired(); - } + // Class variable 'current' should be empty the first time + $this->assertAttributeEmpty('current', $phpInformation); + $actualExtensions = $phpInformation->getCurrent(); + $this->assertTrue(is_array($actualExtensions)); - /** - * @expectedException \Exception - * @expectedExceptionMessage Missing key 'packages' in 'composer.lock' file - */ - public function testGetRequiredExceptionMissingPackages() - { - $this->directoryReadMock - ->expects($this->once()) - ->method('isExist') - ->will($this->returnValue(true)); - $this->directoryReadMock - ->expects($this->once()) - ->method('readFile') - ->with('composer.lock') - ->will($this->returnValue('{"platform-dev":{"ext-e":"*", "f":"*"}}')); - $phpInfo = new PhpInformation($this->filesystemMock); - $phpInfo->getRequired(); + // Calling second type should cause class variable to be used + $this->assertSame($actualExtensions, $phpInformation->getCurrent()); + $this->assertAttributeNotEmpty('current', $phpInformation); } } diff --git a/setup/src/Magento/Setup/Test/Unit/Model/UninstallCollectorTest.php b/setup/src/Magento/Setup/Test/Unit/Model/UninstallCollectorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..3bf9d3c93b2e4ff3ddfc4411267acd7e1760433b --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Model/UninstallCollectorTest.php @@ -0,0 +1,83 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Setup\Test\Unit\Model; + +use Magento\Setup\Model\UninstallCollector; + +class UninstallCollectorTest extends \PHPUnit_Framework_TestCase +{ + public function testCollectUninstall() + { + $objectManagerProvider = $this->getMock('Magento\Setup\Model\ObjectManagerProvider', [], [], '', false); + $objectManager = $this->getMockForAbstractClass('Magento\Framework\ObjectManagerInterface', [], '', false); + $objectManagerProvider->expects($this->once())->method('get')->willReturn($objectManager); + + $setup = $this->getMock('Magento\Setup\Module\DataSetup', [], [], '', false); + $adapterInterface = $this->getMockForAbstractClass( + 'Magento\Framework\DB\Adapter\AdapterInterface', + [], + '', + false + ); + $select = $this->getMock('Magento\Framework\DB\Select', ['from'], [], '', false); + $adapterInterface->expects($this->once())->method('select')->willReturn($select); + $setup->expects($this->exactly(2))->method('getConnection')->willReturn($adapterInterface); + $result = $this->getMock('Magento\Framework\DB\Select', [], [], '', false); + $select->expects($this->once())->method('from')->willReturn($result); + $adapterInterface->expects($this->once()) + ->method('fetchAll') + ->with($result) + ->willReturn([['module' => 'Magento_A'], ['module' => 'Magento_B'], ['module' => 'Magento_C']]); + + $uninstallA = 'Uninstall Class A'; + $uninstallB = 'Uninstall Class B'; + $objectManager->expects($this->any()) + ->method('create') + ->will( + $this->returnValueMap([ + ['Magento\A\Setup\Uninstall', [], $uninstallA], + ['Magento\B\Setup\Uninstall', [], $uninstallB], + ]) + ); + $objectManager->expects($this->any())->method('get') + ->with('Magento\Setup\Module\DataSetup') + ->willReturn($setup); + + $collector = new UninstallCollector($objectManagerProvider); + $this->assertEquals(['Magento_A' => 'Uninstall Class A'], $collector->collectUninstall()); + } +} + +namespace Magento\Setup\Model; + +/** + * This function overrides the native function for the purpose of testing + * + * @param string $obj + * @param string $className + * @return bool + */ +function is_subclass_of($obj, $className) +{ + if ($obj == 'Uninstall Class A' && $className == 'Magento\Framework\Setup\UninstallInterface') { + return true; + } + return false; +} + +/** + * This function overrides the native function for the purpose of testing + * + * @param string $className + * @return bool + */ +function class_exists($className) +{ + if ($className == 'Magento\A\Setup\Uninstall' || $className == 'Magento\B\Setup\Uninstall') { + return true; + } + return false; +}