diff --git a/composer.json b/composer.json index b96584c..b9193e4 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "php": "^7.3", "ext-json": "*", "tightenco/collect": "^7.2", - "trash-panda/progress-bar-log": "^1.1", + "trash-panda/progress-bar-log": "^1.5", "magento/framework": "^102", "magento/module-catalog": "^103.0.5", "magento/module-catalog-inventory": "^100.3.5", diff --git a/composer.lock b/composer.lock index 0c54ea3..0583dfc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8a4c7e73e71714779372b1383c11f3cc", + "content-hash": "5f04fc66bc5441c0d9248326fee1fa8c", "packages": [ { "name": "colinmollenhour/credis", @@ -151,16 +151,16 @@ }, { "name": "composer/composer", - "version": "1.10.7", + "version": "1.10.8", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "956608ea4f7de9e58c53dfb019d85ae62b193c39" + "reference": "56e0e094478f30935e9128552188355fa9712291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/956608ea4f7de9e58c53dfb019d85ae62b193c39", - "reference": "956608ea4f7de9e58c53dfb019d85ae62b193c39", + "url": "https://api.github.com/repos/composer/composer/zipball/56e0e094478f30935e9128552188355fa9712291", + "reference": "56e0e094478f30935e9128552188355fa9712291", "shasum": "" }, "require": { @@ -179,12 +179,11 @@ "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" }, "conflict": { - "symfony/console": "2.8.38", - "symfony/phpunit-bridge": "3.4.40" + "symfony/console": "2.8.38" }, "require-dev": { "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^3.4" + "symfony/phpunit-bridge": "^4.2" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -242,7 +241,7 @@ "type": "tidelift" } ], - "time": "2020-06-03T08:03:56+00:00" + "time": "2020-06-24T19:23:30+00:00" }, { "name": "composer/semver", @@ -1255,16 +1254,16 @@ }, { "name": "laminas/laminas-form", - "version": "2.14.6", + "version": "2.15.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-form.git", - "reference": "c19b62ed8394bcf2038ab3f51a49b7d0ef4e1700" + "reference": "359cd372c565e18a17f32ccfeacdf21bba091ce2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-form/zipball/c19b62ed8394bcf2038ab3f51a49b7d0ef4e1700", - "reference": "c19b62ed8394bcf2038ab3f51a49b7d0ef4e1700", + "url": "https://api.github.com/repos/laminas/laminas-form/zipball/359cd372c565e18a17f32ccfeacdf21bba091ce2", + "reference": "359cd372c565e18a17f32ccfeacdf21bba091ce2", "shasum": "" }, "require": { @@ -1307,8 +1306,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.14.x-dev", - "dev-develop": "2.15.x-dev" + "dev-master": "2.15.x-dev", + "dev-develop": "2.16.x-dev" }, "laminas": { "component": "Laminas\\Form", @@ -1339,20 +1338,20 @@ "type": "community_bridge" } ], - "time": "2020-06-22T20:17:02+00:00" + "time": "2020-07-14T13:53:27+00:00" }, { "name": "laminas/laminas-http", - "version": "2.11.2", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-http.git", - "reference": "8c66963b933c80da59433da56a44dfa979f3ec88" + "reference": "48bd06ffa3a6875e2b77d6852405eb7b1589d575" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-http/zipball/8c66963b933c80da59433da56a44dfa979f3ec88", - "reference": "8c66963b933c80da59433da56a44dfa979f3ec88", + "url": "https://api.github.com/repos/laminas/laminas-http/zipball/48bd06ffa3a6875e2b77d6852405eb7b1589d575", + "reference": "48bd06ffa3a6875e2b77d6852405eb7b1589d575", "shasum": "" }, "require": { @@ -1364,7 +1363,7 @@ "php": "^5.6 || ^7.0" }, "replace": { - "zendframework/zend-http": "self.version" + "zendframework/zend-http": "^2.11.2" }, "require-dev": { "laminas/laminas-coding-standard": "~1.0.0", @@ -1377,8 +1376,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.11.x-dev", - "dev-develop": "2.12.x-dev" + "dev-master": "2.12.x-dev", + "dev-develop": "2.13.x-dev" } }, "autoload": { @@ -1397,7 +1396,13 @@ "http client", "laminas" ], - "time": "2019-12-31T17:02:36+00:00" + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-06-23T15:14:37+00:00" }, { "name": "laminas/laminas-hydrator", @@ -1575,16 +1580,16 @@ }, { "name": "laminas/laminas-mail", - "version": "2.10.1", + "version": "2.11.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-mail.git", - "reference": "cfe0711446c8d9c392e9fc664c9ccc180fa89005" + "reference": "4c5545637eea3dc745668ddff1028692ed004c4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-mail/zipball/cfe0711446c8d9c392e9fc664c9ccc180fa89005", - "reference": "cfe0711446c8d9c392e9fc664c9ccc180fa89005", + "url": "https://api.github.com/repos/laminas/laminas-mail/zipball/4c5545637eea3dc745668ddff1028692ed004c4b", + "reference": "4c5545637eea3dc745668ddff1028692ed004c4b", "shasum": "" }, "require": { @@ -1614,8 +1619,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.10.x-dev", - "dev-develop": "2.11.x-dev" + "dev-master": "2.11.x-dev", + "dev-develop": "2.12.x-dev" }, "laminas": { "component": "Laminas\\Mail", @@ -1643,7 +1648,7 @@ "type": "community_bridge" } ], - "time": "2020-04-21T16:42:19+00:00" + "time": "2020-06-30T20:17:23+00:00" }, { "name": "laminas/laminas-math", @@ -4582,6 +4587,51 @@ ], "time": "2020-05-22T07:31:27+00:00" }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "time": "2018-07-02T15:55:56+00:00" + }, { "name": "psr/container", "version": "1.0.0", @@ -4829,16 +4879,16 @@ }, { "name": "seld/phar-utils", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", "shasum": "" }, "require": { @@ -4869,7 +4919,7 @@ "keywords": [ "phar" ], - "time": "2020-02-14T15:25:33+00:00" + "time": "2020-07-07T18:42:57+00:00" }, { "name": "symfony/console", @@ -5091,16 +5141,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d" + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d", - "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", "shasum": "" }, "require": { @@ -5112,7 +5162,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5163,25 +5213,26 @@ "type": "tidelift" } ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a57f8161502549a742a63c09f0a604997bf47027" + "reference": "bc6549d068d0160e0f10f7a5a23c7d1406b95ebe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a57f8161502549a742a63c09f0a604997bf47027", - "reference": "a57f8161502549a742a63c09f0a604997bf47027", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/bc6549d068d0160e0f10f7a5a23c7d1406b95ebe", + "reference": "bc6549d068d0160e0f10f7a5a23c7d1406b95ebe", "shasum": "" }, "require": { "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", "symfony/polyfill-php72": "^1.10" }, "suggest": { @@ -5190,7 +5241,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5214,6 +5265,10 @@ "name": "Laurent Bassin", "email": "laurent@bassin.info" }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -5243,20 +5298,101 @@ "type": "tidelift" } ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.18.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7110338d81ce1cbc3e273136e4574663627037a7" + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7", - "reference": "7110338d81ce1cbc3e273136e4574663627037a7", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", "shasum": "" }, "require": { @@ -5268,7 +5404,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5320,20 +5456,97 @@ "type": "tidelift" } ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.18.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.17.0", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "f048e612a3905f34931127360bdd2def19a5e582" + "reference": "639447d008615574653fb3bc60d1986d7172eaae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", - "reference": "f048e612a3905f34931127360bdd2def19a5e582", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", + "reference": "639447d008615574653fb3bc60d1986d7172eaae", "shasum": "" }, "require": { @@ -5342,7 +5555,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -5389,20 +5606,20 @@ "type": "tidelift" } ], - "time": "2020-05-12T16:47:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fa0837fe02d617d31fbb25f990655861bb27bd1a" + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fa0837fe02d617d31fbb25f990655861bb27bd1a", - "reference": "fa0837fe02d617d31fbb25f990655861bb27bd1a", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", "shasum": "" }, "require": { @@ -5411,7 +5628,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5465,20 +5682,20 @@ "type": "tidelift" } ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4a5b6bba3259902e386eb80dd1956181ee90b5b2" + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4a5b6bba3259902e386eb80dd1956181ee90b5b2", - "reference": "4a5b6bba3259902e386eb80dd1956181ee90b5b2", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", "shasum": "" }, "require": { @@ -5487,7 +5704,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5545,7 +5762,7 @@ "type": "tidelift" } ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/process", @@ -5612,16 +5829,16 @@ }, { "name": "symfony/service-contracts", - "version": "v2.1.2", + "version": "v2.1.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b" + "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/66a8f0957a3ca54e4f724e49028ab19d75a8918b", - "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/58c7475e5457c5492c26cc740cc0ad7464be9442", + "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442", "shasum": "" }, "require": { @@ -5635,6 +5852,10 @@ "extra": { "branch-alias": { "dev-master": "2.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5680,7 +5901,7 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:43:50+00:00" + "time": "2020-07-06T13:23:11+00:00" }, { "name": "symfony/var-dumper", @@ -5820,16 +6041,16 @@ }, { "name": "tightenco/collect", - "version": "v7.12.0", + "version": "v7.15.0", "source": { "type": "git", "url": "https://github.com/tightenco/collect.git", - "reference": "ba504e959241f1f408867ffd03159b040f66e00b" + "reference": "4606f2088591d34d6c4600604b3ad64d8699698e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tightenco/collect/zipball/ba504e959241f1f408867ffd03159b040f66e00b", - "reference": "ba504e959241f1f408867ffd03159b040f66e00b", + "url": "https://api.github.com/repos/tightenco/collect/zipball/4606f2088591d34d6c4600604b3ad64d8699698e", + "reference": "4606f2088591d34d6c4600604b3ad64d8699698e", "shasum": "" }, "require": { @@ -5866,20 +6087,20 @@ "collection", "laravel" ], - "time": "2020-05-08T22:25:37+00:00" + "time": "2020-07-10T22:07:43+00:00" }, { "name": "trash-panda/progress-bar-log", - "version": "1.4", + "version": "1.5", "source": { "type": "git", "url": "https://github.com/AydinHassan/progress-bar-log.git", - "reference": "8ded0f6080b4f607349f0216d12ba23ebaf1f39b" + "reference": "0379a60eddbf59dc5bab22c6304168414a3fc500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AydinHassan/progress-bar-log/zipball/8ded0f6080b4f607349f0216d12ba23ebaf1f39b", - "reference": "8ded0f6080b4f607349f0216d12ba23ebaf1f39b", + "url": "https://api.github.com/repos/AydinHassan/progress-bar-log/zipball/0379a60eddbf59dc5bab22c6304168414a3fc500", + "reference": "0379a60eddbf59dc5bab22c6304168414a3fc500", "shasum": "" }, "require": { @@ -5914,7 +6135,7 @@ "log", "progress" ], - "time": "2019-02-26T18:33:24+00:00" + "time": "2020-07-15T13:12:19+00:00" }, { "name": "true/punycode", @@ -6097,20 +6318,20 @@ }, { "name": "myclabs/deep-copy", - "version": "1.9.5", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "replace": { "myclabs/deep-copy": "self.version" @@ -6141,7 +6362,13 @@ "object", "object graph" ], - "time": "2020-01-17T21:11:47+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-06-29T13:22:24+00:00" }, { "name": "phar-io/manifest", @@ -6311,25 +6538,25 @@ }, { "name": "phpdocumentor/reflection-common", - "version": "2.1.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b" + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b", - "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { - "php": ">=7.1" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -6356,7 +6583,7 @@ "reflection", "static analysis" ], - "time": "2020-04-27T09:25:28+00:00" + "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", @@ -6413,25 +6640,24 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "30441f2752e493c639526b215ed81d54f369d693" + "reference": "e878a14a65245fbe78f8080eba03b47c3b705651" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30441f2752e493c639526b215ed81d54f369d693", - "reference": "30441f2752e493c639526b215ed81d54f369d693", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651", + "reference": "e878a14a65245fbe78f8080eba03b47c3b705651", "shasum": "" }, "require": { - "php": "^7.2", + "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "^7.2", - "mockery/mockery": "~1" + "ext-tokenizer": "*" }, "type": "library", "extra": { @@ -6455,37 +6681,37 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-06-19T20:22:09+00:00" + "time": "2020-06-27T10:12:23+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.10.3", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "451c3cd1418cf640de218914901e51b064abb093" + "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", - "reference": "451c3cd1418cf640de218914901e51b064abb093", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160", + "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + "doctrine/instantiator": "^1.2", + "php": "^7.2", + "phpdocumentor/reflection-docblock": "^5.0", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^2.5 || ^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10.x-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { @@ -6518,7 +6744,7 @@ "spy", "stub" ], - "time": "2020-03-05T15:02:03+00:00" + "time": "2020-07-08T12:44:21+00:00" }, { "name": "phpunit/php-code-coverage", @@ -7533,23 +7759,23 @@ }, { "name": "theseer/tokenizer", - "version": "1.1.3", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + "reference": "75a63c33a8577608444246075ea0af0d052e452a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -7569,7 +7795,13 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-06-13T22:48:21+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2020-07-12T23:59:07+00:00" }, { "name": "wearejh/m2-unit-test-helpers", @@ -7612,20 +7844,20 @@ }, { "name": "webmozart/assert", - "version": "1.9.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "9dc4f203e36f2b486149058bade43c851dd97451" + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/9dc4f203e36f2b486149058bade43c851dd97451", - "reference": "9dc4f203e36f2b486149058bade43c851dd97451", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0", + "php": "^5.3.3 || ^7.0 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7657,7 +7889,7 @@ "check", "validate" ], - "time": "2020-06-16T10:16:42+00:00" + "time": "2020-07-08T17:02:28+00:00" }, { "name": "zendframework/zendframework1", diff --git a/src/Import/Importer.php b/src/Import/Importer.php index db2105c..f92a5ce 100644 --- a/src/Import/Importer.php +++ b/src/Import/Importer.php @@ -135,18 +135,28 @@ public function process(Config $config): void } try { - $this->traverseSource($report, $config); + $this->traverseSource($config, $report); } catch (\Exception $e) { $report->addError(sprintf('Could not read data from source. Error: "%s"', $e->getMessage())); } - $this->finish($config); + try { + $this->finish($config, $report); + } catch (\Exception $e) { + $report->addError(sprintf( + 'An error occurred when performing post processing tasks (cleanup, indexing, etc) . Error: "%s"', + $e->getMessage() + )); + } - $archiver = $this->archiverFactory->getArchiverForSource($this->source, $config); - if ($report->isSuccessful()) { - $archiver->successful(); - } else { - $archiver->failed(); + try { + $archiver = $this->archiverFactory->getArchiverForSource($this->source, $config); + $report->isSuccessful() ? $archiver->successful() : $archiver->failed(); + } catch (\Exception $e) { + $report->addError(sprintf( + 'An error occurred when archiving the import source . Error: "%s"', + $e->getMessage() + )); } $this->locker->release($config->getImportName()); @@ -200,16 +210,16 @@ private function prepareComponents(Config $config, array $components): void }); } - private function finish(Config $config): void + private function finish(Config $config, Report $report): void { $result = $this->writer->finish($this->source); $this->progress->finish($this->source); - $this->indexer->index($config, $result); + $this->indexer->index($config, $result, $report); } - private function traverseSource(Report $report, Config $config): void + private function traverseSource(Config $config, Report $report): void { $success = function ($rowNumber, array $row) use ($report, $config) { $reportItem = $report->newItem($rowNumber, $config->getIdField(), $row[$config->getIdField()] ?? ''); diff --git a/src/Import/Indexer.php b/src/Import/Indexer.php index 9ecf263..5cffcbf 100644 --- a/src/Import/Indexer.php +++ b/src/Import/Indexer.php @@ -5,6 +5,7 @@ namespace Jh\Import\Import; use Jh\Import\Config; +use Jh\Import\Report\Report; use Magento\Framework\Indexer\IndexerRegistry; use Magento\Framework\Mview\View\StateInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -44,19 +45,20 @@ public function disable(Config $config): void } } - public function index(Config $config, Result $result): void + public function index(Config $config, Result $result, Report $report): void { //if the writer return a result with a list of affected ids //we reindex all the ids using the indexers specified in the config if ($result->hasAffectedIds()) { - $this->output->writeln([ - "Indexing ({$result->affectedIdsCount()}) affected item(s)", - '' - ]); + $report->addInfo("Indexing ({$result->affectedIdsCount()}) affected item(s)"); + $this->outputMessage("Indexing ({$result->affectedIdsCount()}) affected item(s)\n\n"); + $chunkedIds = array_chunk($result->getAffectedIds(), 1000); foreach ($config->getIndexers() as $indexerId) { - $this->output->writeln(" Running Indexer: {$indexerId}"); + $start = new \DateTime(); + $report->addInfo("Running Indexer: {$indexerId}"); + $this->outputMessage(" {$this->getDate()}: Running Indexer: {$indexerId}\n"); try { $indexer = $this->indexerRegistry->get($indexerId); } catch (\InvalidArgumentException $e) { @@ -66,8 +68,24 @@ public function index(Config $config, Result $result): void foreach ($chunkedIds as $ids) { $indexer->reindexList($ids); } + $report->addInfo( + "Finished Indexer: {$indexerId} (elapsed: {$start->diff(new \DateTime())->format('%H:%I:%S')})" + ); + + $this->outputMessage(" {$this->getDate()}: Finished Indexer: {$indexerId}\n"); } - $this->output->writeln(['', 'Finished indexing']); + $report->addInfo("Finished Indexing"); + $this->outputMessage("\nFinished Indexing\n"); } } + + private function getDate(): string + { + return (new \DateTime())->format('H:i:s'); + } + + private function outputMessage(string $message): void + { + $this->output->write($message); + } } diff --git a/src/Progress/CliProgress.php b/src/Progress/CliProgress.php index 0495d51..b209d14 100644 --- a/src/Progress/CliProgress.php +++ b/src/Progress/CliProgress.php @@ -4,6 +4,7 @@ use Jh\Import\Config; use Jh\Import\Source\Source; +use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Output\OutputInterface; use TrashPanda\ProgressBarLog\ProgressBarLog; @@ -54,7 +55,8 @@ public function start(Source $source, Config $config): void $tPad = str_repeat(' ', 40); $format = "\n $tPad\n %title:-39s%\n $tPad\n\n %current%/%max% %bar% "; $format .= "%percent:3s%%\n\n 🏁 %remaining% remaining. Done %elapsed% of estimated "; - $format .= "%estimated% (%memory%)"; + $format .= "%estimated% (%memory%)\n"; + $format .= " Total messages %total_log_count%\n"; $progressBar->setFormat($format); $progressBar->setRedrawFrequency(50); diff --git a/src/Report/Report.php b/src/Report/Report.php index e50eb05..40b673f 100644 --- a/src/Report/Report.php +++ b/src/Report/Report.php @@ -87,17 +87,22 @@ public function getSourceId(): string return $this->sourceId; } - public function addError(string $error) + public function addInfo(string $info): void + { + $this->addMessage(LogLevel::INFO, $info); + } + + public function addError(string $error): void { $this->addMessage(LogLevel::ERROR, $error); } - public function addWarning(string $warning) + public function addWarning(string $warning): void { $this->addMessage(LogLevel::WARNING, $warning); } - public function addMessage(string $logLevel, $message) + public function addMessage(string $logLevel, $message): void { $message = new Message($logLevel, $message); @@ -110,7 +115,7 @@ public function addMessage(string $logLevel, $message) } } - public function finish(\DateTime $finishTime = null, int $memoryUsage = null) + public function finish(\DateTime $finishTime = null, int $memoryUsage = null): void { $finishTime = $finishTime ?: new \DateTime(); $memoryUsage = $memoryUsage ?: memory_get_usage(true); diff --git a/src/view/adminhtml/ui_component/import_history_log_listing.xml b/src/view/adminhtml/ui_component/import_history_log_listing.xml index c25f358..5bd8dcb 100644 --- a/src/view/adminhtml/ui_component/import_history_log_listing.xml +++ b/src/view/adminhtml/ui_component/import_history_log_listing.xml @@ -55,7 +55,25 @@ textRange asc ID - 20 + + + + + + + + dateRange + date + Magento_Ui/js/grid/columns/date + Created At + + + + + + + + Log Level @@ -65,9 +83,8 @@ text Message - 30 - \ No newline at end of file + diff --git a/test/Import/ImporterTest.php b/test/Import/ImporterTest.php index 61fa54c..fbcf5c5 100644 --- a/test/Import/ImporterTest.php +++ b/test/Import/ImporterTest.php @@ -67,23 +67,27 @@ public function testIndexersAreDisabledAtStartAndIndexedAtEnd(): void $om = $this->prophesize(ObjectManagerInterface::class); $writer = $this->prophesize(Writer::class); $history = $this->prophesize(History::class); - $history->isImported(Argument::type(Source::class))->willReturn(false); - + $reportFactory = $this->prophesize(ReportFactory::class); $indexer = $this->prophesize(Indexer::class); + $history->isImported(Argument::type(Source::class))->willReturn(false); + $importer = $this->getObject(Importer::class, [ - 'source' => Iterator::fromCallable(function () { + 'source' => $source = Iterator::fromCallable(function () { yield [1]; yield [2]; yield [3]; }), - 'reportFactory' => $this->reportFactory($config)->reveal(), + 'reportFactory' => $reportFactory->reveal(), 'archiverFactory' => new Factory($om->reveal()), 'history' => $history->reveal(), 'writer' => $writer->reveal(), 'indexer' => $indexer->reveal() ]); + $report = new Report([$handler = new CollectingHandler()], 'product', 'some-source'); + $reportFactory->createFromSourceAndConfig($source, $config)->willReturn($report); + $result = new Result([1, 2, 3]); $writer->prepare(Argument::type(Source::class))->shouldBeCalled(); @@ -92,10 +96,10 @@ public function testIndexersAreDisabledAtStartAndIndexedAtEnd(): void $importer->process($config); $indexer->disable($config)->shouldHaveBeenCalled(); - $indexer->index($config, $result)->shouldHaveBeenCalled(); + $indexer->index($config, $result, $report)->shouldHaveBeenCalled(); } - public function testProgressIsAdvancedForEachRecordWithErrors() + public function testProgressIsAdvancedForEachRecordWithErrors(): void { $config = new Config('product', ['id_field' => 'sku']); $om = $this->prophesize(ObjectManagerInterface::class); @@ -123,7 +127,7 @@ public function testProgressIsAdvancedForEachRecordWithErrors() $importer->process($config); } - public function testWriterIsPassedEachRecordAndSourceIsArchived() + public function testWriterIsPassedEachRecordAndSourceIsArchived(): void { $config = new Config('product', ['id_field' => 'sku']); $archiveFactory = $this->prophesize(Factory::class); @@ -159,7 +163,7 @@ public function testWriterIsPassedEachRecordAndSourceIsArchived() $archiver->successful()->shouldHaveBeenCalled(); } - public function testTransformersRunOnEveryRecord() + public function testTransformersRunOnEveryRecord(): void { $config = new Config('product', ['id_field' => 'sku']); $om = $this->prophesize(ObjectManagerInterface::class); @@ -196,7 +200,7 @@ public function testTransformersRunOnEveryRecord() ); } - public function testFiltersRunOnEveryRecord() + public function testFiltersRunOnEveryRecord(): void { $config = new Config('product', ['id_field' => 'sku']); $om = $this->prophesize(ObjectManagerInterface::class); @@ -229,7 +233,7 @@ public function testFiltersRunOnEveryRecord() ); } - public function testExceptionsAreAddedAsErrorsAndArchiveFailedIsInvoked() + public function testExceptionsAreAddedAsErrorsAndArchiveFailedIsInvoked(): void { $config = new Config('product', ['id_field' => 'sku']); $archiveFactory = $this->prophesize(Factory::class); @@ -269,7 +273,7 @@ public function testExceptionsAreAddedAsErrorsAndArchiveFailedIsInvoked() ); } - public function testImporterIsSkippedIfItIsLocked() + public function testImporterIsSkippedIfItIsLocked(): void { $config = new Config('product', ['id_field' => 'sku']); $archiveFactory = $this->prophesize(Factory::class); @@ -309,7 +313,7 @@ public function testImporterIsSkippedIfItIsLocked() ); } - public function testImportIsSkippedIfSourceAlreadyImported() + public function testImportIsSkippedIfSourceAlreadyImported(): void { $config = new Config('product', ['id_field' => 'sku']); $reportFactory = $this->prophesize(ReportFactory::class); diff --git a/test/Import/IndexerTest.php b/test/Import/IndexerTest.php index e10b3ac..efc0ab9 100644 --- a/test/Import/IndexerTest.php +++ b/test/Import/IndexerTest.php @@ -7,6 +7,8 @@ use Jh\Import\Config; use Jh\Import\Import\Indexer; use Jh\Import\Import\Result; +use Jh\Import\Report\Handler\CollectingHandler; +use Jh\Import\Report\Report; use Magento\Framework\Indexer\IndexerInterface; use Magento\Framework\Indexer\IndexerRegistry; use Magento\Framework\Mview\ViewInterface; @@ -50,7 +52,7 @@ public function testIndexersAreCalledWithAffectedIds(): void $indexerRegistry->get('My\OtherIndexer')->willReturn($indexer2); $indexer->disable($config); - $indexer->index($config, new Result([1, 2, 3, 4, 5])); + $indexer->index($config, new Result([1, 2, 3, 4, 5]), new Report([], 'product', '')); } public function testIndexersAreCalledWithChunkedAffectedIds(): void @@ -74,7 +76,47 @@ public function testIndexersAreCalledWithChunkedAffectedIds(): void $indexerRegistry->get('My\OtherIndexer')->willReturn($indexer2); $indexer->disable($config); - $indexer->index($config, new Result(range(0, 2000))); + $indexer->index($config, new Result(range(0, 2000)), new Report([], 'product', '')); + } + + public function testReportIsNotifiedRegardingIndexingInfo(): void + { + $config = new Config('product', ['id_field' => 'sku', 'indexers' => ['My\Indexer', 'My\OtherIndexer']]); + $indexerRegistry = $this->prophesize(IndexerRegistry::class); + + $indexer = new Indexer($indexerRegistry->reveal(), new NullOutput()); + + $indexer1 = $this->createDisableIndexerMock(); + $indexer2 = $this->createDisableIndexerMock(); + + $indexer1->reindexList(range(0, 999))->shouldBeCalled(); + $indexer1->reindexList(range(1000, 1999))->shouldBeCalled(); + $indexer1->reindexList([2000])->shouldBeCalled(); + $indexer2->reindexList(range(0, 999))->shouldBeCalled(); + $indexer2->reindexList(range(1000, 1999))->shouldBeCalled(); + $indexer2->reindexList([2000])->shouldBeCalled(); + + $indexerRegistry->get('My\Indexer')->willReturn($indexer1); + $indexerRegistry->get('My\OtherIndexer')->willReturn($indexer2); + + $indexer->disable($config); + $indexer->index( + $config, + new Result(range(0, 2000)), + new Report([$handler = new CollectingHandler()], 'product', '') + ); + + self::assertEquals( + [ + ['log_level' => 'INFO', 'message' => 'Indexing (2001) affected item(s)'], + ['log_level' => 'INFO', 'message' => 'Running Indexer: My\Indexer'], + ['log_level' => 'INFO', 'message' => 'Finished Indexer: My\Indexer (elapsed: 00:00:00)'], + ['log_level' => 'INFO', 'message' => 'Running Indexer: My\OtherIndexer'], + ['log_level' => 'INFO', 'message' => 'Finished Indexer: My\OtherIndexer (elapsed: 00:00:00)'], + ['log_level' => 'INFO', 'message' => 'Finished Indexing'] + ], + $handler->messages + ); } private function createDisableIndexerMock(): ObjectProphecy