diff --git a/.circleci/config.yml b/.circleci/config.yml index e4646dca..f73c667d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ # # Check https://circleci.com/docs/2.0/language-php/ for more details # -version: 2 +version: 2.0 jobs: build: docker: @@ -12,8 +12,14 @@ jobs: steps: - checkout + - run: + name: Install puppeteer with chromium + command: | + npm i puppeteer + - run: sudo apt update - run: sudo docker-php-ext-install zip + - run: sudo docker-php-ext-install exif && sudo docker-php-ext-enable exif # Download and cache dependencies @@ -33,7 +39,7 @@ jobs: - vendor - run: ./vendor/bin/phpunit - - run: ./vendor/bin/phpcs ./ + - run: ./vendor/bin/phpcs ./src deploy: docker: @@ -45,6 +51,7 @@ jobs: - run: sudo apt-get install golang-go - run: sudo docker-php-ext-install zip - run: sudo docker-php-ext-install bcmath && sudo docker-php-ext-enable bcmath + - run: sudo docker-php-ext-install exif && sudo docker-php-ext-enable exif - run: composer install -n --no-dev --prefer-dist diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..312b7490 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,23 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**Sample configuration** +Provide the configuration that caused the bug. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..7521d9ff --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Description** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Proposed solution** +A clear and concise description of what you want to happen. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..58e7c2ab --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,39 @@ +# Contributing to Merlin Framework + +Thanks for taking the time to contribute! + +#### Table of contents + +[How can I contribute?](#how-can-i-contribute) + * [Reporting bugs](#reporting-bugs) + * [Before submitting a bug report](#before-submitting-a-bug-report) + * [What makes a good bug report?](#what-makes-a-good-bug-report) + * [Suggesting enhancements](#suggesting-enhancements) + * [Your first code contribution](#your-first-code-contribution) + * [Pull requests](#pull-requests) + +## How can I contribute? + +### Reporting bugs + +This section guides you through creating and submitting a bug report. Following these guidelines helps maintainers and the community understand your report, reporoduce the behaviour and fix the problems. + +Before creating a bug report, please check [the issue list](https://github.com/salsadigitalauorg/merlin-framework/issues) and make sure that it is not something planned or raised before. When you are creating a bug report, please include as many details as possible and fill out the required template, it will help us resolve issues faster. + +>>> **Note**: If you find a closed issue that seems like it is the same as what you're experiencing please open a new issue and include a link to the original issue. + +#### Before submitting a bug report + +* **Check the issue queue** to see if the problem has been previously reported. If it has and the issue is still open, add a comment to the existing issue instead of opening a new one. + +#### What makes a good bug report? + +Bugs are tracked using the Github issue queue. When creating a new bug report explain the problem and include as much detail as possible to help maintainers reproduce the problem: + +* **Use a clear and descriptive title** for the issue to identify the problem. +* **Provide the configuration that caused the problem** as this will allow the maintainers to quickly dive into the issue and find the cause. +* **Describe the behaviour observed** and point out exactly what the problems with that behaviour. +* **Explain what behaviour is expected**. +* **If the problem wasn't triggered by a specific user acount** describe what you were doing before the problem happened and share as much information as you can. + + diff --git a/README.md b/README.md new file mode 100644 index 00000000..e4b9e9e7 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Merlin + +Welcome to Merlin a simple tool to aid content migration from an arbitrary source to a structured format ready for consumption by another system. + +## Requirements + +- PHP > 7.2 +- Composer diff --git a/composer.json b/composer.json index bfd65b9b..5110c532 100644 --- a/composer.json +++ b/composer.json @@ -12,14 +12,18 @@ } ], "require": { - "symfony/yaml": "^4.2", + "symfony/yaml": "~4.2.0", "mustangostang/spyc": "^0.6.2", "chuyskywalker/rolling-curl": "^3.1", - "symfony/dom-crawler": "^4.2", - "symfony/css-selector": "^4.2", + "symfony/dom-crawler": "~4.2.0", + "symfony/css-selector": "~4.2.0", "masterminds/html5": "^2.5", - "symfony/console": "^4.2", - "ramsey/uuid": "^3.8" + "symfony/console": "~4.2.0", + "ramsey/uuid": "^3.8", + "spatie/crawler": "^4.4", + "consolidation/comments": "^1.0", + "spatie/browsershot": "^3.32", + "php-curl-class/php-curl-class": "^8.6" }, "require-dev": { "phpunit/phpunit": "^7.5", diff --git a/composer.lock b/composer.lock index 8f105f9c..1a81d99c 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": "d190af94d8d09b4b57b1dc5bba2aafc8", + "content-hash": "b42ac2884a56b368e0d0dd162c50f4ba", "packages": [ { "name": "chuyskywalker/rolling-curl", @@ -67,39 +67,38 @@ "time": "2014-08-30T03:39:25+00:00" }, { - "name": "masterminds/html5", - "version": "2.5.0", + "name": "consolidation/comments", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "b5d892a4bd058d61f736935d32a9c248f11ccc93" + "url": "https://github.com/consolidation/comments.git", + "reference": "908832ce3c8174a9414d741913543fd058aac5fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/b5d892a4bd058d61f736935d32a9c248f11ccc93", - "reference": "b5d892a4bd058d61f736935d32a9c248f11ccc93", + "url": "https://api.github.com/repos/consolidation/comments/zipball/908832ce3c8174a9414d741913543fd058aac5fb", + "reference": "908832ce3c8174a9414d741913543fd058aac5fb", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-dom": "*", - "ext-libxml": "*", - "php": ">=5.3.0" + "php": ">=5.5.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35", - "sami/sami": "~2.0", - "satooshi/php-coveralls": "1.0.*" + "phpunit/php-code-coverage": "~2|~4", + "phpunit/phpunit": "^4.8", + "satooshi/php-coveralls": "^1.0", + "squizlabs/php_codesniffer": "^2.8", + "symfony/yaml": "^3.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Masterminds\\": "src" + "Consolidation\\Comments\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -108,60 +107,110 @@ ], "authors": [ { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - }, + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "A tool for preserving comments, e.g. when parsing YAML files.", + "time": "2019-07-30T05:52:24+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "Matt Farina", - "email": "matt@mattfarina.com" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" } ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" ], - "time": "2018-12-27T22:03:43+00:00" + "time": "2018-04-22T15:46:56+00:00" }, { - "name": "mustangostang/spyc", - "version": "0.6.2", + "name": "guzzlehttp/promises", + "version": "v1.3.1", "source": { "type": "git", - "url": "https://github.com/mustangostang/spyc.git", - "reference": "23c35ae854d835f2d7bcc3e3ad743d7e57a8c14d" + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mustangostang/spyc/zipball/23c35ae854d835f2d7bcc3e3ad743d7e57a8c14d", - "reference": "23c35ae854d835f2d7bcc3e3ad743d7e57a8c14d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", "shasum": "" }, "require": { - "php": ">=5.3.1" + "php": ">=5.5.0" }, "require-dev": { - "phpunit/phpunit": "4.3.*@dev" + "phpunit/phpunit": "^4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.5.x-dev" + "dev-master": "1.4-dev" } }, "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, "files": [ - "Spyc.php" + "src/functions_include.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -170,116 +219,1171 @@ ], "authors": [ { - "name": "mustangostang", - "email": "vlad.andersen@gmail.com" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" } ], - "description": "A simple YAML loader/dumper class for PHP", - "homepage": "https://github.com/mustangostang/spyc/", + "description": "Guzzle promises library", "keywords": [ - "spyc", - "yaml", - "yml" + "promise" ], - "time": "2017-02-24T16:06:33+00:00" + "time": "2016-12-20T10:07:11+00:00" }, { - "name": "paragonie/random_compat", - "version": "v9.99.99", + "name": "guzzlehttp/psr7", + "version": "1.6.1", "source": { "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", "shasum": "" }, "require": { - "php": "^7" + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" }, "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" } ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "intervention/image", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "39eaef720d082ecc54c64bf54541c55f10db546d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/39eaef720d082ecc54c64bf54541c55f10db546d", + "reference": "39eaef720d082ecc54c64bf54541c55f10db546d", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + }, + "laravel": { + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ], + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + } + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "time": "2018-07-02T15:55:56+00:00" + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@olivervogel.com", + "homepage": "http://olivervogel.com/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "time": "2019-06-24T14:06:31+00:00" }, { - "name": "ramsey/uuid", - "version": "3.8.0", + "name": "league/flysystem", + "version": "1.0.53", "source": { "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3" + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "08e12b7628f035600634a5e76d95b5eb66cea674" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3", - "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/08e12b7628f035600634a5e76d95b5eb66cea674", + "reference": "08e12b7628f035600634a5e76d95b5eb66cea674", "shasum": "" }, "require": { - "paragonie/random_compat": "^1.0|^2.0|9.99.99", - "php": "^5.4 || ^7.0", - "symfony/polyfill-ctype": "^1.8" + "ext-fileinfo": "*", + "php": ">=5.5.9" }, - "replace": { - "rhumsaa/uuid": "self.version" + "conflict": { + "league/flysystem-sftp": "<1.0.6" }, "require-dev": { - "codeception/aspect-mock": "^1.0 | ~2.0.0", - "doctrine/annotations": "~1.2.0", - "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0", - "ircmaxell/random-lib": "^1.1", - "jakub-onderka/php-parallel-lint": "^0.9.0", - "mockery/mockery": "^0.9.9", - "moontoast/math": "^1.1", - "php-mock/php-mock-phpunit": "^0.3|^1.1", - "phpunit/phpunit": "^4.7|^5.0|^6.5", - "squizlabs/php_codesniffer": "^2.3" + "phpspec/phpspec": "^3.4", + "phpunit/phpunit": "^5.7.10" }, "suggest": { - "ext-ctype": "Provides support for PHP Ctype functions", - "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", - "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", - "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", - "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "time": "2019-06-18T20:09:29+00:00" + }, + { + "name": "league/glide", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/glide.git", + "reference": "a5477e9e822ed57b39861a17092b92553634932d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/glide/zipball/a5477e9e822ed57b39861a17092b92553634932d", + "reference": "a5477e9e822ed57b39861a17092b92553634932d", + "shasum": "" + }, + "require": { + "intervention/image": "^2.4", + "league/flysystem": "^1.0", + "php": "^5.5 | ^7.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpunit/php-token-stream": "^1.4", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Glide\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "http://reinink.ca" + } + ], + "description": "Wonderfully easy on-demand image manipulation library with an HTTP based API.", + "homepage": "http://glide.thephpleague.com", + "keywords": [ + "ImageMagick", + "editing", + "gd", + "image", + "imagick", + "league", + "manipulation", + "processing" + ], + "time": "2019-04-03T23:46:42+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "104443ad663d15981225f99532ba73c2f1d6b6f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/104443ad663d15981225f99532ba73c2f1d6b6f2", + "reference": "104443ad663d15981225f99532ba73c2f1d6b6f2", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-libxml": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35", + "sami/sami": "~2.0", + "satooshi/php-coveralls": "1.0.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "time": "2019-07-25T07:03:26+00:00" + }, + { + "name": "mustangostang/spyc", + "version": "0.6.2", + "source": { + "type": "git", + "url": "https://github.com/mustangostang/spyc.git", + "reference": "23c35ae854d835f2d7bcc3e3ad743d7e57a8c14d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mustangostang/spyc/zipball/23c35ae854d835f2d7bcc3e3ad743d7e57a8c14d", + "reference": "23c35ae854d835f2d7bcc3e3ad743d7e57a8c14d", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.5.x-dev" + } + }, + "autoload": { + "files": [ + "Spyc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "mustangostang", + "email": "vlad.andersen@gmail.com" + } + ], + "description": "A simple YAML loader/dumper class for PHP", + "homepage": "https://github.com/mustangostang/spyc/", + "keywords": [ + "spyc", + "yaml", + "yml" + ], + "time": "2017-02-24T16:06:33+00:00" + }, + { + "name": "nicmart/tree", + "version": "v0.2.7", + "source": { + "type": "git", + "url": "https://github.com/nicmart/Tree.git", + "reference": "0616b54bb49938e1a816141d7943db48ebf76938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nicmart/Tree/zipball/0616b54bb49938e1a816141d7943db48ebf76938", + "reference": "0616b54bb49938e1a816141d7943db48ebf76938", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tree\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolò Martini", + "email": "nicmartnic@gmail.com" + } + ], + "description": "A basic but flexible php tree data structure and a fluent tree builder implementation.", + "time": "2015-08-20T20:50:35+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": "php-curl-class/php-curl-class", + "version": "8.6.1", + "source": { + "type": "git", + "url": "https://github.com/php-curl-class/php-curl-class.git", + "reference": "a418962c4385aba6b97d2d57d65a0d405b514cf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-curl-class/php-curl-class/zipball/a418962c4385aba6b97d2d57d65a0d405b514cf7", + "reference": "a418962c4385aba6b97d2d57d65a0d405b514cf7", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.3" + }, + "require-dev": { + "ext-gd": "*", + "phpunit/phpunit": "*", + "squizlabs/php_codesniffer": "*" + }, + "suggest": { + "ext-mbstring": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Curl\\": "src/Curl/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Unlicense" + ], + "authors": [ + { + "name": "Zach Borboa" + } + ], + "description": "PHP Curl Class makes it easy to send HTTP requests and integrate with web APIs.", + "homepage": "https://github.com/php-curl-class/php-curl-class", + "keywords": [ + "API-Client", + "api", + "class", + "client", + "curl", + "framework", + "http", + "http-client", + "http-proxy", + "json", + "php", + "php-curl", + "php-curl-library", + "proxy", + "requests", + "restful", + "web-scraper", + "web-scraping ", + "web-service", + "xml" + ], + "time": "2019-08-05T04:18:26+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "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", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2018-11-20T15:27:04+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/uuid", + "version": "3.8.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3", + "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "^1.0|^2.0|9.99.99", + "php": "^5.4 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^1.0 | ~2.0.0", + "doctrine/annotations": "~1.2.0", + "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0", + "ircmaxell/random-lib": "^1.1", + "jakub-onderka/php-parallel-lint": "^0.9.0", + "mockery/mockery": "^0.9.9", + "moontoast/math": "^1.1", + "php-mock/php-mock-phpunit": "^0.3|^1.1", + "phpunit/phpunit": "^4.7|^5.0|^6.5", + "squizlabs/php_codesniffer": "^2.3" + }, + "suggest": { + "ext-ctype": "Provides support for PHP Ctype functions", + "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", + "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", + "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marijn Huizendveld", + "email": "marijn.huizendveld@gmail.com" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io" + }, + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "time": "2018-07-19T23:38:55+00:00" + }, + { + "name": "spatie/browsershot", + "version": "3.32.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/browsershot.git", + "reference": "6aa8750308a0473d1e3cc079e698b78f9495e6d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/browsershot/zipball/6aa8750308a0473d1e3cc079e698b78f9495e6d7", + "reference": "6aa8750308a0473d1e3cc079e698b78f9495e6d7", + "shasum": "" + }, + "require": { + "php": "^7.1", + "spatie/image": "^1.5.3", + "spatie/temporary-directory": "^1.1", + "symfony/process": "^4.2" + }, + "require-dev": { + "phpunit/phpunit": "^6.1|^7.5", + "spatie/phpunit-snapshot-assertions": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Browsershot\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "role": "Developer", + "email": "freek@spatie.be", + "homepage": "https://github.com/freekmurze" + } + ], + "description": "Convert a webpage to an image or pdf using headless Chrome", + "homepage": "https://github.com/spatie/browsershot", + "keywords": [ + "chrome", + "convert", + "headless", + "image", + "pdf", + "puppeteer", + "screenshot", + "webpage" + ], + "time": "2019-08-16T08:36:39+00:00" + }, + { + "name": "spatie/crawler", + "version": "4.6.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/crawler.git", + "reference": "27100cc01200755b056525c1b6aa29b2e2eff6c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/crawler/zipball/27100cc01200755b056525c1b6aa29b2e2eff6c4", + "reference": "27100cc01200755b056525c1b6aa29b2e2eff6c4", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.3", + "guzzlehttp/psr7": "^1.4", + "nicmart/tree": "^0.2.7", + "php": "^7.1", + "spatie/browsershot": "^3.14", + "spatie/robots-txt": "^1.0.1", + "symfony/dom-crawler": "^4.0", + "tightenco/collect": "^5.6" + }, + "require-dev": { + "larapack/dd": "^1.1", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Crawler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be" + } + ], + "description": "Crawl all internal links found on a website", + "homepage": "https://github.com/spatie/crawler", + "keywords": [ + "crawler", + "link", + "spatie", + "website" + ], + "time": "2019-08-08T06:51:22+00:00" + }, + { + "name": "spatie/image", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/image.git", + "reference": "8aac77a3ee18d7e0e5cb51cd67eb9558f1f491ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image/zipball/8aac77a3ee18d7e0e5cb51cd67eb9558f1f491ef", + "reference": "8aac77a3ee18d7e0e5cb51cd67eb9558f1f491ef", + "shasum": "" + }, + "require": { + "ext-exif": "*", + "league/glide": "^1.4", + "php": "^7.0", + "spatie/image-optimizer": "^1.0", + "spatie/temporary-directory": "^1.0.0", + "symfony/process": "^3.0|^4.0" + }, + "require-dev": { + "larapack/dd": "^1.1", + "phpunit/phpunit": "^6.0|^7.0", + "symfony/var-dumper": "^3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Image\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "role": "Developer", + "email": "freek@spatie.be", + "homepage": "https://spatie.be" + } + ], + "description": "Manipulate images with an expressive API", + "homepage": "https://github.com/spatie/image", + "keywords": [ + "image", + "spatie" + ], + "time": "2019-08-02T23:57:44+00:00" + }, + { + "name": "spatie/image-optimizer", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/image-optimizer.git", + "reference": "e62f8b459bee0a880c8976c316e82638a74510b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/e62f8b459bee0a880c8976c316e82638a74510b5", + "reference": "e62f8b459bee0a880c8976c316e82638a74510b5", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2", + "psr/log": "^1.0", + "symfony/process": "^4.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.0", + "symfony/var-dumper": "^4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ImageOptimizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily optimize images using PHP", + "homepage": "https://github.com/spatie/image-optimizer", + "keywords": [ + "image-optimizer", + "spatie" + ], + "time": "2019-02-15T12:11:38+00:00" + }, + { + "name": "spatie/robots-txt", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/robots-txt.git", + "reference": "dbd8d2048114f81813a57d21da594dbde77fdac7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/robots-txt/zipball/dbd8d2048114f81813a57d21da594dbde77fdac7", + "reference": "dbd8d2048114f81813a57d21da594dbde77fdac7", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "larapack/dd": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Robots\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brent Roose", + "role": "Developer", + "email": "brent@spatie.be", + "homepage": "https://spatie.be" + } + ], + "description": "Determine if a page may be crawled from robots.txt and robots meta tags", + "homepage": "https://github.com/spatie/robots-txt", + "keywords": [ + "robots-txt", + "spatie" + ], + "time": "2019-08-07T22:29:10+00:00" + }, + { + "name": "spatie/temporary-directory", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "8a23b99619babb782d6e99796efb4f3d4949a0d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/8a23b99619babb782d6e99796efb4f3d4949a0d8", + "reference": "8a23b99619babb782d6e99796efb4f3d4949a0d8", + "shasum": "" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } + "require": { + "php": "^7.2" }, + "require-dev": { + "phpunit/phpunit": "^8.0" + }, + "type": "library", "autoload": { "psr-4": { - "Ramsey\\Uuid\\": "src/" + "Spatie\\TemporaryDirectory\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -288,40 +1392,32 @@ ], "authors": [ { - "name": "Marijn Huizendveld", - "email": "marijn.huizendveld@gmail.com" - }, - { - "name": "Thibaud Fabre", - "email": "thibaud@aztech.io" - }, - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" + "name": "Alex Vanderbist", + "role": "Developer", + "email": "alex@spatie.be", + "homepage": "https://spatie.be" } ], - "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", - "homepage": "https://github.com/ramsey/uuid", + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", "keywords": [ - "guid", - "identifier", - "uuid" + "spatie", + "temporary-directory" ], - "time": "2018-07-19T23:38:55+00:00" + "time": "2019-07-16T20:42:32+00:00" }, { "name": "symfony/console", - "version": "v4.2.4", + "version": "v4.2.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "9dc2299a016497f9ee620be94524e6c0af0280a9" + "reference": "fc2e274aade6567a750551942094b2145ade9b6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/9dc2299a016497f9ee620be94524e6c0af0280a9", - "reference": "9dc2299a016497f9ee620be94524e6c0af0280a9", + "url": "https://api.github.com/repos/symfony/console/zipball/fc2e274aade6567a750551942094b2145ade9b6c", + "reference": "fc2e274aade6567a750551942094b2145ade9b6c", "shasum": "" }, "require": { @@ -380,40 +1476,49 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-02-23T15:17:42+00:00" + "time": "2019-07-24T17:13:20+00:00" }, { "name": "symfony/contracts", - "version": "v1.0.2", + "version": "v1.1.5", "source": { "type": "git", "url": "https://github.com/symfony/contracts.git", - "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" + "reference": "3f3f796d5f24a098a9da62828b8daa1b11494c1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", - "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "url": "https://api.github.com/repos/symfony/contracts/zipball/3f3f796d5f24a098a9da62828b8daa1b11494c1b", + "reference": "3f3f796d5f24a098a9da62828b8daa1b11494c1b", "shasum": "" }, "require": { - "php": "^7.1.3" - }, - "require-dev": { + "php": "^7.1.3", "psr/cache": "^1.0", "psr/container": "^1.0" }, + "replace": { + "symfony/cache-contracts": "self.version", + "symfony/event-dispatcher-contracts": "self.version", + "symfony/http-client-contracts": "self.version", + "symfony/service-contracts": "self.version", + "symfony/translation-contracts": "self.version" + }, + "require-dev": { + "symfony/polyfill-intl-idn": "^1.10" + }, "suggest": { - "psr/cache": "When using the Cache contracts", - "psr/container": "When using the Service contracts", - "symfony/cache-contracts-implementation": "", - "symfony/service-contracts-implementation": "", - "symfony/translation-contracts-implementation": "" + "psr/event-dispatcher": "When using the EventDispatcher contracts", + "symfony/cache-implementation": "", + "symfony/event-dispatcher-implementation": "", + "symfony/http-client-implementation": "", + "symfony/service-implementation": "", + "symfony/translation-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.1-dev" } }, "autoload": { @@ -448,20 +1553,20 @@ "interoperability", "standards" ], - "time": "2018-12-05T08:06:11+00:00" + "time": "2019-06-20T06:46:26+00:00" }, { "name": "symfony/css-selector", - "version": "v4.2.2", + "version": "v4.2.11", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "76dac1dbe2830213e95892c7c2ec1edd74113ea4" + "reference": "48eddf66950fa57996e1be4a55916d65c10c604a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/76dac1dbe2830213e95892c7c2ec1edd74113ea4", - "reference": "76dac1dbe2830213e95892c7c2ec1edd74113ea4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/48eddf66950fa57996e1be4a55916d65c10c604a", + "reference": "48eddf66950fa57996e1be4a55916d65c10c604a", "shasum": "" }, "require": { @@ -486,14 +1591,14 @@ "MIT" ], "authors": [ - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -501,20 +1606,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2019-01-03T09:07:35+00:00" + "time": "2019-01-16T20:31:39+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.2.2", + "version": "v4.2.11", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "8dc06251d5ad98d8494e1f742bec9cfdb9e42044" + "reference": "ba1da8fb10291714b8db153fcf7ac515e1a217bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8dc06251d5ad98d8494e1f742bec9cfdb9e42044", - "reference": "8dc06251d5ad98d8494e1f742bec9cfdb9e42044", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ba1da8fb10291714b8db153fcf7ac515e1a217bb", + "reference": "ba1da8fb10291714b8db153fcf7ac515e1a217bb", "shasum": "" }, "require": { @@ -558,20 +1663,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2019-01-03T09:07:35+00:00" + "time": "2019-06-13T10:57:15+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.10.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + "reference": "550ebaac289296ce228a706d0867afc34687e3f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", + "reference": "550ebaac289296ce228a706d0867afc34687e3f4", "shasum": "" }, "require": { @@ -583,7 +1688,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -599,13 +1704,13 @@ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", @@ -616,20 +1721,20 @@ "polyfill", "portable" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.10.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17", + "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17", "shasum": "" }, "require": { @@ -641,7 +1746,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -675,20 +1780,200 @@ "portable", "shim" ], - "time": "2018-09-21T13:07:52+00:00" + "time": "2019-08-06T08:03:45+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.12.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "04ce3335667451138df4307d6a9b61565560199e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/04ce3335667451138df4307d6a9b61565560199e", + "reference": "04ce3335667451138df4307d6a9b61565560199e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-08-06T08:03:45+00:00" + }, + { + "name": "symfony/process", + "version": "v4.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/856d35814cf287480465bb7a6c413bb7f5f5e69c", + "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "2019-05-30T16:10:05+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "e4110b992d2cbe198d7d3b244d079c1c58761d07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e4110b992d2cbe198d7d3b244d079c1c58761d07", + "reference": "e4110b992d2cbe198d7d3b244d079c1c58761d07", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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 mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2019-07-27T06:42:46+00:00" }, { "name": "symfony/yaml", - "version": "v4.2.2", + "version": "v4.2.11", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6" + "reference": "9468fef6f1c740b96935e9578560a9e9189ca154" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/d0aa6c0ea484087927b49fd513383a7d36190ca6", - "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6", + "url": "https://api.github.com/repos/symfony/yaml/zipball/9468fef6f1c740b96935e9578560a9e9189ca154", + "reference": "9468fef6f1c740b96935e9578560a9e9189ca154", "shasum": "" }, "require": { @@ -734,33 +2019,85 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-01-03T09:07:35+00:00" + "time": "2019-07-24T14:47:26+00:00" + }, + { + "name": "tightenco/collect", + "version": "v5.8.32", + "source": { + "type": "git", + "url": "https://github.com/tightenco/collect.git", + "reference": "957e430c26c51b65c80acc87896023229dc05a21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tightenco/collect/zipball/957e430c26c51b65c80acc87896023229dc05a21", + "reference": "957e430c26c51b65c80acc87896023229dc05a21", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/var-dumper": ">=3.4 <5" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "nesbot/carbon": "^1.26.3", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Collect/Support/helpers.php", + "src/Collect/Support/alias.php" + ], + "psr-4": { + "Tightenco\\Collect\\": "src/Collect" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "Collect - Illuminate Collections as a separate package.", + "keywords": [ + "collection", + "laravel" + ], + "time": "2019-07-30T19:16:47+00:00" } ], "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + "reference": "a2c590166b2133a4633738648b6b064edae0814a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", + "reference": "a2c590166b2133a4633738648b6b064edae0814a", "shasum": "" }, "require": { "php": "^7.1" }, "require-dev": { - "athletic/athletic": "~0.1.8", + "doctrine/coding-standard": "^6.0", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "^6.2.3", - "squizlabs/php_codesniffer": "^3.0.2" + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { @@ -785,25 +2122,25 @@ } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "constructor", "instantiate" ], - "time": "2017-07-22T11:58:36+00:00" + "time": "2019-03-17T17:37:11+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.8.1", + "version": "1.9.3", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", "shasum": "" }, "require": { @@ -838,7 +2175,7 @@ "object", "object graph" ], - "time": "2018-06-11T23:09:50+00:00" + "time": "2019-08-09T12:45:53+00:00" }, { "name": "phar-io/manifest", @@ -998,16 +2335,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", + "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", "shasum": "" }, "require": { @@ -1045,7 +2382,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" + "time": "2019-04-30T17:48:53+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -1096,16 +2433,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/1927e75f4ed19131ec9bcc3b002e07fb1173ee76", + "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76", "shasum": "" }, "require": { @@ -1126,8 +2463,8 @@ } }, "autoload": { - "psr-0": { - "Prophecy\\": "src/" + "psr-4": { + "Prophecy\\": "src/Prophecy" } }, "notification-url": "https://packagist.org/downloads/", @@ -1155,7 +2492,7 @@ "spy", "stub" ], - "time": "2018-08-05T17:53:17+00:00" + "time": "2019-06-13T12:50:23+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1313,16 +2650,16 @@ }, { "name": "phpunit/php-timer", - "version": "2.1.1", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059" + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b389aebe1b8b0578430bda0c7c95a829608e059", - "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", "shasum": "" }, "require": { @@ -1349,8 +2686,8 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "role": "lead", + "email": "sebastian@phpunit.de" } ], "description": "Utility class for timing", @@ -1358,20 +2695,20 @@ "keywords": [ "timer" ], - "time": "2019-02-20T10:12:59+00:00" + "time": "2019-06-07T04:22:29+00:00" }, { "name": "phpunit/php-token-stream", - "version": "3.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18" + "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c99e3be9d3e85f60646f152f9002d46ed7770d18", - "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e899757bb3df5ff6e95089132f32cd59aac2220a", + "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a", "shasum": "" }, "require": { @@ -1384,7 +2721,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -1407,20 +2744,20 @@ "keywords": [ "tokenizer" ], - "time": "2018-10-30T05:52:18+00:00" + "time": "2019-07-25T05:29:42+00:00" }, { "name": "phpunit/phpunit", - "version": "7.5.9", + "version": "7.5.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "134669cf0eeac3f79bc7f0c793efbc158bffc160" + "reference": "2834789aeb9ac182ad69bfdf9ae91856a59945ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/134669cf0eeac3f79bc7f0c793efbc158bffc160", - "reference": "134669cf0eeac3f79bc7f0c793efbc158bffc160", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2834789aeb9ac182ad69bfdf9ae91856a59945ff", + "reference": "2834789aeb9ac182ad69bfdf9ae91856a59945ff", "shasum": "" }, "require": { @@ -1480,8 +2817,8 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "role": "lead", + "email": "sebastian@phpunit.de" } ], "description": "The PHP Unit Testing framework.", @@ -1491,7 +2828,7 @@ "testing", "xunit" ], - "time": "2019-04-19T15:50:46+00:00" + "time": "2019-07-15T06:24:08+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -1660,16 +2997,16 @@ }, { "name": "sebastian/environment", - "version": "4.1.0", + "version": "4.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656" + "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6fda8ce1974b62b14935adc02a9ed38252eca656", - "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/f2a2c8e1c97c11ace607a7a667d73d47c19fe404", + "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404", "shasum": "" }, "require": { @@ -1684,7 +3021,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1709,20 +3046,20 @@ "environment", "hhvm" ], - "time": "2019-02-01T05:27:49+00:00" + "time": "2019-05-05T09:05:15+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + "reference": "06a9a5947f47b3029d76118eb5c22802e5869687" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/06a9a5947f47b3029d76118eb5c22802e5869687", + "reference": "06a9a5947f47b3029d76118eb5c22802e5869687", "shasum": "" }, "require": { @@ -1749,6 +3086,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -1757,17 +3098,13 @@ "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" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", @@ -1776,7 +3113,7 @@ "export", "exporter" ], - "time": "2017-04-03T13:19:02+00:00" + "time": "2019-08-11T12:43:14+00:00" }, { "name": "sebastian/global-state", @@ -2112,16 +3449,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.1.0", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", "shasum": "" }, "require": { @@ -2143,12 +3480,12 @@ "authors": [ { "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "role": "Developer", + "email": "arne@blankerts.de" } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2017-04-07T12:08:54+00:00" + "time": "2019-06-13T22:48:21+00:00" }, { "name": "webmozart/assert", diff --git a/docs/Crawler.md b/docs/Crawler.md new file mode 100644 index 00000000..fc0fa3b0 --- /dev/null +++ b/docs/Crawler.md @@ -0,0 +1,108 @@ +--- +id: crawler +title: URL Crawler +--- + +# URL Crawler + +Merlin comes with a URL crawler to help generate URL lists prior to a migration. + +## URL Grouping + +Merlin can assist in grouping URLs by specifying grouping options in the crawler config. This is useful to crawl an entire website and generate separate lists of URLs based on a set of criteria (either regex, or selectors in the DOM). + +All groupings should have an `id` key as this will be used to key the result set. + +### Available types + +#### Path + +Group URLs based on their path. This grouping method allows you to specify wildcard path patterns to match certain groups. You can use one or more patterns when defining this rule. The matching method allows wildcard (`*`) in the URL, this can be used to match the whole path or parts in the path. + +``` +type: path +options: + pattern: /single-pattern + # pattern: + # - /multiple-patterns/* + # - /works/*/with/wildcards/*/in/pattern +``` + +#### Element + +Group URLs by the existence of a DOM element. The selector option can be a valid CSS selector or Xpath selector. + +``` +type: element +options: + selector: //*/h1 +``` + +#### Value + +Group URLs by the value of a given element or attribute. If the `attribute` key is not present it will use the text value of DOM node when doing the comparison. Pattern can be a simple string or a valid regular expression. + +``` +type: element +options: + selector: //*/h1 + pattern: /\w+{4}/ + attribute: data-type +``` + +## Configuration example +``` +--- +domain: https://example.com/ + +options: + follow_redirects: true # Allow internal redirects. + ignore_robotstxt: true # Ignore robots.txt rules around crawlability. + maximum_total: 0 # Optionally restrict total number of crawled URLs. + concurrency: 10 # Restrict concurrent crawlers. + rewrite_domain: true # Standardises base domain. + delay: 100 # Pause between requests in ms. + exclude: [] # Regex matches to exclude. + path_only: true # Return only the path from the crawled URL. + group_by: [] # Group options to allow segmenting URLs basede on some business rules. +``` + +Simply provide a configuration input file and output folder for generated assets and run with: +`php migrate crawl -c /path/to/config.yml -o /path/to/output` + +You will see output as follows: + +``` +=================== +Preparing the configuration +--------------------------- + +Setting concurrency to 10 + + [OK] Starting crawl! + +https://example.com/ +https://example.com/sports/cricket +https://example.com/sports/basketball +https://example.com/sports/baseball +https://example.com/products/classic-teamwear +https://example.com/sports/afl +https://example.com/sports +https://example.com/products +... etc + + [ERROR] Error: https://example.com/design -- Found on url: https://example.com/ + + [OK] Done! + [OK] 432 total URLs. + +Generating files +---------------- + +Generating /tmp/crawled-urls.yml Done! +Generating /tmp/crawl-error.yml Done! + + [OK] Done! + +Completed in 29.005132913589 +``` diff --git a/docs/ExampleConfiguration.md b/docs/ExampleConfiguration.md index 6ad1769c..7907af35 100644 --- a/docs/ExampleConfiguration.md +++ b/docs/ExampleConfiguration.md @@ -3,85 +3,57 @@ id: examples title: Examples --- -# Menu +A configuration file should be made up of several key components. +- Base domain (e.g `https://www.example.com`) +- URL list (e.g an array of paths off the parent domain) +- Optional URL configuration +- Entity type (unique name for this content structure) +- Mapping configuration (selectors, data processing) -Menu structures use the `menu_link` type. This sample configuration demonstrates how to pull the main menu from the Health.vic site, with parent/child relationships in-tact. +See the example files in the [examples](https://github.com/salsadigitalauorg/merlin-framework/tree/develop/examples) folder for complete examples. -The selector uses an Xpath to reference the element in the DOM, in this case all list-items contained in the header nav are evaluated for top level links. The `text` and `link` options are sub-selectors to help define where link text and link values should come from. - -The `children` section allows for sub-menu items to be defined via their own `selector` and configuration. - -``` ---- -domain: https://www2.health.vic.gov.au - -urls: - - / - -entity_type: menus - -mappings: - - - field: main_menu - name: health_main_menu - type: menu_link - selector: '//*[@class="header-nav"]/*/ul/li' - options: - text: './a' - link: './a/@href' - remove_duplicates: true - children: - - - type: menu_link - selector: './descendant::li[@class="dd-level2"]' - options: - text: './a/h3' - link: './a/@href' -``` +## Basic text -# URL aliases +Basic text fields can be mapped in the `mappings` section using the `text` type. -The URL alias of each content should be preserved so URLs can remain in-tact when migrated into the destination CMS. Simply attach the `alias` type to the mappings configuration to ensure URL aliases are captured. +For example this may commonly be used for page content (selector `h1` with id `title`): ``` mappings: - - field: alias - type: alias + field: title + selector: "h1#title" + type: text ``` - - -# Basic text - -Basic text fields can be mapped in the `mappings` section using the `text` type. Example configuration below: +You can also use xpath selectors: ``` mappings: - field: title - selector: "#phbody_1_ctl01_h1Title" + selector: "//h1[@id='title']" type: text ``` -This type was used for the 'key messages' content. It supports both individual items, or arrays of items, e.g in the case of key messages there are multiple matches on the selector, so an array of plain-text results will exist in the JSON object for import. - +Another example could be pulling content items from an unordered list and passing them through some data processors: ``` mappings: - field: field_key_messages - selector: .m-key-messages .m-b li + selector: ul.key-messages li type: text processors: - convert_encoding: - to_encoding: "HTML-ENTITIES" + - processor: remove_empty_tags + - + processor: convert_encoding + to_encoding: HTML-ENTITIES from_encoding: UTF-8 - html_entity_decode: { } - whitespace: { } + - processor: html_entity_decode + - processor: whitespace ``` -This also includes additional processors, more detail on these can be found on the [Processors]() page. -# Long, formatted text +## Long, formatted text Long text is used for body content, or anywhere a rich-text WYSIWYG editor may be used. It also allows for embedded media (e.g documents, images). @@ -110,3 +82,69 @@ mappings: - style - processor: whitespace ``` + + +## Example menu + +Menu structures use the `menu_link` type. This sample configuration demonstrates how to pull a main menu with parent/child relationships in-tact. + +The selector uses an Xpath to reference the element in the DOM, in this case all list-items contained in the header nav are evaluated for top level links. The `text` and `link` options are sub-selectors to help define where link text and link values should come from. + +The `children` section allows for sub-menu items to be defined via their own `selector` and configuration. + +``` +--- +domain: https://www.example.com + +urls: + - / + +entity_type: menus + +mappings: + - + field: main_menu + name: main_menu + type: menu_link + selector: '//*[@class="header-nav"]/*/ul/li' + options: + text: './a' + link: './a/@href' + remove_duplicates: true + children: + - + type: menu_link + selector: './descendant::li[@class="dd-level2"]' + options: + text: './a/h3' + link: './a/@href' +``` + + +## URL aliases + +The URL alias of each content should be preserved so URLs can remain in-tact when migrated into the destination CMS. Simply attach the `alias` type to the mappings configuration to ensure URL aliases are captured. + +``` +mappings: + - + field: alias + type: alias +``` + + +# Mandatory element + +Some elements may be considered mandatory for a row to be considered valid. For example; if a page does not contain a 'Title' then it may fail a mandatory requirement and be skipped. + +This is controlled via the `mandatory` option against a field. For example: + +``` +mappings: + - + field: title + selector: '#content-main h1' + type: text + options: + mandatory: true +``` diff --git a/docs/GettingStarted.md b/docs/GettingStarted.md index b394dc38..8232f886 100644 --- a/docs/GettingStarted.md +++ b/docs/GettingStarted.md @@ -4,13 +4,12 @@ title: Getting Started weight: -1 --- -The migration tool provides a standard mechanism for scraping content from DHHS websites, split into logical content structures, and perform additional processing to ensure a result ready for import into Drupal. +Merlin Framework provides a standardised method for migrating content from a website (markup) to more structured data. -- Initial code is available on https://github.com/salsadigitalauorg/merlin-framework -- As this codebase is likely to be open-sourced and see ongoing development effort the branch `` is the safest to use with DHHS migration configurations +This allows for simplified migration of web content to a new CMS or other systems. -# Core concepts +## Core concepts The migration framework expects to take a YAML (.yml) file containing all the configuration required for a migration run. A separate migration configuration exists for each logical content structure split, for example these may be: - Menus @@ -30,9 +29,9 @@ The framework requires PHP (latest recommended, but tested on most versions of 7 # Running a migration To run a migration simply run the tool with the input configuration .yml file, and a path to the output, e.g: -`php migrate generate -c configs/bhc/fact_sheet.yml -o /path/to/output/` +`php migrate generate -c /path/to/config.yml -o /path/to/output` -You will see output as following: +You will see output as follows: ``` Migration framework =================== @@ -45,7 +44,7 @@ Preparing the configuration Processing requests ------------------- -Parsing... https://www.betterhealth.vic.gov.au/health/conditionsandtreatments/Treating-persistent-pain (Done!) +Parsing... https://www.example.gov.au/health/conditionsandtreatments/Treating-persistent-pain (Done!) ... etc (x2000 pages) @@ -70,6 +69,10 @@ Completed in 87.295419931412 The resulting JSON files are now ready to push into the Drupal Migration plugins. These files should be hosted somewhere that Drupal can access, e.g a web-accessible URL. -## Error handling +## Error handling and reporting There are JSON files generated with error reporting included. These may include `error-not-found.json`, `error-404.json` and `error-unhandled.json`. These will indicate where selectors cannot find matches on any given page, or where a URL does not resolve (404, 500, or similar). + +Warning files will also be generated containing further useful information about a run. + +Duplicate content will be detected and tracked in `url-content-duplicates.json`. diff --git a/docs/TypeAlias.md b/docs/TypeAlias.md index ff89848a..970e949d 100644 --- a/docs/TypeAlias.md +++ b/docs/TypeAlias.md @@ -16,3 +16,11 @@ Doesn't provide options. field: alias type: alias ``` + +## Output + +``` +{ + : "/alias-of-the-path" +} +``` diff --git a/docs/TypeLink.md b/docs/TypeLink.md index 8e542708..29d25b8e 100644 --- a/docs/TypeLink.md +++ b/docs/TypeLink.md @@ -4,7 +4,9 @@ title: Link sidebar_label: Link --- -Structure link representation. +Structured link representation. + +> Note: Link is a combined output type, as a result processors need to be applied to the output rows. ## Options @@ -32,3 +34,25 @@ options: link: ./a/@href text: ./a ``` + +## Processors + +``` +field: +processors: + text: + - # + link: + - # +``` + +## Output + +``` +{ + : { + "link": "internal:/path-to-resource", + "text: "Link text" + } +} +``` diff --git a/docs/TypeLongText.md b/docs/TypeLongText.md index 6a81a04e..3dcefbd4 100644 --- a/docs/TypeLongText.md +++ b/docs/TypeLongText.md @@ -28,3 +28,7 @@ field: long_text type: long_text selector: //*/div[contains(@class, 'content')] ``` + +## Defaults + +See TypeText diff --git a/docs/TypeMedia.md b/docs/TypeMedia.md index 14cd91d4..ae1da286 100644 --- a/docs/TypeMedia.md +++ b/docs/TypeMedia.md @@ -30,14 +30,6 @@ options: file: img name: data-name alt: alt - processor_file: | - function ($value) { - return "migrated-$value"; - } - process_name: | - function ($value) { - return "migrated-$value"; - } ``` **Xpath** @@ -49,12 +41,20 @@ options: file: ./img/@src name: /img/@data-name alt: ./img/@alt - processor_file: | - function ($value) { - return "migrated-$value"; - } - process_name: | - function ($value) { - return "migrated-$value"; - } ``` + +## Processors + +``` +field: field_featured_image +type: media +processors: + file: + - # + name: + - # + alt: + - # +``` + +## Output diff --git a/docs/TypeText.md b/docs/TypeText.md index f287e921..783734f0 100644 --- a/docs/TypeText.md +++ b/docs/TypeText.md @@ -19,3 +19,45 @@ field: uuid type: uuid selector: span.title ``` + + +## Defaults + +If element not found, you can specify a default value. This can be a string, an array, or the evaluation of a function (at its simplest this could be used to return a primitive type like a bool). + +**String Example** + +``` +field: uuid +type: uuid +selector: span.title +default: 'Default value' +``` + +**Array Example** + +``` +field: uuid +type: uuid +selector: span.title +default: + fields: + field_1: 'field_1_value' + field_2: 'field_2_value' +``` + +**Function Example** + +``` +field: uuid +type: uuid +selector: span.title +default: + function: | + function($crawler) { + $value = $crawler->getUri(); + return $value; + } +``` + + diff --git a/docs/URLOptions.md b/docs/URLOptions.md new file mode 100644 index 00000000..8ef12a6a --- /dev/null +++ b/docs/URLOptions.md @@ -0,0 +1,171 @@ +--- +id: url-options +title: URL Options +--- + +# Fetch options + +URL content is retrieved via a Fetcher. There are a number of options that can apply to how the content is retreived. These options are specified by the `fetch_options` array directive in the configuration: + +| Option | Type | Default | Explanation | +| ------------- | ---- | ------- | ------------- | +| `concurrency` | int | `10` | How many maximum concurrent requests should be used to fetch content. +| `delay` | int | `100` | Delay between requests in milliseconds. +| `cache_enabled` | boolean | `true` | If enabled, URL content is cached on disk for subsequent processing. +| `cache_dir` | string | `/tmp/merlin_cache` | Directory to store the cache. If the path does not exist it will be created. +| `fetcher_class` | string | `...FetcherSpatieCrawler`

*The full class path is / Fetcher / Fetchers / SpatieCrawler / FetcherSpatieCrawler*. | The full name-spaced class name of the Fetcher class to use to retrieve content. In most normal circumstances this can be left alone. +| `execute_js` | boolean | false | Executes javascript on the page after fetching. You need to ensure the necessary node dependencies are met and installed.

**Note: JS is currently only available when using the default FetcherSpatieCrawler**. +| `follow_redirects` | boolean | `true` | If enabled, redirects e.g. `302` will be followed. +| `ignore_ssl_errors` | boolean | `false` | If enabled, will ignore SSL errors. +| `user_agent` | string | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" | Set the User-Agent to identify as in requests. +| `timeouts` | array | `connect_timeout: 15`
`timeout: 15`
`read_timeout: 30`
| Various fetching timeouts. Note that if you use `execute_js` these timeouts will need to be at least doubled to allow time to run the javascript. + +Most of the time the default Fetcher class should cover most usage requirements, however, you can specify a custom class name if you need to do something different. Check `Merlin\Fetcher\Fetchers\*` for examples of how to implement. + +## Example `fetcher_options` configuration + +``` +--- +domain: http://www.example.com + +urls: + - /some/path + - /some/path?with=a&query=123 + - /some/path?with=a&query=123#and-a-fragment + +fetch_options: + # Default 10 + concurrency: 10 + + # Delay between requests, default 100 milliseconds + delay: 100 + + # Cache content (and use previously cached content), default true + cache_enabled: true + + # Cache storage root dir (path created if doesn't exist), default /tmp/merlin_cache + cache_dir: '/tmp/merlin_cache' + + # Fetcher class, default FetcherSpatieCrawler + # fetcher_class: '\Migrate\Fetcher\Fetchers\SpatieCrawler\FetcherSpatieCrawler' + fetcher_class: '\Migrate\Fetcher\Fetchers\Curl\FetcherCurl' + # fetcher_class: '\Migrate\Fetcher\Fetchers\RollingCurl\FetcherRollingCurl' + + # Execute on-load JS, default false. + # Currently only available if using the FetcherSpatieCrawler fetcher class + execute_js: false + + # Whether to follow redirects + follow_redirects: true + + # Ignore SSL errors + ignore_ssl_errors : true + + # Timeouts. When using execute_js, you want to have reasonably long timeouts. + # Not all timeouts are applicable to all Fetchers. + timeouts: + connect_timeout: 15, + timeout: 60, + # FetcherSpatieCrawler only + read_timeout: 30 + +``` + + +# URL Options + +There are a number of options that can apply to the URL list. These options are specified by the `url_options` array directive in the configuration: + + +| Option | Explanation | +| ------------- | ------------- | +| `include_query` | Will include the **query** part of the URL in the request. If set to false, the crawler will only fetch the path component of the URL. | +| `include_fragment` | Will include the **fragment** part of the URL. If set to false, the crawler will only fetch the path component of the URL. | +| `find_content_duplicates ` | Will check for **content** duplicates. This will create a file called `url-content-duplicates.json` that contains a list of URLs that appear to resolve to the same content. This is to avoid content duplication in the target system as well as provide a way to easily generate aliases. | +| `hash_selector` | This is an **XPath** selector that is used to generate the hash of content that is used to detect duplicates. By default `sha1` is used as the hash algorithm and uses the `` tag of the page as the determining content.| +| `hash_exclude_nodes ` | This is an array of **XPath** selectors to *exclude* when generating the hash to detect duplicates. This could include elements that may appear on the page that might be metadata/cache busters or contain timestamps etc that can be safely excluded from building a hash for duplicate detection. By default all ` + + + + + +

No Javascript

+ + + + diff --git a/tests/www/redirect_dst.php b/tests/www/redirect_dst.php new file mode 100644 index 00000000..5055790b --- /dev/null +++ b/tests/www/redirect_dst.php @@ -0,0 +1,11 @@ + + + + Redirect Test + + + +

Redirect Successful

+ + + diff --git a/tests/www/redirect_src.php b/tests/www/redirect_src.php new file mode 100644 index 00000000..6b5ef08d --- /dev/null +++ b/tests/www/redirect_src.php @@ -0,0 +1,5 @@ + + + + URL Fragment Javascript Test + + + + + + + +

No Javascript when finding location.hash!

+ + + + diff --git a/tests/www/url_query.php b/tests/www/url_query.php new file mode 100644 index 00000000..754402bc --- /dev/null +++ b/tests/www/url_query.php @@ -0,0 +1,19 @@ + + + + + + URL Query Test + + + + +

+ + + + diff --git a/tests/www/user_agent.php b/tests/www/user_agent.php new file mode 100644 index 00000000..dac857e9 --- /dev/null +++ b/tests/www/user_agent.php @@ -0,0 +1,19 @@ + + + + + + User Agent Test + + + + +

+ + + +