From 5d1f914b3b1f19648370a00e7172ddc789eb922b Mon Sep 17 00:00:00 2001 From: Joe Crawford Date: Fri, 6 Dec 2024 15:15:28 -0800 Subject: [PATCH 1/6] PHP CodeSniffer addition --- .github/workflows/ci.yml | 17 + composer.json | 8 +- composer.lock | 2043 -------------------------------------- phpcs.xml | 9 + 4 files changed, 33 insertions(+), 2044 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 composer.lock create mode 100644 phpcs.xml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5d3ee6f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,17 @@ +name: CI + +on: [push] + +jobs: + build-test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: php-actions/composer@v5 # or alternative dependency management + - name: run tests + run: composer test + - name: change owner of phpcs + run: sudo chmod 777 ./vendor/bin/phpcs + - name: sniff + run: composer sniff diff --git a/composer.json b/composer.json index 23219d3..7448180 100644 --- a/composer.json +++ b/composer.json @@ -19,9 +19,15 @@ "indieweb/rel-me": "^0.1.1" }, "require-dev": { - "phpunit/phpunit": "*" + "phpunit/phpunit": "*", + "squizlabs/php_codesniffer": "3.*", }, "autoload": { "files": [] + }, + "scripts": { + "test": "phpunit --bootstrap loader.php", + "sniff": "phpcs --standard=phpcs.xml */*.php", + "snifferfix" : "phpcbf --standard=phpcs.xml */*.php" } } diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 562f842..0000000 --- a/composer.lock +++ /dev/null @@ -1,2043 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "6870eba124c2be3bbe8279dfcdc89292", - "packages": [ - { - "name": "barnabywalters/mf-cleaner", - "version": "v0.2.0", - "source": { - "type": "git", - "url": "https://github.com/barnabywalters/php-mf-cleaner.git", - "reference": "bf86945ccb24093294bd266ee9e874917e762680" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barnabywalters/php-mf-cleaner/zipball/bf86945ccb24093294bd266ee9e874917e762680", - "reference": "bf86945ccb24093294bd266ee9e874917e762680", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "~9", - "vimeo/psalm": "~4" - }, - "suggest": { - "mf2/mf2": "To parse microformats2 structures from (X)HTML" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barnaby Walters", - "email": "barnaby@waterpigs.co.uk" - } - ], - "description": "Cleans up microformats2 array structures", - "support": { - "issues": "https://github.com/barnabywalters/php-mf-cleaner/issues", - "source": "https://github.com/barnabywalters/php-mf-cleaner/tree/v0.2.0" - }, - "time": "2022-11-15T20:04:09+00:00" - }, - { - "name": "ezyang/htmlpurifier", - "version": "v4.7.0", - "source": { - "type": "git", - "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "ae1828d955112356f7677c465f94f7deb7d27a40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40", - "reference": "ae1828d955112356f7677c465f94f7deb7d27a40", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, - "files": [ - "library/HTMLPurifier.composer.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL" - ], - "authors": [ - { - "name": "Edward Z. Yang", - "email": "admin@htmlpurifier.org", - "homepage": "http://ezyang.com" - } - ], - "description": "Standards compliant HTML filter written in PHP", - "homepage": "http://htmlpurifier.org/", - "keywords": [ - "html" - ], - "time": "2015-08-05T01:03:42+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "v3.8.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba", - "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": ">=5.3.3", - "symfony/event-dispatcher": ">=2.1" - }, - "replace": { - "guzzle/batch": "self.version", - "guzzle/cache": "self.version", - "guzzle/common": "self.version", - "guzzle/http": "self.version", - "guzzle/inflection": "self.version", - "guzzle/iterator": "self.version", - "guzzle/log": "self.version", - "guzzle/parser": "self.version", - "guzzle/plugin": "self.version", - "guzzle/plugin-async": "self.version", - "guzzle/plugin-backoff": "self.version", - "guzzle/plugin-cache": "self.version", - "guzzle/plugin-cookie": "self.version", - "guzzle/plugin-curlauth": "self.version", - "guzzle/plugin-error-response": "self.version", - "guzzle/plugin-history": "self.version", - "guzzle/plugin-log": "self.version", - "guzzle/plugin-md5": "self.version", - "guzzle/plugin-mock": "self.version", - "guzzle/plugin-oauth": "self.version", - "guzzle/service": "self.version", - "guzzle/stream": "self.version" - }, - "require-dev": { - "doctrine/cache": "*", - "monolog/monolog": "1.*", - "phpunit/phpunit": "3.7.*", - "psr/log": "1.0.*", - "symfony/class-loader": "*", - "zendframework/zend-cache": "<2.3", - "zendframework/zend-log": "<2.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.8-dev" - } - }, - "autoload": { - "psr-0": { - "Guzzle": "src/", - "Guzzle\\Tests": "tests/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Guzzle Community", - "homepage": "https://github.com/guzzle/guzzle/contributors" - } - ], - "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2014-01-28T22:29:15+00:00" - }, - { - "name": "indieweb/mention-client", - "version": "1.1.8", - "source": { - "type": "git", - "url": "https://github.com/indieweb/mention-client-php.git", - "reference": "20852ee619e43ef0f0c0be49877c6251f3a2b402" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/indieweb/mention-client-php/zipball/20852ee619e43ef0f0c0be49877c6251f3a2b402", - "reference": "20852ee619e43ef0f0c0be49877c6251f3a2b402", - "shasum": "" - }, - "require": { - "mf2/mf2": ">=0.2", - "php": ">=5.4" - }, - "require-dev": { - "phpunit/phpunit": ">=4.8.13" - }, - "type": "library", - "autoload": { - "psr-0": { - "IndieWeb": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Aaron Parecki", - "email": "aaron@parecki.com", - "homepage": "http://aaronparecki.com/" - } - ], - "description": "Client library for sending webmention and pingback notifications", - "homepage": "https://github.com/indieweb/mention-client-php", - "time": "2018-04-16T13:26:38+00:00" - }, - { - "name": "indieweb/rel-me", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/indieweb/rel-me.git", - "reference": "705b15f6e91f314fd26d5962dcf00fc117e42965" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/indieweb/rel-me/zipball/705b15f6e91f314fd26d5962dcf00fc117e42965", - "reference": "705b15f6e91f314fd26d5962dcf00fc117e42965", - "shasum": "" - }, - "require": { - "mf2/mf2": "^0.5", - "php": ">=5.6" - }, - "require-dev": { - "barnabywalters/mf-cleaner": "dev-master", - "yoast/phpunit-polyfills": "^1.0" - }, - "type": "library", - "autoload": { - "files": [ - "RelMe.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Functions for discovering, consuming and verifying rel-me microformat", - "support": { - "issues": "https://github.com/indieweb/rel-me/issues", - "source": "https://github.com/indieweb/rel-me/tree/v0.1.1" - }, - "time": "2022-10-08T21:02:51+00:00" - }, - { - "name": "ircmaxell/password-compat", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/ircmaxell/password_compat.git", - "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c", - "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": "4.*" - }, - "type": "library", - "autoload": { - "files": [ - "lib/password.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthony Ferrara", - "email": "ircmaxell@php.net", - "homepage": "http://blog.ircmaxell.com" - } - ], - "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", - "homepage": "https://github.com/ircmaxell/password_compat", - "keywords": [ - "hashing", - "password" - ], - "time": "2014-11-20T16:49:30+00:00" - }, - { - "name": "mf2/mf2", - "version": "v0.5.0", - "source": { - "type": "git", - "url": "https://github.com/microformats/php-mf2.git", - "reference": "ddc56de6be62ed4a21f569de9b80e17af678ca50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/microformats/php-mf2/zipball/ddc56de6be62ed4a21f569de9b80e17af678ca50", - "reference": "ddc56de6be62ed4a21f569de9b80e17af678ca50", - "shasum": "" - }, - "require": { - "php": ">=5.6.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7", - "mf2/tests": "dev-master#e9e2b905821ba0a5b59dab1a8eaf40634ce9cd49", - "phpcompatibility/php-compatibility": "^9.3", - "phpunit/phpunit": "^5.7", - "squizlabs/php_codesniffer": "^3.6.2" - }, - "suggest": { - "barnabywalters/mf-cleaner": "To more easily handle the canonical data php-mf2 gives you", - "masterminds/html5": "Alternative HTML parser for PHP, for better HTML5 support." - }, - "bin": [ - "bin/fetch-mf2", - "bin/parse-mf2" - ], - "type": "library", - "autoload": { - "files": [ - "Mf2/Parser.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "CC0-1.0" - ], - "authors": [ - { - "name": "Barnaby Walters", - "homepage": "http://waterpigs.co.uk" - } - ], - "description": "A pure, generic microformats2 parser — makes HTML as easy to consume as a JSON API", - "keywords": [ - "html", - "microformats", - "microformats 2", - "parser", - "semantic" - ], - "support": { - "issues": "https://github.com/microformats/php-mf2/issues", - "source": "https://github.com/microformats/php-mf2/tree/v0.5.0" - }, - "time": "2022-02-10T01:05:27+00:00" - }, - { - "name": "pimple/pimple", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d", - "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "Pimple": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", - "homepage": "http://pimple.sensiolabs.org", - "keywords": [ - "container", - "dependency injection" - ], - "time": "2013-11-22T08:30:29+00:00" - }, - { - "name": "psr/log", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "5277094ed527a1c4477177d102fe4c53551953e0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/5277094ed527a1c4477177d102fe4c53551953e0", - "reference": "5277094ed527a1c4477177d102fe4c53551953e0", - "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": "2016-09-19T16:02:08+00:00" - }, - { - "name": "silex/silex", - "version": "v1.3.5", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Silex.git", - "reference": "374c7e04040a6f781c90f7d746726a5daa78e783" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Silex/zipball/374c7e04040a6f781c90f7d746726a5daa78e783", - "reference": "374c7e04040a6f781c90f7d746726a5daa78e783", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "pimple/pimple": "~1.0", - "symfony/event-dispatcher": "~2.3|3.0.*", - "symfony/http-foundation": "~2.3|3.0.*", - "symfony/http-kernel": "~2.3|3.0.*", - "symfony/routing": "~2.3|3.0.*" - }, - "require-dev": { - "doctrine/dbal": "~2.2", - "monolog/monolog": "^1.4.1", - "swiftmailer/swiftmailer": "~5", - "symfony/browser-kit": "~2.3|3.0.*", - "symfony/config": "~2.3|3.0.*", - "symfony/css-selector": "~2.3|3.0.*", - "symfony/debug": "~2.3|3.0.*", - "symfony/dom-crawler": "~2.3|3.0.*", - "symfony/finder": "~2.3|3.0.*", - "symfony/form": "~2.3|3.0.*", - "symfony/locale": "~2.3|3.0.*", - "symfony/monolog-bridge": "~2.3|3.0.*", - "symfony/options-resolver": "~2.3|3.0.*", - "symfony/phpunit-bridge": "~2.7", - "symfony/process": "~2.3|3.0.*", - "symfony/security": "~2.3|3.0.*", - "symfony/serializer": "~2.3|3.0.*", - "symfony/translation": "~2.3|3.0.*", - "symfony/twig-bridge": "~2.3|3.0.*", - "symfony/validator": "~2.3|3.0.*", - "twig/twig": "~1.8|~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Silex\\": "src/Silex" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - } - ], - "description": "The PHP micro-framework based on the Symfony Components", - "homepage": "http://silex.sensiolabs.org", - "keywords": [ - "microframework" - ], - "abandoned": "symfony/flex", - "time": "2016-01-06T14:59:35+00:00" - }, - { - "name": "symfony/debug", - "version": "v2.8.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "8c29235936a47473af16fb91c7c4b7b193c5693c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/8c29235936a47473af16fb91c7c4b7b193c5693c", - "reference": "8c29235936a47473af16fb91c7c4b7b193c5693c", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/class-loader": "~2.2|~3.0.0", - "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "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 Debug Component", - "homepage": "https://symfony.com", - "time": "2016-09-06T10:55:00+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v2.8.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "889983a79a043dfda68f38c38b6dba092dd49cd8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/889983a79a043dfda68f38c38b6dba092dd49cd8", - "reference": "889983a79a043dfda68f38c38b6dba092dd49cd8", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5|~3.0.0", - "symfony/dependency-injection": "~2.6|~3.0.0", - "symfony/expression-language": "~2.6|~3.0.0", - "symfony/stopwatch": "~2.3|~3.0.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "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 EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2016-07-28T16:56:28+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v2.8.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "1d4ab8de2215e44e57fddc1e6b5d122546769e7d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1d4ab8de2215e44e57fddc1e6b5d122546769e7d", - "reference": "1d4ab8de2215e44e57fddc1e6b5d122546769e7d", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php54": "~1.0", - "symfony/polyfill-php55": "~1.0" - }, - "require-dev": { - "symfony/expression-language": "~2.4|~3.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "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 HttpFoundation Component", - "homepage": "https://symfony.com", - "time": "2016-09-06T10:55:00+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v2.8.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "a47004349e9216ab98a8019616a66e2d5c32b0ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a47004349e9216ab98a8019616a66e2d5c32b0ca", - "reference": "a47004349e9216ab98a8019616a66e2d5c32b0ca", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "psr/log": "~1.0", - "symfony/debug": "~2.6,>=2.6.2", - "symfony/event-dispatcher": "~2.6,>=2.6.7|~3.0.0", - "symfony/http-foundation": "~2.7.15|~2.8.8|~3.0.8" - }, - "conflict": { - "symfony/config": "<2.7" - }, - "require-dev": { - "symfony/browser-kit": "~2.3|~3.0.0", - "symfony/class-loader": "~2.1|~3.0.0", - "symfony/config": "~2.8", - "symfony/console": "~2.3|~3.0.0", - "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0", - "symfony/dependency-injection": "~2.8|~3.0.0", - "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0", - "symfony/expression-language": "~2.4|~3.0.0", - "symfony/finder": "~2.0,>=2.0.5|~3.0.0", - "symfony/process": "~2.0,>=2.0.5|~3.0.0", - "symfony/routing": "~2.8|~3.0.0", - "symfony/stopwatch": "~2.3|~3.0.0", - "symfony/templating": "~2.2|~3.0.0", - "symfony/translation": "~2.0,>=2.0.5|~3.0.0", - "symfony/var-dumper": "~2.6|~3.0.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/class-loader": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "", - "symfony/var-dumper": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "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 HttpKernel Component", - "homepage": "https://symfony.com", - "time": "2016-09-07T02:02:58+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "dff51f72b0706335131b00a7f49606168c582594" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594", - "reference": "dff51f72b0706335131b00a7f49606168c582594", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "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 for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2016-05-18T14:26:46+00:00" - }, - { - "name": "symfony/polyfill-php54", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php54.git", - "reference": "34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1", - "reference": "34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php54\\": "" - }, - "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 5.4+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2016-05-18T14:26:46+00:00" - }, - { - "name": "symfony/polyfill-php55", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php55.git", - "reference": "bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d", - "reference": "bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d", - "shasum": "" - }, - "require": { - "ircmaxell/password-compat": "~1.0", - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php55\\": "" - }, - "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 5.5+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2016-05-18T14:26:46+00:00" - }, - { - "name": "symfony/routing", - "version": "v2.8.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "6cee3ed22c778a7410119a3d51a20f60252a156c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/6cee3ed22c778a7410119a3d51a20f60252a156c", - "reference": "6cee3ed22c778a7410119a3d51a20f60252a156c", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "conflict": { - "symfony/config": "<2.7" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/common": "~2.2", - "psr/log": "~1.0", - "symfony/config": "~2.7|~3.0.0", - "symfony/expression-language": "~2.4|~3.0.0", - "symfony/http-foundation": "~2.3|~3.0.0", - "symfony/yaml": "~2.0,>=2.0.5|~3.0.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/dependency-injection": "For loading routes from a service", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "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 Routing Component", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "time": "2016-08-16T14:56:08+00:00" - }, - { - "name": "tantek/cassis", - "version": "v0.2.16895", - "source": { - "type": "git", - "url": "https://github.com/tantek/cassis.git", - "reference": "357e30ad12017b4d67cac5f4400e8f371cd2f504" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tantek/cassis/zipball/357e30ad12017b4d67cac5f4400e8f371cd2f504", - "reference": "357e30ad12017b4d67cac5f4400e8f371cd2f504", - "shasum": "" - }, - "type": "library", - "autoload": { - "files": [ - "cassis.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "time": "2016-04-04T15:31:04+00:00" - } - ], - "packages-dev": [ - { - "name": "doctrine/instantiator", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2015-06-14T21:17:01+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2015-02-03T12:10:50+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "58a8137754bc24b25740d4281399a4a3596058e0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", - "reference": "58a8137754bc24b25740d4281399a4a3596058e0", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", - "sebastian/comparator": "^1.1", - "sebastian/recursion-context": "^1.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2016-06-07T08:13:47+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "2.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" - }, - "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2015-10-06T15:47:00+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2015-06-21T13:08:43+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4|~5" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2016-05-12T18:03:57+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.4.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2015-09-15T10:49:45+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "4.8.27", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c062dddcb68e44b563f66ee319ddae2b5a322a90", - "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.1", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" - }, - "suggest": { - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.8.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2016-07-21T06:48:14+00:00" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2015-10-02T06:51:40+00:00" - }, - { - "name": "sebastian/comparator", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2015-07-26T15:48:44+00:00" - }, - { - "name": "sebastian/diff", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2015-12-08T07:14:41+00:00" - }, - { - "name": "sebastian/environment", - "version": "1.3.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2016-08-18T05:49:44+00:00" - }, - { - "name": "sebastian/exporter", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2016-06-17T09:04:28+00:00" - }, - { - "name": "sebastian/global-state", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2015-10-12T03:26:01+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "913401df809e99e4f47b27cdd781f4a258d58791" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", - "reference": "913401df809e99e4f47b27cdd781f4a258d58791", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-11-11T19:50:13+00:00" - }, - { - "name": "sebastian/version", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21T13:59:46+00:00" - }, - { - "name": "symfony/yaml", - "version": "v2.8.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e7540734bad981fe59f8ef14b6fc194ae9df8d9c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e7540734bad981fe59f8ef14b6fc194ae9df8d9c", - "reference": "e7540734bad981fe59f8ef14b6fc194ae9df8d9c", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "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 Yaml Component", - "homepage": "https://symfony.com", - "time": "2016-09-02T01:57:56+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.3.0" -} diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 0000000..4c4095b --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,9 @@ + + + IndieWebify Me Coding Standard + + vendor/* + + + + From 3d6c132217aba07640dc0a50ce51fd50703da768 Mon Sep 17 00:00:00 2001 From: Joe Crawford Date: Fri, 6 Dec 2024 15:28:34 -0800 Subject: [PATCH 2/6] Get PHPUnit tests working --- .gitignore | 3 +- composer.json | 6 +- composer.lock | 4248 +++++++++++++++++++++++++++++++++++++++++++ tests/RelMeTest.php | 42 +- tests/bootstrap.php | 6 +- 5 files changed, 4276 insertions(+), 29 deletions(-) create mode 100644 composer.lock diff --git a/.gitignore b/.gitignore index e220a7d..487474d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ composer.phar /vendor/ deploy .DS_Store -.idea/ \ No newline at end of file +.idea/ +.phpunit.result.cache diff --git a/composer.json b/composer.json index 7448180..ba3db2c 100644 --- a/composer.json +++ b/composer.json @@ -19,14 +19,14 @@ "indieweb/rel-me": "^0.1.1" }, "require-dev": { - "phpunit/phpunit": "*", - "squizlabs/php_codesniffer": "3.*", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "3.*" }, "autoload": { "files": [] }, "scripts": { - "test": "phpunit --bootstrap loader.php", + "test": "phpunit --bootstrap tests/bootstrap.php", "sniff": "phpcs --standard=phpcs.xml */*.php", "snifferfix" : "phpcbf --standard=phpcs.xml */*.php" } diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..8bdddeb --- /dev/null +++ b/composer.lock @@ -0,0 +1,4248 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "f7a5e5342bf5c5ca451ad42a5389ba0a", + "packages": [ + { + "name": "barnabywalters/mf-cleaner", + "version": "v0.2.0", + "source": { + "type": "git", + "url": "https://github.com/barnabywalters/php-mf-cleaner.git", + "reference": "bf86945ccb24093294bd266ee9e874917e762680" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barnabywalters/php-mf-cleaner/zipball/bf86945ccb24093294bd266ee9e874917e762680", + "reference": "bf86945ccb24093294bd266ee9e874917e762680", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "~9", + "vimeo/psalm": "~4" + }, + "suggest": { + "mf2/mf2": "To parse microformats2 structures from (X)HTML" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barnaby Walters", + "email": "barnaby@waterpigs.co.uk" + } + ], + "description": "Cleans up microformats2 array structures", + "support": { + "issues": "https://github.com/barnabywalters/php-mf-cleaner/issues", + "source": "https://github.com/barnabywalters/php-mf-cleaner/tree/v0.2.0" + }, + "time": "2022-11-15T20:04:09+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.7.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "ae1828d955112356f7677c465f94f7deb7d27a40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40", + "reference": "ae1828d955112356f7677c465f94f7deb7d27a40", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.7.0" + }, + "time": "2015-08-05T01:03:42+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-10-17T10:06:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "indieweb/mention-client", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/indieweb/mention-client-php.git", + "reference": "6807f4b1b96df7f47ea425eebfc7c032768652cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/indieweb/mention-client-php/zipball/6807f4b1b96df7f47ea425eebfc7c032768652cf", + "reference": "6807f4b1b96df7f47ea425eebfc7c032768652cf", + "shasum": "" + }, + "require": { + "mf2/mf2": ">=0.2", + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^6" + }, + "type": "library", + "autoload": { + "psr-0": { + "IndieWeb": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Aaron Parecki", + "email": "aaron@parecki.com", + "homepage": "http://aaronparecki.com/" + } + ], + "description": "Client library for sending webmention and pingback notifications", + "homepage": "https://github.com/indieweb/mention-client-php", + "support": { + "issues": "https://github.com/indieweb/mention-client-php/issues", + "source": "https://github.com/indieweb/mention-client-php/tree/1.2.1" + }, + "time": "2021-02-02T13:13:07+00:00" + }, + { + "name": "indieweb/rel-me", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/indieweb/rel-me.git", + "reference": "705b15f6e91f314fd26d5962dcf00fc117e42965" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/indieweb/rel-me/zipball/705b15f6e91f314fd26d5962dcf00fc117e42965", + "reference": "705b15f6e91f314fd26d5962dcf00fc117e42965", + "shasum": "" + }, + "require": { + "mf2/mf2": "^0.5", + "php": ">=5.6" + }, + "require-dev": { + "barnabywalters/mf-cleaner": "dev-master", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "library", + "autoload": { + "files": [ + "RelMe.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Functions for discovering, consuming and verifying rel-me microformat", + "support": { + "issues": "https://github.com/indieweb/rel-me/issues", + "source": "https://github.com/indieweb/rel-me/tree/v0.1.1" + }, + "time": "2022-10-08T21:02:51+00:00" + }, + { + "name": "mf2/mf2", + "version": "v0.5.0", + "source": { + "type": "git", + "url": "https://github.com/microformats/php-mf2.git", + "reference": "ddc56de6be62ed4a21f569de9b80e17af678ca50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/microformats/php-mf2/zipball/ddc56de6be62ed4a21f569de9b80e17af678ca50", + "reference": "ddc56de6be62ed4a21f569de9b80e17af678ca50", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "mf2/tests": "dev-master#e9e2b905821ba0a5b59dab1a8eaf40634ce9cd49", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.6.2" + }, + "suggest": { + "barnabywalters/mf-cleaner": "To more easily handle the canonical data php-mf2 gives you", + "masterminds/html5": "Alternative HTML parser for PHP, for better HTML5 support." + }, + "bin": [ + "bin/fetch-mf2", + "bin/parse-mf2" + ], + "type": "library", + "autoload": { + "files": [ + "Mf2/Parser.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC0-1.0" + ], + "authors": [ + { + "name": "Barnaby Walters", + "homepage": "http://waterpigs.co.uk" + } + ], + "description": "A pure, generic microformats2 parser — makes HTML as easy to consume as a JSON API", + "keywords": [ + "html", + "microformats", + "microformats 2", + "parser", + "semantic" + ], + "support": { + "issues": "https://github.com/microformats/php-mf2/issues", + "source": "https://github.com/microformats/php-mf2/tree/v0.5.0" + }, + "time": "2022-02-10T01:05:27+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://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" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.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": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://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" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+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.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "silex/silex", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Silex.git", + "reference": "6bc31c1b8c4ef614a7115320fd2d3b958032f131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Silex/zipball/6bc31c1b8c4ef614a7115320fd2d3b958032f131", + "reference": "6bc31c1b8c4ef614a7115320fd2d3b958032f131", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "pimple/pimple": "^3.0", + "symfony/event-dispatcher": "^4.0", + "symfony/http-foundation": "^4.0", + "symfony/http-kernel": "^4.0", + "symfony/routing": "^4.0" + }, + "replace": { + "silex/api": "self.version", + "silex/providers": "self.version" + }, + "require-dev": { + "doctrine/dbal": "^2.2", + "monolog/monolog": "^1.4.1", + "swiftmailer/swiftmailer": "^5", + "symfony/asset": "^4.0", + "symfony/browser-kit": "^4.0", + "symfony/config": "^4.0", + "symfony/css-selector": "^4.0", + "symfony/debug": "^4.0", + "symfony/doctrine-bridge": "^4.0", + "symfony/dom-crawler": "^4.0", + "symfony/expression-language": "^4.0", + "symfony/finder": "^4.0", + "symfony/form": "^4.0", + "symfony/intl": "^4.0", + "symfony/monolog-bridge": "^4.0", + "symfony/options-resolver": "^4.0", + "symfony/phpunit-bridge": "^3.2", + "symfony/process": "^4.0", + "symfony/security": "^4.0", + "symfony/serializer": "^4.0", + "symfony/translation": "^4.0", + "symfony/twig-bridge": "^4.0", + "symfony/validator": "^4.0", + "symfony/var-dumper": "^4.0", + "symfony/web-link": "^4.0", + "twig/twig": "^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Silex\\": "src/Silex" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "The PHP micro-framework based on the Symfony Components", + "homepage": "http://silex.sensiolabs.org", + "keywords": [ + "microframework" + ], + "support": { + "issues": "https://github.com/silexphp/Silex/issues", + "source": "https://github.com/silexphp/Silex/tree/v2.3.0" + }, + "abandoned": "symfony/flex", + "time": "2018-04-20T05:17:01+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "1a692492190773c5310bc7877cb590c04c2f05be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be", + "reference": "1a692492190773c5310bc7877cb590c04c2f05be", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "^1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "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": "Provides tools to ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v4.4.44" + }, + "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" + } + ], + "abandoned": "symfony/error-handler", + "time": "2022-07-28T16:29:46+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.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": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + }, + "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": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v4.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "be731658121ef2d8be88f3a1ec938148a9237291" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/be731658121ef2d8be88f3a1ec938148a9237291", + "reference": "be731658121ef2d8be88f3a1ec938148a9237291", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "^1|^2|^3", + "symfony/debug": "^4.4.5", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v4.4.44" + }, + "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": "2022-07-28T16:29:46+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44" + }, + "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": "2022-07-20T09:59:04+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974", + "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0" + }, + "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": "2022-07-20T09:59:04+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "fbfd73095ae958935396cf2243c47b01c677750c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/fbfd73095ae958935396cf2243c47b01c677750c", + "reference": "fbfd73095ae958935396cf2243c47b01c677750c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "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": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.4" + }, + "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": "2024-11-25T09:13:00+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v4.4.49", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "191413c7b832c015bb38eae963f2e57498c3c173" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/191413c7b832c015bb38eae963f2e57498c3c173", + "reference": "191413c7b832c015bb38eae963f2e57498c3c173", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/mime": "^4.3|^5.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/expression-language": "^3.4|^4.0|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v4.4.49" + }, + "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": "2022-11-04T16:17:57+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.4.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ad8ab192cb619ff7285c95d28c69b36d718416c7", + "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "^1|^2", + "symfony/error-handler": "^4.4", + "symfony/event-dispatcher": "^4.4", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^4.4.30|^5.3.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.3", + "symfony/config": "<3.4", + "symfony/console": ">=5", + "symfony/dependency-injection": "<4.3", + "symfony/translation": "<4.2", + "twig/twig": "<1.43|<2.13,>=2" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^4.3|^5.0", + "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^1.43|^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "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": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v4.4.51" + }, + "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": "2023-11-10T13:31:29+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/8c1b9b3e5b52981551fc6044539af1d974e39064", + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "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": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.45" + }, + "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": "2024-10-23T20:18:32+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + }, + "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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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 the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "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.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + }, + "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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/routing", + "version": "v4.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/f7751fd8b60a07f3f349947a309b5bdfce22d6ae", + "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "psr/log": "^1|^2|^3", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v4.4.44" + }, + "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": "2022-07-20T09:59:04+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/42f18f170aa86d612c3559cfb3bd11a375df32c8", + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.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", + "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": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.48" + }, + "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": "2024-11-08T15:21:10+00:00" + }, + { + "name": "tantek/cassis", + "version": "v0.3.19425", + "source": { + "type": "git", + "url": "https://github.com/tantek/cassis.git", + "reference": "7aaddd1883f4ac0f9447298d2f121ff72af46316" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tantek/cassis/zipball/7aaddd1883f4ac0f9447298d2f121ff72af46316", + "reference": "7aaddd1883f4ac0f9447298d2f121ff72af46316", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "cassis.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC-BY-SA-4.0" + ], + "support": { + "issues": "https://github.com/tantek/cassis/issues", + "source": "https://github.com/tantek/cassis/tree/v0.3.19425" + }, + "time": "2023-03-10T00:36:40+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-11-08T17:47:46+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.3.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + }, + "time": "2024-10-08T18:51:32+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.22", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-12-05T13:48:26+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.11.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "19473c30efe4f7b3cd42522d0b2e6e7f243c6f87" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/19473c30efe4f7b3cd42522d0b2e6e7f243c6f87", + "reference": "19473c30efe4f7b3cd42522d0b2e6e7f243c6f87", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-11-16T12:02:36+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/tests/RelMeTest.php b/tests/RelMeTest.php index 634c1e8..a745c88 100644 --- a/tests/RelMeTest.php +++ b/tests/RelMeTest.php @@ -2,24 +2,24 @@ namespace IndieWeb; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; /** * RelMeTest * * @author barnabywalters */ -class RelMeTest extends PHPUnit_Framework_TestCase { +class RelMeTest extends TestCase { public function testUnparseUrl() { $this->assertEquals('http://example.com/', unparseUrl(parse_url('http://example.com'))); $this->assertEquals('http://example.com/?thing&more', unparseUrl(parse_url('http://example.com?thing&more'))); } - + public function testNormaliseUrl() { $this->assertEquals('http://example.com/', normaliseUrl('http://example.com')); $this->assertEquals('http://example.com/?thing=1', normaliseUrl('http://example.com?thing=1')); } - + public function testHttpParseHeaders() { $test = <<assertEquals($expected, $result); } - + /** @group network */ - /* There is already a test for this in indieweb/rel-me + /* There is already a test for this in indieweb/rel-me public function testFollowOneRedirect() { $this->assertEquals('https://brennannovak.com/', followOneRedirect('http://brennannovak.com')); }*/ - + public function testRelMeDocumentUrlHandlesNoRedirect() { $chain = mockFollowOneRedirect(array(null)); $meUrl = normaliseUrl('http://example.com'); @@ -52,17 +52,17 @@ public function testRelMeDocumentUrlHandlesNoRedirect() { $this->assertEquals($meUrl, $url); $this->assertTrue($isSecure); } - + public function testRelMeDocumentUrlHandlesSingleSecureHttpRedirect() { $finalUrl = normaliseUrl('http://example.org'); $chain = mockFollowOneRedirect(array($finalUrl)); $meUrl = normaliseUrl('http://example.com'); list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); + $this->assertTrue($isSecure); $this->assertContains($finalUrl, $previous); } - + public function testRelMeDocumentUrlHandlesMultipleSecureHttpRedirects() { $finalUrl = normaliseUrl('http://example.org'); $intermediateUrl = normaliseUrl('http://www.example.org'); @@ -73,17 +73,17 @@ public function testRelMeDocumentUrlHandlesMultipleSecureHttpRedirects() { $this->assertTrue($isSecure); $this->assertContains($intermediateUrl, $previous); } - + public function testRelMeDocumentUrlHandlesSingleSecureHttpsRedirect() { $finalUrl = normaliseUrl('https://example.org'); $chain = mockFollowOneRedirect(array($finalUrl)); $meUrl = normaliseUrl('https://example.com'); list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); + $this->assertTrue($isSecure); $this->assertContains($finalUrl, $previous); } - + public function testRelMeDocumentUrlHandlesMultipleSecureHttpsRedirects() { $finalUrl = normaliseUrl('https://example.org'); $intermediateUrl = normaliseUrl('https://www.example.org'); @@ -94,7 +94,7 @@ public function testRelMeDocumentUrlHandlesMultipleSecureHttpsRedirects() { $this->assertTrue($isSecure); $this->assertContains($intermediateUrl, $previous); } - + public function testRelMeDocumentUrlReportsInsecureRedirect() { $finalUrl = normaliseUrl('http://example.org'); $intermediateUrl = normaliseUrl('https://www.example.org'); @@ -104,7 +104,7 @@ public function testRelMeDocumentUrlReportsInsecureRedirect() { $this->assertFalse($isSecure); $this->assertContains($intermediateUrl, $previous); } - + public function testRelMeLinksFindsLinks() { $relMeLinks = relMeLinks(<< @@ -113,9 +113,9 @@ public function testRelMeLinksFindsLinks() { , 'http://example.com'); $this->assertEquals(array('http://example.org', 'http://twitter.com/barnabywalters'), $relMeLinks); } - + // backlinkingRelMeSuccessNoRedirect tests - + public function testBacklinkingRelMeSuccessNoRedirect() { $meUrl = $backlinkingMeUrl = 'http://example.com'; $chain = mockFollowOneRedirect(array($backlinkingMeUrl)); @@ -123,7 +123,7 @@ public function testBacklinkingRelMeSuccessNoRedirect() { $this->assertTrue($matches); $this->assertTrue($secure); } - + public function testBacklinkingRelMeSuccessOneRedirect() { $meUrl = 'http://example.com'; $backlinkingMeUrl = 'http://example.org'; @@ -132,7 +132,7 @@ public function testBacklinkingRelMeSuccessOneRedirect() { $this->assertTrue($matches); $this->assertTrue($secure); } - + public function testBacklinkingRelMeNoMatchInsecureRedirect() { $meUrl = 'http://example.com'; $backlinkingMeUrl = 'http://example.org'; @@ -141,7 +141,7 @@ public function testBacklinkingRelMeNoMatchInsecureRedirect() { $this->assertFalse($matches); $this->assertFalse($secure); } - + public function testBacklinkingRelMeSuccessInsecureRedirect() { $meUrl = 'http://example.org'; $backlinkingMeUrl = 'http://example.com'; @@ -150,7 +150,7 @@ public function testBacklinkingRelMeSuccessInsecureRedirect() { $this->assertTrue($matches); $this->assertFalse($secure); } - + public function testBacklinkingRelMeSecureRedirectNoMatch() { $meUrl = 'http://example.org'; $backlinkingMeUrl = 'http://example.com'; diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 56ed5ce..28151c2 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -4,17 +4,15 @@ const TESTING = true; -ob_start(); require __DIR__ . '/../vendor/autoload.php'; -ob_end_clean(); function mockFollowOneRedirect(array $responses) { $i = 0; $responses = array_values($responses); - + return function () use (&$i, $responses) { $out = array_key_exists($i, $responses) ? $responses[$i] : null; $i = $i + 1; return $out; }; -} \ No newline at end of file +} From 38dfa1fa38e6871814c4c6625759341a5fc2273d Mon Sep 17 00:00:00 2001 From: Joe Crawford Date: Fri, 6 Dec 2024 15:59:44 -0800 Subject: [PATCH 3/6] PHP Sniffer Changes --- phpcs.xml | 25 +- phpunit.xml | 2 +- templates/footer.html.php | 5 +- templates/header.html.php | 2 +- templates/index.html.php | 104 ++-- templates/send-webmentions.html.php | 107 ++-- templates/silo-hint.html.php | 50 +- templates/validate-h-card.html.php | 360 ++++++------- templates/validate-h-entry.html.php | 431 +++++++-------- templates/validate-rel-me.html.php | 105 ++-- tests/RelMeTest.php | 371 ++++++++----- tests/bootstrap.php | 29 +- tests/html-test-runner.php | 86 +-- web/index.php | 810 ++++++++++++++++------------ 14 files changed, 1368 insertions(+), 1119 deletions(-) diff --git a/phpcs.xml b/phpcs.xml index 4c4095b..d780283 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -3,7 +3,28 @@ IndieWebify Me Coding Standard vendor/* - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/phpunit.xml b/phpunit.xml index 63ca4b9..03675c3 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -4,4 +4,4 @@ tests/ - \ No newline at end of file + diff --git a/templates/footer.html.php b/templates/footer.html.php index 7c1839e..39361d6 100644 --- a/templates/footer.html.php +++ b/templates/footer.html.php @@ -1,5 +1,6 @@ - - + + + diff --git a/templates/header.html.php b/templates/header.html.php index c4b8c0f..db582b8 100644 --- a/templates/header.html.php +++ b/templates/header.html.php @@ -1,4 +1,4 @@ - + diff --git a/templates/index.html.php b/templates/index.html.php index fcc700a..24abb60 100644 --- a/templates/index.html.php +++ b/templates/index.html.php @@ -1,74 +1,74 @@
-
-
-

- IndieWebify.Me - A guide to getting you on the IndieWeb -

-
-
+
+
+

+ IndieWebify.Me + A guide to getting you on the IndieWeb +

+
+
-
-

What is the IndieWeb?

+
+

What is the IndieWeb?

-
- We should all own the content we're creating, rather than just posting to third-party content silos.Publish on your own domain, and syndicate out to silos. This is the basis of the "Indie Web" movement. – IndieWeb.org -
-
+
+ We should all own the content we're creating, rather than just posting to third-party content silos.Publish on your own domain, and syndicate out to silos. This is the basis of the "Indie Web" movement. – IndieWeb.org +
+

- + - + - + - +
-
- -

Federating IndieWeb Conversations Level 3

- -

1. Add Reply Contexts to your site

- -

Posting replies to other people’s posts is the next step after just being able to mention them with webmention.

- -

Usually a reply is a note just like any other, but linking in a special way to the post it’s in reply to. When marked up with h-entry and rel=in-reply-to and/or class=u-in-reply-to, your reply can show up as a comment on the original post.

- -

To test if your webmention sending is working, try replying to a post by someone who’s implemented comment receiving. There’s a list on the wiki.

- -

If you wish you can also go the extra mile and display a copy of the post you’re replying to. This is called a reply context, and is an excellent way to practise parsing posts on other people’s sites.

- -

2. Receive webmentions on your site

-

Now you can post replies which show up as comments on other people’s sites, the next step is to be able to receive comments yourself. There are several ways to do this.

- -
    -
  • If you’re using a project like Known, it may already support indieweb comments — you don’t have to do anything!
  • -
  • If you’re using a project like WordPress, there may already be a plugin enabling receiving of indieweb comments. See if the software you’re using is on the project list on the wiki
  • -
  • If you’re rolling your own project and want to implement webmention yourself, have a read through the spec and the wiki page for tips
  • -
  • If you want to get started quickly without implementing receiving of webmentions yourself, take a look at a hosted service like webmention.io
  • -
- -

Once you’ve got webmention receiving set up, there are a few different ways of making sure it’s working correctly:

- -
    -
  • Link to one of your own posts and send yourself a mention. This works best if you know you can send webmentions successfully
  • -
  • Ask a friend (or a new friend in the online #indieweb chat to reply or mention one of your posts
  • -
  • If you’re POSSEing your content, setting up backfeed so that silo replies, likes, reshares, and event RSVPs show up on your own site. You can use a service like Bridgy, a server plugin, or roll your own
  • -
- -
+
+ +

Federating IndieWeb Conversations Level 3

+ +

1. Add Reply Contexts to your site

+ +

Posting replies to other people’s posts is the next step after just being able to mention them with webmention.

+ +

Usually a reply is a note just like any other, but linking in a special way to the post it’s in reply to. When marked up with h-entry and rel=in-reply-to and/or class=u-in-reply-to, your reply can show up as a comment on the original post.

+ +

To test if your webmention sending is working, try replying to a post by someone who’s implemented comment receiving. There’s a list on the wiki.

+ +

If you wish you can also go the extra mile and display a copy of the post you’re replying to. This is called a reply context, and is an excellent way to practise parsing posts on other people’s sites.

+ +

2. Receive webmentions on your site

+

Now you can post replies which show up as comments on other people’s sites, the next step is to be able to receive comments yourself. There are several ways to do this.

+ +
    +
  • If you’re using a project like Known, it may already support indieweb comments — you don’t have to do anything!
  • +
  • If you’re using a project like WordPress, there may already be a plugin enabling receiving of indieweb comments. See if the software you’re using is on the project list on the wiki
  • +
  • If you’re rolling your own project and want to implement webmention yourself, have a read through the spec and the wiki page for tips
  • +
  • If you want to get started quickly without implementing receiving of webmentions yourself, take a look at a hosted service like webmention.io
  • +
+ +

Once you’ve got webmention receiving set up, there are a few different ways of making sure it’s working correctly:

+ +
    +
  • Link to one of your own posts and send yourself a mention. This works best if you know you can send webmentions successfully
  • +
  • Ask a friend (or a new friend in the online #indieweb chat to reply or mention one of your posts
  • +
  • If you’re POSSEing your content, setting up backfeed so that silo replies, likes, reshares, and event RSVPs show up on your own site. You can use a service like Bridgy, a server plugin, or roll your own
  • +
+ +
diff --git a/templates/send-webmentions.html.php b/templates/send-webmentions.html.php index 413304a..caf542f 100644 --- a/templates/send-webmentions.html.php +++ b/templates/send-webmentions.html.php @@ -1,56 +1,57 @@
-
- -

2. Add the ability to send Webmentions to other IndieWeb sites

- -

When you reply to something on another indieweb site, or mention someone with an indieweb site, sending a webmention lets them know they’ve been linked to.

- -

Sending webmentions allows you to write replies to other content and participate in cross-site conversations. You can send webmentions by:

- - - -

On the wiki: webmention

- - -
- -

Something Went Wrong!

-

When sending webmentions and pingbacks for , we got this problem:

-

- -

Successfully sent webmentions/pingbacks from

- - - -
-

No h-entries were found on !

- -

When you send webmentions from a page, the pages you’ve mentioned will usually fetch it and parse it for h-entry markup, to display as comments or notifications. You should mark up your posts with h-entry so the people you mention can do something useful with the information.

-
- -
- - -
-
- -
-
- -
-
- - -
-

Previous Step | Home

- - -
+
+ +

2. Add the ability to send Webmentions to other IndieWeb sites

+ +

When you reply to something on another indieweb site, or mention someone with an indieweb site, sending a webmention lets them know they’ve been linked to.

+ +

Sending webmentions allows you to write replies to other content and participate in cross-site conversations. You can send webmentions by:

+ + + +

On the wiki: webmention

+ + +
+ +

Something Went Wrong!

+

When sending webmentions and pingbacks for , we got this problem:

+

+ +

Successfully sent webmentions/pingbacks from

+ + + +
+

No h-entries were found on !

+ +

When you send webmentions from a page, the pages you’ve mentioned will usually fetch it and parse it for h-entry markup, to display as comments or notifications. You should mark up your posts with h-entry so the people you mention can do something useful with the information.

+
+ +
+ + +
+
+ +
+
+ +
+
+ + +
+

Previous Step | Home

+ + +
diff --git a/templates/silo-hint.html.php b/templates/silo-hint.html.php index b0a9abb..e4117db 100644 --- a/templates/silo-hint.html.php +++ b/templates/silo-hint.html.php @@ -1,33 +1,33 @@ - -
-

It looks like your site is hosted on the WordPress.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — here are some resources which might help you out:

-
    -
  1. Wordpress Support article on Domains
  2. -
  3. Wordpress.com custom domain premium upgrade
  4. -
-

Once you’ve got your own domain, check out the IndieWeb WordPress wiki page for tips and plugins for adding things like webmentions and microformats to your site.

-
+ +
+

It looks like your site is hosted on the WordPress.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — here are some resources which might help you out:

+
    +
  1. Wordpress Support article on Domains
  2. +
  3. Wordpress.com custom domain premium upgrade
  4. +
+

Once you’ve got your own domain, check out the IndieWeb WordPress wiki page for tips and plugins for adding things like webmentions and microformats to your site.

+
- -
-

It looks like your site is hosted on Tumblr.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Tumblr has an article demonstrating how to give your web presence your own domain.

-

Once you’ve got your own domain, check out the IndieWeb Tumblr wiki page for tips on adding indieweb functionality to your site, or exporting your data elsewhere.

-
+ +
+

It looks like your site is hosted on Tumblr.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Tumblr has an article demonstrating how to give your web presence your own domain.

+

Once you’ve got your own domain, check out the IndieWeb Tumblr wiki page for tips on adding indieweb functionality to your site, or exporting your data elsewhere.

+
- -
-

It looks like your site is hosted on Github.io Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Github has an article demonstrating how to give your web presence your own domain.

-

Once you’ve got your own domain, check out the IndieWeb Github wiki page for tips on adding indieweb functionality to your site.

-
+ +
+

It looks like your site is hosted on Github.io Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Github has an article demonstrating how to give your web presence your own domain.

+

Once you’ve got your own domain, check out the IndieWeb Github wiki page for tips on adding indieweb functionality to your site.

+
- -

It looks like you’re using WordPress to power your site — check out the IndieWeb WordPress wiki page for tips on how to indiewebify your WordPress site!

+ +

It looks like you’re using WordPress to power your site — check out the IndieWeb WordPress wiki page for tips on how to indiewebify your WordPress site!

- -

It looks like you’re using MediaWiki to power your site — check out the IndieWeb MediaWiki wiki page for tips on how to indiewebify your MediaWiki site!

+ +

It looks like you’re using MediaWiki to power your site — check out the IndieWeb MediaWiki wiki page for tips on how to indiewebify your MediaWiki site!

- -

It looks like you’re using idno to power your site — check out the IndieWeb idno wiki page for tips on how to indiewebify your idno site!

+ +

It looks like you’re using idno to power your site — check out the IndieWeb idno wiki page for tips on how to indiewebify your idno site!

diff --git a/templates/validate-h-card.html.php b/templates/validate-h-card.html.php index 7ce28e4..c7a1c3c 100644 --- a/templates/validate-h-card.html.php +++ b/templates/validate-h-card.html.php @@ -1,186 +1,186 @@ 'Honorific prefix', - 'given-name' => 'Given (often first) name', - 'additional-name' => 'Other/middle name', - 'family-name' => 'Family (often last) name', - 'sort-string' => 'String to sort by', - 'honorific-suffix' => 'Honorific suffix', - 'nickname' => 'Nickname', - 'email' => 'Email address', - 'logo' => 'Logo', - 'uid' => 'Unique identifier', - 'category' => 'Category/tag', - 'adr' => 'Postal Address', - 'post-office-box' => 'Post Office Box', - 'street-address' => 'Street number and name', - 'extended-address' => 'Extended address', - 'locality' => 'City/town/village', - 'region' => 'State/province/county', - 'postal-code' => 'Postal code', - 'country-name' => 'Country', - 'label' => 'Label', - 'geo' => 'Geo', - 'latitude' => 'Latitude', - 'longitude' => 'Longitude', - 'altitude' => 'Altitude', - 'tel' => 'Telephone', - 'bday' => 'Birth Date', - 'key' => 'Cryptographic public key', - 'org' => 'Organization', - 'job-title' => 'Job title', - 'role' => 'Description of role', - 'impp' => 'Instant Messaging and Presence Protocol', - 'sex' => 'Biological sex', - 'gender-identity' => 'Gender identity', - 'anniversary' => 'Anniversary', - ]; - - # default h-card to show properties for - $hCard = null; -?> + use BarnabyWalters\Mf2; + + $optional_properties = [ + 'honorific-prefix' => 'Honorific prefix', + 'given-name' => 'Given (often first) name', + 'additional-name' => 'Other/middle name', + 'family-name' => 'Family (often last) name', + 'sort-string' => 'String to sort by', + 'honorific-suffix' => 'Honorific suffix', + 'nickname' => 'Nickname', + 'email' => 'Email address', + 'logo' => 'Logo', + 'uid' => 'Unique identifier', + 'category' => 'Category/tag', + 'adr' => 'Postal Address', + 'post-office-box' => 'Post Office Box', + 'street-address' => 'Street number and name', + 'extended-address' => 'Extended address', + 'locality' => 'City/town/village', + 'region' => 'State/province/county', + 'postal-code' => 'Postal code', + 'country-name' => 'Country', + 'label' => 'Label', + 'geo' => 'Geo', + 'latitude' => 'Latitude', + 'longitude' => 'Longitude', + 'altitude' => 'Altitude', + 'tel' => 'Telephone', + 'bday' => 'Birth Date', + 'key' => 'Cryptographic public key', + 'org' => 'Organization', + 'job-title' => 'Job title', + 'role' => 'Description of role', + 'impp' => 'Instant Messaging and Presence Protocol', + 'sex' => 'Biological sex', + 'gender-identity' => 'Gender identity', + 'anniversary' => 'Anniversary', + ]; + + // default h-card to show properties for + $hCard = null; + ?>
-
- -

Publishing on the IndieWeb Level 2

- -

1. Mark up your content (Profile, Notes, Articles, etc…) with microformats2

- -

Other humans can already understand your profile information and the things you post on your site. By adding a few simple class names to your HTML, other people’s software can understand it and use it for things like reply contexts, cross-site comments, event RSVPs, and more.

- -

Check your homepage h-card:

- - -
-
- -
-
- -
-
- - -
-

Something Went Wrong!

-

When fetching , we got this problem:

-

-
- - - -
- - - -

Success!

-

This representative h-card was found on your site:

- - 0): - $hCard = $allHCards[0]; - $intro_phrase = 'An h-card was found on your site! Consider '; - if (count($allHCards) > 1) { - $intro_phrase = 'Multiple h-cards were found on your site! Consider only having one and '; - } - ?> - -

Almost there!

-

marking it up as the representative h-card.

-

To identify the h-card that represents the page, you can:

-
    -
  • Add class="u-url u-uid" on the h-card’s link to
  • -
  • Or: add class="u-url" rel="me" on the h-card’s link to
  • -
-

Here is the first h-card found:

- - - -

No h-cards found

-

No h-cards were found on your site! Adding one can be as simple as this:

- -
<a href="" class="h-card" rel="me">Your Name</a>
- -

You can also add other properties for a more detailed profile — see h-card on the microformats wiki for a full list.

- - - - -
- - - - - -
-

Add a photo!

-

<img class="u-photo" src="…" />

-
- -

- -

URL

- -
    - -
  • - -
- -
-

Add your URLs! <a rel="me" class="u-url">…</a>

-
- - - -

Email

-
    - -
  • - -
- - - -

Note

-

- -
-

Got a brief bio like a Twitter/Instagram bio? Add it to your own h-card as a note property! <p class="p-note">…</p>

-
- - - $label) { - if (Mf2\hasProp($hCard, $name)) { - echo sprintf('

%s

    ', $label); - foreach (Mf2\getPlaintextArray($hCard, $name) as $value) { - echo sprintf('
  • %s
  • ', $value); - } - echo '
'; - } - } - ?> - -

See the full list of h-card properties.

-
- - - $url)) ?> - -
- - - Want to be able to use h-card data in your code? Check out the open-source implementations. - - -
-

Previous Step | Home | Next Step

- - -
+
+ +

Publishing on the IndieWeb Level 2

+ +

1. Mark up your content (Profile, Notes, Articles, etc…) with microformats2

+ +

Other humans can already understand your profile information and the things you post on your site. By adding a few simple class names to your HTML, other people’s software can understand it and use it for things like reply contexts, cross-site comments, event RSVPs, and more.

+ +

Check your homepage h-card:

+ + +
+
+ +
+
+ +
+
+ + +
+

Something Went Wrong!

+

When fetching , we got this problem:

+

+
+ + + +
+ + + +

Success!

+

This representative h-card was found on your site:

+ + 0) : + $hCard = $allHCards[0]; + $intro_phrase = 'An h-card was found on your site! Consider '; + if (count($allHCards) > 1) { + $intro_phrase = 'Multiple h-cards were found on your site! Consider only having one and '; + } + ?> + +

Almost there!

+

marking it up as the representative h-card.

+

To identify the h-card that represents the page, you can:

+
    +
  • Add class="u-url u-uid" on the h-card’s link to
  • +
  • Or: add class="u-url" rel="me" on the h-card’s link to
  • +
+

Here is the first h-card found:

+ + + +

No h-cards found

+

No h-cards were found on your site! Adding one can be as simple as this:

+ +
<a href="" class="h-card" rel="me">Your Name</a>
+ +

You can also add other properties for a more detailed profile — see h-card on the microformats wiki for a full list.

+ + + + +
+ + + + + +
+

Add a photo!

+

<img class="u-photo" src="…" />

+
+ +

+ +

URL

+ +
    + +
  • + +
+ +
+

Add your URLs! <a rel="me" class="u-url">…</a>

+
+ + + +

Email

+
    + +
  • + +
+ + + +

Note

+

+ +
+

Got a brief bio like a Twitter/Instagram bio? Add it to your own h-card as a note property! <p class="p-note">…</p>

+
+ + + $label) { + if (Mf2\hasProp($hCard, $name)) { + echo sprintf('

%s

    ', $label); + foreach (Mf2\getPlaintextArray($hCard, $name) as $value) { + echo sprintf('
  • %s
  • ', $value); + } + echo '
'; + } + } + ?> + +

See the full list of h-card properties.

+
+ + + $url)) ?> + +
+ + + Want to be able to use h-card data in your code? Check out the open-source implementations. + + +
+

Previous Step | Home | Next Step

+ + +
diff --git a/templates/validate-h-entry.html.php b/templates/validate-h-entry.html.php index 6800366..da7d090 100644 --- a/templates/validate-h-entry.html.php +++ b/templates/validate-h-entry.html.php @@ -1,233 +1,234 @@
-
- -

Check your posts (notes, articles, etc.) are marked up with h-entry:

- -
-
- -
-
- -
-
- - -
- -

Something Went Wrong!

-

When fetching , we encountered this problem:

-

- -

Success!

- -

We found the following h-entry on your site:

- -
- - -

Name

-

- -

Name

-
-

The parsed name name is longer than the content, which is usually a sign is it malformed due to being implicitly rather than explicitly parsed.

- -

You should always manually specify what the name of a post is. If it doesn’t have one, make the name the same as the content, e.g. <div class="e-content p-name">…

-
- - -

Author

- - -
- - - -
-

Add a photo!

-

<img class="u-photo" src="…" />

-
- - - -
- -
-

You’re marking up your post’s author as a string — add h-card to make it a full h-card!

- -
<a class="p-author h-card" href="your-url.com">Your Name</a>
-
- - -
-

Add an author!

-
<a rel="author" class="p-author h-card" href="…">Your Name</a>
-
- - - - -

In Reply To

-
    - -
  • - - - - -

    The nested in-reply-to microformat should be an h-cite as it refers to off-site content.

    - - - - - -

    Give the nested microformat a URL property! <a class="u-url" href="…"></a>

    - - - The value for an in-reply-to property should be a URL or an embedded h-cite. - -
  • - -
- - -

Like Of

- - - - -

The nested h-cite microformat should be an h-cite as it refers to off-site content.

- - - - - -

Give the nested microformat a URL property! <a class="u-url" href="…"></a>

- - - The value for a like-of property should be a URL or an embedded h-cite. - - - -

Repost Of

- - - - -

The nested h-cite microformat should be an h-cite as it refers to off-site content.

- - - - - -

Give the nested microformat a URL property! <a class="u-url" href="…"></a>

- - - The value for a repost-of property should be a URL or an embedded h-cite. - - - - -

Content

- -
- -

It looks like your content is marked up as a plain property — consider using class="e-content" so that consumers can parse rich text (i.e. with images and formatting)

- - -
-

Add some content! <p class="e-content">…

-
- - -

Published - -

- - - - -

-
-

Add a publication datetime!

-

<time class="dt-published" datetime="YYYY-MM-DD HH:MM:SS">The Date</time>

-
- - -

URL - -

- -

Add a URL! <a class="u-url" href="…">…</a>

- - -

Syndicated Copies

- -
    - -
  • - -
- -
-

Add URLs of POSSEd copies!

-

<a rel="syndication" class="u-syndication" href="…">…</a>

-
- - -

Categories

- -
    - -
  • - -
- -

Add some categories! <a class="p-category" href="…">…</a>

- -
- -

No h-entry found

- -

Adding h-entry markup to posts on your site allows computers to understand them as easily as humans can, without publishing separate copies. All you need to do is add microformats2 h-entry classnames, for example:

- -
<article class="h-entry">
+    
+ +

Check your posts (notes, articles, etc.) are marked up with h-entry:

+ +
+
+ +
+
+ +
+
+ + +
+ +

Something Went Wrong!

+

When fetching , we encountered this problem:

+

+ +

Success!

+ +

We found the following h-entry on your site:

+ +
+ + +

Name

+

+ +

Name

+
+

The parsed name name is longer than the content, which is usually a sign is it malformed due to being implicitly rather than explicitly parsed.

+ +

You should always manually specify what the name of a post is. If it doesn’t have one, make the name the same as the content, e.g. <div class="e-content p-name">…

+
+ + +

Author

+ + +
+ + + +
+

Add a photo!

+

<img class="u-photo" src="…" />

+
+ + + +
+ +
+

You’re marking up your post’s author as a string — add h-card to make it a full h-card!

+ +
<a class="p-author h-card" href="your-url.com">Your Name</a>
+
+ + +
+

Add an author!

+
<a rel="author" class="p-author h-card" href="…">Your Name</a>
+
+ + + + +

In Reply To

+
    + +
  • + + + + +

    The nested in-reply-to microformat should be an h-cite as it refers to off-site content.

    + + + + + +

    Give the nested microformat a URL property! <a class="u-url" href="…"></a>

    + + + The value for an in-reply-to property should be a URL or an embedded h-cite. + +
  • + +
+ + +

Like Of

+ + + + +

The nested h-cite microformat should be an h-cite as it refers to off-site content.

+ + + + + +

Give the nested microformat a URL property! <a class="u-url" href="…"></a>

+ + + The value for a like-of property should be a URL or an embedded h-cite. + + + +

Repost Of

+ + + + +

The nested h-cite microformat should be an h-cite as it refers to off-site content.

+ + + + + +

Give the nested microformat a URL property! <a class="u-url" href="…"></a>

+ + + The value for a repost-of property should be a URL or an embedded h-cite. + + + + +

Content

+ +
+ +

It looks like your content is marked up as a plain property — consider using class="e-content" so that consumers can parse rich text (i.e. with images and formatting)

+ + +
+

Add some content! <p class="e-content">…

+
+ + +

Published + +

+ + + + +

+
+

Add a publication datetime!

+

<time class="dt-published" datetime="YYYY-MM-DD HH:MM:SS">The Date</time>

+
+ + +

URL + +

+ +

Add a URL! <a class="u-url" href="…">…</a>

+ + +

Syndicated Copies

+ +
    + +
  • + +
+ +
+

Add URLs of POSSEd copies!

+

<a rel="syndication" class="u-syndication" href="…">…</a>

+
+ + +

Categories

+ +
    + +
  • + +
+ +

Add some categories! <a class="p-category" href="…">…</a>

+ +
+ +

No h-entry found

+ +

Adding h-entry markup to posts on your site allows computers to understand them as easily as humans can, without publishing separate copies. All you need to do is add microformats2 h-entry classnames, for example:

+ +
<article class="h-entry">
   <div class="e-content p-name">Hello world! This is my first indieweb post.</div>
 
   <a class="u-url" href="https://example.com/my-first-post">
-    Published <time class="dt-published"></time>
+    Published <time class="dt-published"></time>
   </a>
 </article>
- + - $url)) ?> -
+ $url)) ?> +
-

Your h-entries should have, at minimum, the following properties:

+

Your h-entries should have, at minimum, the following properties:

-
    -
  • e-content — the main content of the post
  • -
  • p-name — if your post is an article with a name, use this classname.
  • -
  • dt-published — the datetime the post was published at, in ISO8601 format, with a timezone
  • -
  • u-url — the canonical URL of the post, especially important on pages listing multiple posts
  • -
+
    +
  • e-content — the main content of the post
  • +
  • p-name — if your post is an article with a name, use this classname.
  • +
  • dt-published — the datetime the post was published at, in ISO8601 format, with a timezone
  • +
  • u-url — the canonical URL of the post, especially important on pages listing multiple posts
  • +
-

It’s a common convention for the published datetime to be a link to the post itself, but they can be separate if you want.

+

It’s a common convention for the published datetime to be a link to the post itself, but they can be separate if you want.

-

There should also be some way to discover the author of the post — either link to your homepage (which should have your h-card on it) from anywhere within the body of the page with rel=author, or optionally embed a p-author h-card in the h-entry.

+

There should also be some way to discover the author of the post — either link to your homepage (which should have your h-card on it) from anywhere within the body of the page with rel=author, or optionally embed a p-author h-card in the h-entry.

-

The web is an expressive medium, and as such there are many other properties which you can add to your posts. Check out the h-entry documentation for a full list.

- +

The web is an expressive medium, and as such there are many other properties which you can add to your posts. Check out the h-entry documentation for a full list.

+ - Want to be able to use h-entry data in your code? Check out the open-source implementations. + Want to be able to use h-entry data in your code? Check out the open-source implementations. - -
-

Previous Step | Home | Next Step

- + +
+

Previous Step | Home | Next Step

+ -
+
diff --git a/templates/validate-rel-me.html.php b/templates/validate-rel-me.html.php index 702dead..e0696fa 100644 --- a/templates/validate-rel-me.html.php +++ b/templates/validate-rel-me.html.php @@ -1,59 +1,60 @@
-
+
-

Become a citizen of the IndieWeb Level 1

+

Become a citizen of the IndieWeb Level 1

-

1. Get your own domain name

- -

A personal domain name is an inexpensive, internationally universal identifier which gives you more control over your space than other IDs (e.g. email address or phone number.)

- -

On the wiki: Personal Domains.

- -

2. Set up Web Sign In

- -

In order to be able to sign in using your domain name, connect it to your existing identities.

- -

You probably already have many disconnected profiles on the web. Linking between them and your domain name with the rel=me microformat ensures that it’s easy to see that you on Google/Twitter/Github/Flickr/Facebook/email are all the same person as your domain name.

- -

On the wiki: How to set up Web Sign In.

- - -
- -

Something Went Wrong!

-

When fetching , we got this problem:

-

- - -

We found the following rel=me URLs on your site:

- -
    - -
  • - -
- - - $url)) ?> -
- - -
-
- -
-
- -
-
- - Want to be able to use rel-me data in your code? Check out the open source implementations. +

1. Get your own domain name

+ +

A personal domain name is an inexpensive, internationally universal identifier which gives you more control over your space than other IDs (e.g. email address or phone number.)

+ +

On the wiki: Personal Domains.

+ +

2. Set up Web Sign In

+ +

In order to be able to sign in using your domain name, connect it to your existing identities.

+ +

You probably already have many disconnected profiles on the web. Linking between them and your domain name with the rel=me microformat ensures that it’s easy to see that you on Google/Twitter/Github/Flickr/Facebook/email are all the same person as your domain name.

+ +

On the wiki: How to set up Web Sign In.

+ + +
+ +

Something Went Wrong!

+

When fetching , we got this problem:

+

+ + +

We found the following rel=me URLs on your site:

+ +
    + +
  • + +
+ + + $url)) ?> +
+ + +
+
+ +
+
+ +
+
+ + Want to be able to use rel-me data in your code? Check out the open source implementations. - -
-

Home | Next Step

- + +
+

Home | Next Step

+ -
+
diff --git a/tests/RelMeTest.php b/tests/RelMeTest.php index a745c88..35833b4 100644 --- a/tests/RelMeTest.php +++ b/tests/RelMeTest.php @@ -1,5 +1,17 @@ + * @license https://opensource.org/licenses/MIT MIT + * @link https://indiewebify.me + */ + namespace IndieWeb; use PHPUnit\Framework\TestCase; @@ -7,21 +19,44 @@ /** * RelMeTest * - * @author barnabywalters + * @category Tests + * @package IndieWeb + * @author Display Name + * @license https://opensource.org/licenses/MIT MIT + * @link https://indiewebify.me */ -class RelMeTest extends TestCase { - public function testUnparseUrl() { - $this->assertEquals('http://example.com/', unparseUrl(parse_url('http://example.com'))); - $this->assertEquals('http://example.com/?thing&more', unparseUrl(parse_url('http://example.com?thing&more'))); - } - - public function testNormaliseUrl() { - $this->assertEquals('http://example.com/', normaliseUrl('http://example.com')); - $this->assertEquals('http://example.com/?thing=1', normaliseUrl('http://example.com?thing=1')); - } - - public function testHttpParseHeaders() { - $test = <<assertEquals('http://example.com/', unparseUrl(parse_url('http://example.com'))); + $this->assertEquals('http://example.com/?thing&more', unparseUrl(parse_url('http://example.com?thing&more'))); + } + + /** + * Test Normalise URL + * + * @return void + */ + public function testNormaliseUrl() + { + $this->assertEquals('http://example.com/', normaliseUrl('http://example.com')); + $this->assertEquals('http://example.com/?thing=1', normaliseUrl('http://example.com?thing=1')); + } + + /** + * Test HTTP parse headers + * + * @return void + */ + public function testHttpParseHeaders() + { + $test = << 'text/html; charset=UTF-8', - 'Server' => 'Funky/1.0', - 'Set-Cookie' => array('foo=bar', 'baz=quux'), - 'Folded' => "works\r\n\ttoo" - ); - $result = http_parse_headers($test); - $this->assertEquals($expected, $result); - } - - /** @group network */ - /* There is already a test for this in indieweb/rel-me - public function testFollowOneRedirect() { - $this->assertEquals('https://brennannovak.com/', followOneRedirect('http://brennannovak.com')); - }*/ - - public function testRelMeDocumentUrlHandlesNoRedirect() { - $chain = mockFollowOneRedirect(array(null)); - $meUrl = normaliseUrl('http://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($meUrl, $url); - $this->assertTrue($isSecure); - } - - public function testRelMeDocumentUrlHandlesSingleSecureHttpRedirect() { - $finalUrl = normaliseUrl('http://example.org'); - $chain = mockFollowOneRedirect(array($finalUrl)); - $meUrl = normaliseUrl('http://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); - $this->assertContains($finalUrl, $previous); - } - - public function testRelMeDocumentUrlHandlesMultipleSecureHttpRedirects() { - $finalUrl = normaliseUrl('http://example.org'); - $intermediateUrl = normaliseUrl('http://www.example.org'); - $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); - $meUrl = normaliseUrl('http://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); - $this->assertContains($intermediateUrl, $previous); - } - - public function testRelMeDocumentUrlHandlesSingleSecureHttpsRedirect() { - $finalUrl = normaliseUrl('https://example.org'); - $chain = mockFollowOneRedirect(array($finalUrl)); - $meUrl = normaliseUrl('https://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); - $this->assertContains($finalUrl, $previous); - } - - public function testRelMeDocumentUrlHandlesMultipleSecureHttpsRedirects() { - $finalUrl = normaliseUrl('https://example.org'); - $intermediateUrl = normaliseUrl('https://www.example.org'); - $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); - $meUrl = normaliseUrl('https://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); - $this->assertContains($intermediateUrl, $previous); - } - - public function testRelMeDocumentUrlReportsInsecureRedirect() { - $finalUrl = normaliseUrl('http://example.org'); - $intermediateUrl = normaliseUrl('https://www.example.org'); - $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); - $meUrl = normaliseUrl('https://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertFalse($isSecure); - $this->assertContains($intermediateUrl, $previous); - } - - public function testRelMeLinksFindsLinks() { - $relMeLinks = relMeLinks(<< 'text/html; charset=UTF-8', + 'Server' => 'Funky/1.0', + 'Set-Cookie' => array('foo=bar', 'baz=quux'), + 'Folded' => "works\r\n\ttoo" + ); + $result = http_parse_headers($test); + $this->assertEquals($expected, $result); + } + + // /** + // * @group network + // */ + // /* There is already a test for this in indieweb/rel-me + // public function testFollowOneRedirect() { + // $this->assertEquals('https://brennannovak.com/', followOneRedirect('http://brennannovak.com')); + // }*/ + + /** + * Test relMeDocumentUrl handles no redirect + * + * @return void + */ + public function testRelMeDocumentUrlHandlesNoRedirect() + { + $chain = mockFollowOneRedirect(array(null)); + $meUrl = normaliseUrl('http://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($meUrl, $url); + $this->assertTrue($isSecure); + } + + /** + * Test relMeDocumentUrl handles single secure http redirect + * + * @return void + */ + public function testRelMeDocumentUrlHandlesSingleSecureHttpRedirect() + { + $finalUrl = normaliseUrl('http://example.org'); + $chain = mockFollowOneRedirect(array($finalUrl)); + $meUrl = normaliseUrl('http://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($finalUrl, $url); + $this->assertTrue($isSecure); + $this->assertContains($finalUrl, $previous); + } + + /** + * Test relMeDocumentUrl handles multiple redirects + * + * @return void + */ + public function testRelMeDocumentUrlHandlesMultipleSecureHttpRedirects() + { + $finalUrl = normaliseUrl('http://example.org'); + $intermediateUrl = normaliseUrl('http://www.example.org'); + $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); + $meUrl = normaliseUrl('http://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($finalUrl, $url); + $this->assertTrue($isSecure); + $this->assertContains($intermediateUrl, $previous); + } + + /** + * Test relMeDocumentUrl handles multiple redirects + * + * @return void + */ + public function testRelMeDocumentUrlHandlesSingleSecureHttpsRedirect() + { + $finalUrl = normaliseUrl('https://example.org'); + $chain = mockFollowOneRedirect(array($finalUrl)); + $meUrl = normaliseUrl('https://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($finalUrl, $url); + $this->assertTrue($isSecure); + $this->assertContains($finalUrl, $previous); + } + + /** + * Test relMeDocumentUrl handles multiple redirects + * + * @return void + */ + public function testRelMeDocumentUrlHandlesMultipleSecureHttpsRedirects() + { + $finalUrl = normaliseUrl('https://example.org'); + $intermediateUrl = normaliseUrl('https://www.example.org'); + $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); + $meUrl = normaliseUrl('https://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($finalUrl, $url); + $this->assertTrue($isSecure); + $this->assertContains($intermediateUrl, $previous); + } + + /** + * Test relMeDocumentUrl handles insecure redirect + * + * @return void + */ + public function testRelMeDocumentUrlReportsInsecureRedirect() + { + $finalUrl = normaliseUrl('http://example.org'); + $intermediateUrl = normaliseUrl('https://www.example.org'); + $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); + $meUrl = normaliseUrl('https://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertFalse($isSecure); + $this->assertContains($intermediateUrl, $previous); + } + + /** + * Test relMeLinks finds links + * + * @return void + */ + public function testRelMeLinksFindsLinks() + { + $relMeLinks = relMeLinks( + << Me EOT - , 'http://example.com'); - $this->assertEquals(array('http://example.org', 'http://twitter.com/barnabywalters'), $relMeLinks); - } - - // backlinkingRelMeSuccessNoRedirect tests - - public function testBacklinkingRelMeSuccessNoRedirect() { - $meUrl = $backlinkingMeUrl = 'http://example.com'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl)); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertTrue($matches); - $this->assertTrue($secure); - } - - public function testBacklinkingRelMeSuccessOneRedirect() { - $meUrl = 'http://example.com'; - $backlinkingMeUrl = 'http://example.org'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl, $meUrl)); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertTrue($matches); - $this->assertTrue($secure); - } - - public function testBacklinkingRelMeNoMatchInsecureRedirect() { - $meUrl = 'http://example.com'; - $backlinkingMeUrl = 'http://example.org'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'https://example.org')); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertFalse($matches); - $this->assertFalse($secure); - } - - public function testBacklinkingRelMeSuccessInsecureRedirect() { - $meUrl = 'http://example.org'; - $backlinkingMeUrl = 'http://example.com'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'https://example.org')); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertTrue($matches); - $this->assertFalse($secure); - } - - public function testBacklinkingRelMeSecureRedirectNoMatch() { - $meUrl = 'http://example.org'; - $backlinkingMeUrl = 'http://example.com'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'http://foo.org')); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertFalse($matches); - $this->assertTrue($secure); - } + , 'http://example.com' + ); + $this->assertEquals(array('http://example.org', 'http://twitter.com/barnabywalters'), $relMeLinks); + } + + /** + * BacklinkingRelMeSuccessNoRedirect tests + * + * @return void + */ + public function testBacklinkingRelMeSuccessNoRedirect() + { + $meUrl = $backlinkingMeUrl = 'http://example.com'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl)); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertTrue($matches); + $this->assertTrue($secure); + } + + public function testBacklinkingRelMeSuccessOneRedirect() + { + $meUrl = 'http://example.com'; + $backlinkingMeUrl = 'http://example.org'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl, $meUrl)); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertTrue($matches); + $this->assertTrue($secure); + } + + public function testBacklinkingRelMeNoMatchInsecureRedirect() + { + $meUrl = 'http://example.com'; + $backlinkingMeUrl = 'http://example.org'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'https://example.org')); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertFalse($matches); + $this->assertFalse($secure); + } + + public function testBacklinkingRelMeSuccessInsecureRedirect() + { + $meUrl = 'http://example.org'; + $backlinkingMeUrl = 'http://example.com'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'https://example.org')); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertTrue($matches); + $this->assertFalse($secure); + } + + public function testBacklinkingRelMeSecureRedirectNoMatch() + { + $meUrl = 'http://example.org'; + $backlinkingMeUrl = 'http://example.com'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'http://foo.org')); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertFalse($matches); + $this->assertTrue($secure); + } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 28151c2..d49e575 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -6,13 +6,26 @@ require __DIR__ . '/../vendor/autoload.php'; -function mockFollowOneRedirect(array $responses) { - $i = 0; - $responses = array_values($responses); +/** + * Mock follow one redirect + * + * @param array $responses Responses + * + * @return \Closure + */ +function mockFollowOneRedirect(array $responses) +{ + $i = 0; + $responses = array_values($responses); - return function () use (&$i, $responses) { - $out = array_key_exists($i, $responses) ? $responses[$i] : null; - $i = $i + 1; - return $out; - }; + /** + * Return the next response in the list + * + * @return mixed + */ + return function () use (&$i, $responses) { + $out = array_key_exists($i, $responses) ? $responses[$i] : null; + $i = $i + 1; + return $out; + }; } diff --git a/tests/html-test-runner.php b/tests/html-test-runner.php index 1cb6b8c..7c58293 100644 --- a/tests/html-test-runner.php +++ b/tests/html-test-runner.php @@ -10,45 +10,49 @@ ob_end_clean(); if (PHP_SAPI === 'cli') { - $html = file_get_contents(__DIR__ . '/rel-me-test.html'); - $parser = new Mf2Parser($html); - $mf = $parser->parse(); - - $testSuites = Mf2\findMicroformatsByType($mf, 'h-x-test-suite'); - - if (count($testSuites) === 0) - die("Found no test suites in rel-me-test.html"); - - $testSuite = $testSuites[0]; - - echo "\n" . Mf2\getProp($testSuite, 'name') . "\n"; - echo "============================\n"; - - foreach ($testSuite['properties']['x-test-case'] as $testCase) { - echo "\n"; - $params = $testCase['properties']['x-parameter']; - $meUrl = array_shift($params); - if (count($params) === 0) - $redirects = mockFollowOneRedirect(array(null)); - else - $redirects = mockFollowOneRedirect($params); - - list($expectedUrl, $expectedSecure) = $testCase['properties']['x-expected-result']; - $expectedSecure = $expectedSecure === 'true'; - - // Begin testing - $meUrl = normaliseUrl($meUrl); - list($url, $secure, $previous) = relMeDocumentUrl($meUrl, $redirects); - // end testing - - if ($url === $expectedUrl and $secure === $expectedSecure): - echo "(pass) " . Mf2\getProp($testCase, 'name') . "\n"; - else: - echo "(fail) " . Mf2\getProp($testCase, 'name') . "\n"; - if ($url != $expectedUrl) - echo "- {$url} should match {$expectedUrl}\n"; - if ($secure != $expectedSecure) - echo "- {$secure} didn’t match {$expectedSecure}\n"; - endif; - } + $html = file_get_contents(__DIR__ . '/rel-me-test.html'); + $parser = new Mf2Parser($html); + $mf = $parser->parse(); + + $testSuites = Mf2\findMicroformatsByType($mf, 'h-x-test-suite'); + + if (count($testSuites) === 0) { + die("Found no test suites in rel-me-test.html"); + } + + $testSuite = $testSuites[0]; + + echo "\n" . Mf2\getProp($testSuite, 'name') . "\n"; + echo "============================\n"; + + foreach ($testSuite['properties']['x-test-case'] as $testCase) { + echo "\n"; + $params = $testCase['properties']['x-parameter']; + $meUrl = array_shift($params); + if (count($params) === 0) { + $redirects = mockFollowOneRedirect(array(null)); + } else { + $redirects = mockFollowOneRedirect($params); + } + + list($expectedUrl, $expectedSecure) = $testCase['properties']['x-expected-result']; + $expectedSecure = $expectedSecure === 'true'; + + // Begin testing + $meUrl = normaliseUrl($meUrl); + list($url, $secure, $previous) = relMeDocumentUrl($meUrl, $redirects); + // end testing + + if ($url === $expectedUrl and $secure === $expectedSecure) : + echo "(pass) " . Mf2\getProp($testCase, 'name') . "\n"; + else: + echo "(fail) " . Mf2\getProp($testCase, 'name') . "\n"; + if ($url != $expectedUrl) { + echo "- {$url} should match {$expectedUrl}\n"; + } + if ($secure != $expectedSecure) { + echo "- {$secure} didn’t match {$expectedSecure}\n"; + } + endif; + } } diff --git a/web/index.php b/web/index.php index f690379..525be6c 100644 --- a/web/index.php +++ b/web/index.php @@ -17,391 +17,509 @@ use Silex; use Symfony\Component\HttpFoundation as Http; -function renderTemplate($template, array $__templateData = array()) { - $render = function ($__path, $render=null) use ($__templateData) { - ob_start(); - extract($__templateData); - unset($__templateData); - include __DIR__ . '/../templates/' . $__path . '.php'; - return ob_get_clean(); - }; - - return $render($template, $render); +/** + * Render a template with data + * + * @param $template + * @param array $__templateData + * + * @return false|string + */ +function renderTemplate($template, array $__templateData = array()) +{ + $render = function ($__path, $render=null) use ($__templateData) { + ob_start(); + extract($__templateData); + unset($__templateData); + include __DIR__ . '/../templates/' . $__path . '.php'; + return ob_get_clean(); + }; + + return $render($template, $render); } -function render($template, array $data = array()) { - $isHtml = pathinfo($template, PATHINFO_EXTENSION) === 'html'; - $out = ''; - - $purifierConfig = HTMLPurifier_Config::createDefault(); - $data['purify'] = array(new HTMLPurifier($purifierConfig), 'purify'); - - if ($isHtml) - $out .= renderTemplate('header.html', $data); - $out .= renderTemplate($template, $data); - if ($isHtml) - $out .= renderTemplate('footer.html', $data); - return $out; +/** + * Render + * + * @param $template + * @param array $data + * + * @return string + */ +function render($template, array $data = array()) +{ + $isHtml = pathinfo($template, PATHINFO_EXTENSION) === 'html'; + $out = ''; + + $purifierConfig = HTMLPurifier_Config::createDefault(); + $data['purify'] = array(new HTMLPurifier($purifierConfig), 'purify'); + + if ($isHtml) { + $out .= renderTemplate('header.html', $data); + } + $out .= renderTemplate($template, $data); + if ($isHtml) { + $out .= renderTemplate('footer.html', $data); + } + return $out; } -function crossOriginResponse($resp, $code=200) { - $response = ($resp instanceof Http\Response) ? $resp : new Http\Response($resp, $code); - $response->headers->set('Access-Control-Allow-Origin', '*'); - return $response; +/** + * Cross Origin Response + * + * @param $resp + * @param $code + * + * @return Http\Response + */ +function crossOriginResponse($resp, $code=200) +{ + $response = ($resp instanceof Http\Response) ? $resp : new Http\Response($resp, $code); + $response->headers->set('Access-Control-Allow-Origin', '*'); + return $response; } -function httpGet($url) { - $client = new Guzzle\Http\Client(null, array( - #'ssl.certificate_authority' => __DIR__ . '/../mozilla-ca-certs.pem' - )); - ob_start(); - $url = web_address_to_uri($url, true); - ob_end_clean(); - - try { - $response = $client->get($url)->send(); - return array($response, null); - } catch (Guzzle\Common\Exception\GuzzleException $e) { - return array(null, $e); - } +/** + * HTTP Get + * + * @param $url + * + * @return array + */ +function httpGet($url) +{ + $client = new Guzzle\Http\Client( + null, array( + // 'ssl.certificate_authority' => __DIR__ . '/../mozilla-ca-certs.pem' + ) + ); + ob_start(); + $url = web_address_to_uri($url, true); + ob_end_clean(); + + try { + $response = $client->get($url)->send(); + return array($response, null); + } catch (Guzzle\Common\Exception\GuzzleException $e) { + return array(null, $e); + } } -function parseMf($resp, $url) { - $parser = new MfParser((string) $resp, $url); - return $parser->parse(); +/** + * Parse MF + * + * @param $resp + * @param $url + * + * @return string + */ +function parseMf($resp, $url) +{ + $parser = new MfParser((string) $resp, $url); + return $parser->parse(); } -function fetchMf($url) { - list($resp, $err) = httpGet($url); - if ($err) - return array(null, $err); - return array(parseMf($resp->getBody(), $url), null); +/** + * Fetch MF + * + * @param $url + * + * @return array + */ +function fetchMf($url) +{ + list($resp, $err) = httpGet($url); + if ($err) { + return array(null, $err); + } + return array(parseMf($resp->getBody(), $url), null); } -function errorResponder($template, $url) { - return function ($message, $code = 400) use ($template, $url) { - return crossOriginResponse(render($template, array( - 'error' => array('message' => $message), - 'url' => htmlspecialchars($url) - )), $code); - }; +function errorResponder($template, $url) +{ + return function ($message, $code = 400) use ($template, $url) { + return crossOriginResponse( + render( + $template, array( + 'error' => array('message' => $message), + 'url' => htmlspecialchars($url) + ) + ), $code + ); + }; } -function isWordpressDomain($url) { - return stristr(parse_url($url, PHP_URL_HOST), '.wordpress.com') !== false; +function isWordpressDomain($url) +{ + return stristr(parse_url($url, PHP_URL_HOST), '.wordpress.com') !== false; } -function isGithubDomain($url) { - return stristr(parse_url($url, PHP_URL_HOST), '.github.') !== false; +function isGithubDomain($url) +{ + return stristr(parse_url($url, PHP_URL_HOST), '.github.') !== false; } -function isTumblrDomain($url) { - return stristr(parse_url($url, PHP_URL_HOST), '.tumblr.com') !== false; +function isTumblrDomain($url) +{ + return stristr(parse_url($url, PHP_URL_HOST), '.tumblr.com') !== false; } -function detectBloggingSoftware($response) { - $d = new MfParser($response->getBody(1), $response->getEffectiveUrl()); - foreach ($d->query('//meta[@name="generator"]') as $generatorEl) { - if (stristr($generatorEl->getAttribute('content'), 'wordpress') !== false) - return 'wordpress'; - if (stristr($generatorEl->getAttribute('content'), 'mediawiki') !== false) - return 'mediawiki'; - if (stristr($generatorEl->getAttribute('content'), 'idno') !== false) - return 'idno'; - } - - return null; +function detectBloggingSoftware($response) +{ + $d = new MfParser($response->getBody(1), $response->getEffectiveUrl()); + foreach ($d->query('//meta[@name="generator"]') as $generatorEl) { + if (stristr($generatorEl->getAttribute('content'), 'wordpress') !== false) { + return 'wordpress'; + } + if (stristr($generatorEl->getAttribute('content'), 'mediawiki') !== false) { + return 'mediawiki'; + } + if (stristr($generatorEl->getAttribute('content'), 'idno') !== false) { + return 'idno'; + } + } + + return null; } -function datetimeProblem($datetimeStr) { - try { - $dt = new DateTime($datetimeStr); - } catch (Exception $e) { - return "The datetime is not valid ISO-8601."; - } - return false; +function datetimeProblem($datetimeStr) +{ + try { + $dt = new DateTime($datetimeStr); + } catch (Exception $e) { + return "The datetime is not valid ISO-8601."; + } + return false; } // Web server setup // Route static assets from CLI server if (PHP_SAPI === 'cli-server') { - error_reporting(E_ERROR | E_WARNING | E_PARSE); + error_reporting(E_ERROR | E_WARNING | E_PARSE); - if (file_exists(__DIR__ . $_SERVER['REQUEST_URI']) and !is_dir(__DIR__ . $_SERVER['REQUEST_URI'])) { - return false; - } + if (file_exists(__DIR__ . $_SERVER['REQUEST_URI']) and !is_dir(__DIR__ . $_SERVER['REQUEST_URI'])) { + return false; + } } else { - #error_reporting(0); + // error_reporting(0); } $app = new Silex\Application(); -$app->get('/', function () { - return render('index.html', array('composite_view' => true, 'showResult' => false)); -}); - -$app->get('/validate-rel-me/', function (Http\Request $request) { - if (!$request->query->has('url')) { - return render('validate-rel-me.html'); - } else { - ob_start(); - $url = web_address_to_uri($request->query->get('url'), true); - ob_end_clean(); - - $errorResponse = errorResponder('validate-rel-me.html', $url); - - if (empty($url)) - return $errorResponse('Empty URLs lead nowhere'); - - list($relMeUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url); - - if (!$secure) - return $errorResponse("Insecure redirect between {$previous[count($previous)-2]} and {$previous[count($previous)-1]}"); - - list($resp, $err) = httpGet($relMeUrl); - - if ($err) - return $errorResponse(htmlspecialchars($err->getMessage())); - - $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $relMeUrl); - - if (empty($relMeLinks)) - return $errorResponse("No rel=me links could be found!"); - - return crossOriginResponse(render('validate-rel-me.html', array( - 'rels' => $relMeLinks, - 'url' => htmlspecialchars($url), - 'bloggingSoftware' => detectBloggingSoftware($resp) - ))); - } -}); +$app->get( + '/', function () { + return render('index.html', array('composite_view' => true, 'showResult' => false)); + } +); + +$app->get( + '/validate-rel-me/', function (Http\Request $request) { + if (!$request->query->has('url')) { + return render('validate-rel-me.html'); + } else { + ob_start(); + $url = web_address_to_uri($request->query->get('url'), true); + ob_end_clean(); + + $errorResponse = errorResponder('validate-rel-me.html', $url); + + if (empty($url)) { + return $errorResponse('Empty URLs lead nowhere'); + } + + list($relMeUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url); + + if (!$secure) { + return $errorResponse("Insecure redirect between {$previous[count($previous)-2]} and {$previous[count($previous)-1]}"); + } + + list($resp, $err) = httpGet($relMeUrl); + + if ($err) { + return $errorResponse(htmlspecialchars($err->getMessage())); + } + + $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $relMeUrl); + + if (empty($relMeLinks)) { + return $errorResponse("No rel=me links could be found!"); + } + + return crossOriginResponse( + render( + 'validate-rel-me.html', array( + 'rels' => $relMeLinks, + 'url' => htmlspecialchars($url), + 'bloggingSoftware' => detectBloggingSoftware($resp) + ) + ) + ); + } + } +); // TODO: currently this assumes that url2 has been found as an outbound rel-me link // on url1 — that url1 links to url2 is NOT checked // TODO: maybe encapsulate the one-directional checking into a function -$app->get('/rel-me-links/', function (Http\Request $request) { - if (!$request->query->has('url1') or !$request->query->has('url2')) - return crossOriginResponse('Provide both url1 and url2 parameters', 400); - // url1 is me, url2 is external profile page - $url1 = $request->query->get('url1'); - $url2 = $request->query->get('url2'); - - $meUrl = IndieWeb\normaliseUrl($url1); - - list($profileUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url2); - if (!$secure) - return crossOriginResponse("Inbound rel-me URL redirects insecurely" . print_r($previous, true), 400); - - list($resp, $err) = httpGet($profileUrl); - if ($err) - return crossOriginResponse("HTTP error when fetching inbound rel me document URL {$profileUrl}: {$err->getMessage()}", 400); - - $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $profileUrl); - - foreach ($relMeLinks as $inboundRelMeUrl) { - list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $meUrl); - if ($matches and $secure) - return crossOriginResponse('true', 200); - } - - return crossOriginResponse('false', 200); -}); - -# validate that url2 links back to url1 with rel=me -$app->get('/rel-me-check/', function (Http\Request $request) { - if (!$request->query->has('url1') or !$request->query->has('url2')) { - return crossOriginResponse('Provide both url1 and url2 parameters', 400); - } - - $url = IndieWeb\normaliseUrl($request->query->get('url1')); - $is_url_https = ( parse_url($url, PHP_URL_SCHEME) == 'https' ) ? true : false; - - list($inbound_url, $secure, $previous) = IndieWeb\relMeDocumentUrl($request->query->get('url2')); - - list($response, $error) = httpGet($inbound_url); - - $response_array = array( - 'pass' => false, - 'response' => '', - 'status' => $response->getStatusCode(), - 'secure' => null, - ); - - if ($error) { - $response_array['response'] = sprintf('HTTP error when fetching rel-me URL: %s - %s', $inbound_url, $error->getMessage()); - return crossOriginResponse(json_encode($response_array), 200); - } - - $relMeLinks = IndieWeb\relMeLinks($response->getBody(true), $inbound_url); - - foreach ($relMeLinks as $inboundRelMeUrl) { - list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $url); - if ($matches) { - $response_array['pass'] = true; - $response_array['response'] = ( $is_url_https && !$secure ) ? 'link back is to http:// not https://' : 'works perfectly'; - $response_array['secure'] = $secure; - return crossOriginResponse(json_encode($response_array), 200); - } - } - - $response_array['response'] = 'does not link back'; - return crossOriginResponse(json_encode($response_array), 200); -}); +$app->get( + '/rel-me-links/', function (Http\Request $request) { + if (!$request->query->has('url1') or !$request->query->has('url2')) { + return crossOriginResponse('Provide both url1 and url2 parameters', 400); + } + // url1 is me, url2 is external profile page + $url1 = $request->query->get('url1'); + $url2 = $request->query->get('url2'); + + $meUrl = IndieWeb\normaliseUrl($url1); + + list($profileUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url2); + if (!$secure) { + return crossOriginResponse("Inbound rel-me URL redirects insecurely" . print_r($previous, true), 400); + } + + list($resp, $err) = httpGet($profileUrl); + if ($err) { + return crossOriginResponse("HTTP error when fetching inbound rel me document URL {$profileUrl}: {$err->getMessage()}", 400); + } + + $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $profileUrl); + + foreach ($relMeLinks as $inboundRelMeUrl) { + list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $meUrl); + if ($matches and $secure) { + return crossOriginResponse('true', 200); + } + } + + return crossOriginResponse('false', 200); + } +); + +// validate that url2 links back to url1 with rel=me +$app->get( + '/rel-me-check/', function (Http\Request $request) { + if (!$request->query->has('url1') or !$request->query->has('url2')) { + return crossOriginResponse('Provide both url1 and url2 parameters', 400); + } + + $url = IndieWeb\normaliseUrl($request->query->get('url1')); + $is_url_https = ( parse_url($url, PHP_URL_SCHEME) == 'https' ) ? true : false; + + list($inbound_url, $secure, $previous) = IndieWeb\relMeDocumentUrl($request->query->get('url2')); + + list($response, $error) = httpGet($inbound_url); + + $response_array = array( + 'pass' => false, + 'response' => '', + 'status' => $response->getStatusCode(), + 'secure' => null, + ); + + if ($error) { + $response_array['response'] = sprintf('HTTP error when fetching rel-me URL: %s - %s', $inbound_url, $error->getMessage()); + return crossOriginResponse(json_encode($response_array), 200); + } + + $relMeLinks = IndieWeb\relMeLinks($response->getBody(true), $inbound_url); + + foreach ($relMeLinks as $inboundRelMeUrl) { + list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $url); + if ($matches) { + $response_array['pass'] = true; + $response_array['response'] = ( $is_url_https && !$secure ) ? 'link back is to http:// not https://' : 'works perfectly'; + $response_array['secure'] = $secure; + return crossOriginResponse(json_encode($response_array), 200); + } + } + + $response_array['response'] = 'does not link back'; + return crossOriginResponse(json_encode($response_array), 200); + } +); // more forgiving version for the badge showing code; ignores secure -$app->get('/rel-me-links-info/', function (Http\Request $request) { - if (!$request->query->has('url1') or !$request->query->has('url2')) - return crossOriginResponse('Provide both url1 and url2 parameters', 400); - // url1 is me, url2 is external profile page - $url1 = $request->query->get('url1'); - $url2 = $request->query->get('url2'); - - $meUrl = IndieWeb\normaliseUrl($url1); - - list($profileUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url2); - - list($resp, $err) = httpGet($profileUrl); - if ($err) - return crossOriginResponse("HTTP error when fetching inbound rel me document URL {$profileUrl}: {$err->getMessage()}", 400); - - $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $profileUrl); - - foreach ($relMeLinks as $inboundRelMeUrl) { - list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $meUrl); - if ($matches) - return crossOriginResponse('true', 200); - } - - return crossOriginResponse('false', 200); -}); - - -$app->get('/validate-h-card/', function (Http\Request $request) use($app) { - if (!$request->query->has('url')) { - return render('validate-h-card.html', [ - 'showResult' => false, - ]); - } else { - $url = IndieWeb\normaliseUrl($request->query->get('url')); - - # no scheme entered; use http:// and redirect - if (preg_match('#^https?://#', $url) === 0) { - return $app->redirect('/validate-h-card/?url=http://' . $url); - } - - $errorResponse = errorResponder('validate-h-card.html', $url); - - if (empty($url)) { - return $errorResponse('Empty URLs lead nowhere'); - } - - list($mfs, $err) = fetchMf($url); - - if ($err) { - return $errorResponse(htmlspecialchars($err->getMessage())); - } - - $allHCards = Mf2\findMicroformatsByType($mfs, 'h-card'); - $representativeHCard = Mf2\getRepresentativeHCard($mfs, $url); - - return crossOriginResponse( - render( - 'validate-h-card.html', - [ - 'showResult' => true, - 'allHCards' => $allHCards, - 'representativeHCard' => $representativeHCard, - 'url' => htmlspecialchars($url) - ] - ) - ); - } -}); - -$app->get('/validate-h-entry/', function (Http\Request $request) { - if (!$request->query->has('url')) { - return render('validate-h-entry.html'); - } else { - ob_start(); - $url = web_address_to_uri($request->query->get('url'), true); - ob_end_clean(); - $errorResponse = errorResponder('validate-h-entry.html', $url); - - if (empty($url)) - return $errorResponse('Empty URLs lead nowhere!'); - - list($mfs, $err) = fetchMf($url); - - if ($err) - return $errorResponse(htmlspecialchars($err->getMessage())); - - $hEntries = Mf2\findMicroformatsByType($mfs, 'h-entry'); - - if (count($hEntries) > 0) { - $hEntry = $hEntries[0]; - - if (Mf2\hasProp($hEntry, 'in-reply-to')) { - $postType = 'reply'; - } elseif (Mf2\hasProp($hEntry, 'like-of')) { - $postType = 'like'; - } elseif (Mf2\hasProp($hEntry, 'repost-of')) { - $postType = 'repost'; - } else { - $postType = 'post'; - } - - // Determine the state of the post name. - $content = Mf2\hasProp($hEntry, 'content') ? Mf2\getProp($hEntry, 'content') : (isset($hEntry['value']) ? $hEntry['value'] : null); - $parsedName = Mf2\getProp($hEntry, 'name'); - $nameState = null; - if ($content != null and $content != $parsedName) { - $nameState = mb_strlen($parsedName) > mb_strlen($content) ? 'invalid' : 'valid'; - } - } else { - $postType = $hEntry = $nameState = null; - } - - return crossOriginResponse(render('validate-h-entry.html', array( - 'showResult' => true, - 'postType' => $postType, - 'hEntry' => $hEntry, - 'nameState' => $nameState, - 'url' => htmlspecialchars($url) - ))); - } -}); - -$app->get('/send-webmentions/', function (Http\Request $request) { - return render('send-webmentions.html', array( - 'url' => $request->query->get('url', '') - )); -}); - -$app->post('/send-webmentions/', function (Http\Request $request) { - ob_start(); - $url = web_address_to_uri($request->get('url'), true); - ob_end_clean(); - $errorResponse = errorResponder('send-webmentions.html', $url); - - if (empty($url)) - return $errorResponse('Empty URLs lead nowhere!'); - - list($mfs, $err) = fetchMf($url); - if ($err) { - return $errorResponse(htmlspecialchars($err->getMessage())); - } - - $hEntries = Mf2\findMicroformatsByType($mfs, 'h-entry'); - - $mentioner = new MentionClient(); - $numSent = $mentioner->sendMentions($url); - - return crossOriginResponse(render('send-webmentions.html', array( - 'numSent' => $numSent, - 'url' => htmlspecialchars($url), - 'hEntriesFound' => count($hEntries) - ))); -}); +$app->get( + '/rel-me-links-info/', function (Http\Request $request) { + if (!$request->query->has('url1') or !$request->query->has('url2')) { + return crossOriginResponse('Provide both url1 and url2 parameters', 400); + } + // url1 is me, url2 is external profile page + $url1 = $request->query->get('url1'); + $url2 = $request->query->get('url2'); + + $meUrl = IndieWeb\normaliseUrl($url1); + + list($profileUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url2); + + list($resp, $err) = httpGet($profileUrl); + if ($err) { + return crossOriginResponse("HTTP error when fetching inbound rel me document URL {$profileUrl}: {$err->getMessage()}", 400); + } + + $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $profileUrl); + + foreach ($relMeLinks as $inboundRelMeUrl) { + list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $meUrl); + if ($matches) { + return crossOriginResponse('true', 200); + } + } + + return crossOriginResponse('false', 200); + } +); + + +$app->get( + '/validate-h-card/', function (Http\Request $request) use ($app) { + if (!$request->query->has('url')) { + return render( + 'validate-h-card.html', [ + 'showResult' => false, + ] + ); + } else { + $url = IndieWeb\normaliseUrl($request->query->get('url')); + + // no scheme entered; use http:// and redirect + if (preg_match('#^https?://#', $url) === 0) { + return $app->redirect('/validate-h-card/?url=http://' . $url); + } + + $errorResponse = errorResponder('validate-h-card.html', $url); + + if (empty($url)) { + return $errorResponse('Empty URLs lead nowhere'); + } + + list($mfs, $err) = fetchMf($url); + + if ($err) { + return $errorResponse(htmlspecialchars($err->getMessage())); + } + + $allHCards = Mf2\findMicroformatsByType($mfs, 'h-card'); + $representativeHCard = Mf2\getRepresentativeHCard($mfs, $url); + + return crossOriginResponse( + render( + 'validate-h-card.html', + [ + 'showResult' => true, + 'allHCards' => $allHCards, + 'representativeHCard' => $representativeHCard, + 'url' => htmlspecialchars($url) + ] + ) + ); + } + } +); + +$app->get( + '/validate-h-entry/', function (Http\Request $request) { + if (!$request->query->has('url')) { + return render('validate-h-entry.html'); + } else { + ob_start(); + $url = web_address_to_uri($request->query->get('url'), true); + ob_end_clean(); + $errorResponse = errorResponder('validate-h-entry.html', $url); + + if (empty($url)) { + return $errorResponse('Empty URLs lead nowhere!'); + } + + list($mfs, $err) = fetchMf($url); + + if ($err) { + return $errorResponse(htmlspecialchars($err->getMessage())); + } + + $hEntries = Mf2\findMicroformatsByType($mfs, 'h-entry'); + + if (count($hEntries) > 0) { + $hEntry = $hEntries[0]; + + if (Mf2\hasProp($hEntry, 'in-reply-to')) { + $postType = 'reply'; + } elseif (Mf2\hasProp($hEntry, 'like-of')) { + $postType = 'like'; + } elseif (Mf2\hasProp($hEntry, 'repost-of')) { + $postType = 'repost'; + } else { + $postType = 'post'; + } + + // Determine the state of the post name. + $content = Mf2\hasProp($hEntry, 'content') ? Mf2\getProp($hEntry, 'content') : (isset($hEntry['value']) ? $hEntry['value'] : null); + $parsedName = Mf2\getProp($hEntry, 'name'); + $nameState = null; + if ($content != null and $content != $parsedName) { + $nameState = mb_strlen($parsedName) > mb_strlen($content) ? 'invalid' : 'valid'; + } + } else { + $postType = $hEntry = $nameState = null; + } + + return crossOriginResponse( + render( + 'validate-h-entry.html', array( + 'showResult' => true, + 'postType' => $postType, + 'hEntry' => $hEntry, + 'nameState' => $nameState, + 'url' => htmlspecialchars($url) + ) + ) + ); + } + } +); + +$app->get( + '/send-webmentions/', function (Http\Request $request) { + return render( + 'send-webmentions.html', array( + 'url' => $request->query->get('url', '') + ) + ); + } +); + +$app->post( + '/send-webmentions/', function (Http\Request $request) { + ob_start(); + $url = web_address_to_uri($request->get('url'), true); + ob_end_clean(); + $errorResponse = errorResponder('send-webmentions.html', $url); + + if (empty($url)) { + return $errorResponse('Empty URLs lead nowhere!'); + } + + list($mfs, $err) = fetchMf($url); + if ($err) { + return $errorResponse(htmlspecialchars($err->getMessage())); + } + + $hEntries = Mf2\findMicroformatsByType($mfs, 'h-entry'); + + $mentioner = new MentionClient(); + $numSent = $mentioner->sendMentions($url); + + return crossOriginResponse( + render( + 'send-webmentions.html', array( + 'numSent' => $numSent, + 'url' => htmlspecialchars($url), + 'hEntriesFound' => count($hEntries) + ) + ) + ); + } +); $app->run(); From 51aa4744b347eb318edaf81dcc182c169122fa07 Mon Sep 17 00:00:00 2001 From: Joe Crawford Date: Fri, 6 Dec 2024 16:16:33 -0800 Subject: [PATCH 4/6] Should be 7.2 for app engine I believe --- app.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.yaml b/app.yaml index b9db2ee..5d79ffa 100644 --- a/app.yaml +++ b/app.yaml @@ -1,4 +1,4 @@ -runtime: php55 +runtime: php72 api_version: 1 automatic_scaling: max_idle_instances: 1 From 39035830dede1ea99d272cdef731a4d283720308 Mon Sep 17 00:00:00 2001 From: Joe Crawford Date: Fri, 6 Dec 2024 16:26:58 -0800 Subject: [PATCH 5/6] In theory, a badge --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index fb087c6..55b16aa 100644 --- a/README.md +++ b/README.md @@ -22,5 +22,10 @@ How to run your own instance of indiewebify.me for development: All of the interesting stuff is in `/web/index.php` — or at least is until that gets too big and needs moving. +=== + +![workflow](https://github.com/indieweb/indiewebify-me/actions/workflows/ci.yml/badge.svg) + + From f203d6497da598474ef271b7bb001c1f8452f104 Mon Sep 17 00:00:00 2001 From: Joe Crawford Date: Sun, 8 Dec 2024 21:56:07 -0800 Subject: [PATCH 6/6] Additional post-copyedit snifferfix --- templates/validate-h-card.html.php | 360 ++++++++++++++--------------- 1 file changed, 180 insertions(+), 180 deletions(-) diff --git a/templates/validate-h-card.html.php b/templates/validate-h-card.html.php index 50988ba..c9363e4 100644 --- a/templates/validate-h-card.html.php +++ b/templates/validate-h-card.html.php @@ -1,186 +1,186 @@ 'Honorific prefix', - 'given-name' => 'Given (often first) name', - 'additional-name' => 'Other/middle name', - 'family-name' => 'Family (often last) name', - 'sort-string' => 'String to sort by', - 'honorific-suffix' => 'Honorific suffix', - 'nickname' => 'Nickname', - 'email' => 'Email address', - 'logo' => 'Logo', - 'uid' => 'Unique identifier', - 'category' => 'Category/tag', - 'adr' => 'Postal Address', - 'post-office-box' => 'Post Office Box', - 'street-address' => 'Street number and name', - 'extended-address' => 'Extended address', - 'locality' => 'City/town/village', - 'region' => 'State/province/county', - 'postal-code' => 'Postal code', - 'country-name' => 'Country', - 'label' => 'Label', - 'geo' => 'Geo', - 'latitude' => 'Latitude', - 'longitude' => 'Longitude', - 'altitude' => 'Altitude', - 'tel' => 'Telephone', - 'bday' => 'Birth Date', - 'key' => 'Cryptographic public key', - 'org' => 'Organization', - 'job-title' => 'Job title', - 'role' => 'Description of role', - 'impp' => 'Instant Messaging and Presence Protocol', - 'sex' => 'Biological sex', - 'gender-identity' => 'Gender identity', - 'anniversary' => 'Anniversary', - ]; - - # default h-card to show properties for - $hCard = null; -?> + use BarnabyWalters\Mf2; + + $optional_properties = [ + 'honorific-prefix' => 'Honorific prefix', + 'given-name' => 'Given (often first) name', + 'additional-name' => 'Other/middle name', + 'family-name' => 'Family (often last) name', + 'sort-string' => 'String to sort by', + 'honorific-suffix' => 'Honorific suffix', + 'nickname' => 'Nickname', + 'email' => 'Email address', + 'logo' => 'Logo', + 'uid' => 'Unique identifier', + 'category' => 'Category/tag', + 'adr' => 'Postal Address', + 'post-office-box' => 'Post Office Box', + 'street-address' => 'Street number and name', + 'extended-address' => 'Extended address', + 'locality' => 'City/town/village', + 'region' => 'State/province/county', + 'postal-code' => 'Postal code', + 'country-name' => 'Country', + 'label' => 'Label', + 'geo' => 'Geo', + 'latitude' => 'Latitude', + 'longitude' => 'Longitude', + 'altitude' => 'Altitude', + 'tel' => 'Telephone', + 'bday' => 'Birth Date', + 'key' => 'Cryptographic public key', + 'org' => 'Organization', + 'job-title' => 'Job title', + 'role' => 'Description of role', + 'impp' => 'Instant Messaging and Presence Protocol', + 'sex' => 'Biological sex', + 'gender-identity' => 'Gender identity', + 'anniversary' => 'Anniversary', + ]; + + // default h-card to show properties for + $hCard = null; + ?>
-
- -

Publishing on the IndieWeb Level 2

- -

1. Mark up your content with microformats2

- -

Humans can already understand the things you post on your site. By adding a few short class names to your HTML, other people’s software can understand it and use it for things like reply contexts, cross-site comments, event RSVPs, and more.

- -

Check your homepage h-card:

- - -
-
- -
-
- -
-
- - -
-

Something Went Wrong!

-

When fetching , we got this problem:

-

-
- - - -
- - - -

Success!

-

This representative h-card was found on your site:

- - 0): - $hCard = $allHCards[0]; - $intro_phrase = 'An h-card was found on your site! Consider '; - if (count($allHCards) > 1) { - $intro_phrase = 'Multiple h-cards were found on your site! Consider only having one and '; - } - ?> - -

Almost there!

-

marking it up as the representative h-card.

-

To identify the h-card that represents the page, you can:

-
    -
  • Add class="u-url u-uid" on the h-card’s link to
  • -
  • Or: add class="u-url" rel="me" on the h-card’s link to
  • -
-

Here is the first h-card found:

- - - -

No h-cards found

-

No h-cards were found on your site! Adding one can be as simple as this:

- -
<a href="" class="h-card" rel="me">Your Name</a>
- -

You can also add other properties for a more detailed profile — see h-card on the microformats wiki for a full list.

- - - - -
- - - - - -
-

Add a photo!

-

<img class="u-photo" src="…" />

-
- -

- -

URL

- -
    - -
  • - -
- -
-

Add your URLs! <a rel="me" class="u-url">…</a>

-
- - - -

Email

-
    - -
  • - -
- - - -

Note

-

- -
-

Got a brief bio like a Twitter/Instagram bio? Add it to your own h-card as a note property! <p class="p-note">…</p>

-
- - - $label) { - if (Mf2\hasProp($hCard, $name)) { - echo sprintf('

%s

    ', $label); - foreach (Mf2\getPlaintextArray($hCard, $name) as $value) { - echo sprintf('
  • %s
  • ', $value); - } - echo '
'; - } - } - ?> - -

See the full list of h-card properties.

-
- - - $url)) ?> - -
- - - Want to be able to use h-card data in your code? Check out the open-source implementations. - - -
-

Previous Step | Home | Next Step

- - -
+
+ +

Publishing on the IndieWeb Level 2

+ +

1. Mark up your content with microformats2

+ +

Humans can already understand the things you post on your site. By adding a few short class names to your HTML, other people’s software can understand it and use it for things like reply contexts, cross-site comments, event RSVPs, and more.

+ +

Check your homepage h-card:

+ + +
+
+ +
+
+ +
+
+ + +
+

Something Went Wrong!

+

When fetching , we got this problem:

+

+
+ + + +
+ + + +

Success!

+

This representative h-card was found on your site:

+ + 0) : + $hCard = $allHCards[0]; + $intro_phrase = 'An h-card was found on your site! Consider '; + if (count($allHCards) > 1) { + $intro_phrase = 'Multiple h-cards were found on your site! Consider only having one and '; + } + ?> + +

Almost there!

+

marking it up as the representative h-card.

+

To identify the h-card that represents the page, you can:

+
    +
  • Add class="u-url u-uid" on the h-card’s link to
  • +
  • Or: add class="u-url" rel="me" on the h-card’s link to
  • +
+

Here is the first h-card found:

+ + + +

No h-cards found

+

No h-cards were found on your site! Adding one can be as simple as this:

+ +
<a href="" class="h-card" rel="me">Your Name</a>
+ +

You can also add other properties for a more detailed profile — see h-card on the microformats wiki for a full list.

+ + + + +
+ + + + + +
+

Add a photo!

+

<img class="u-photo" src="…" />

+
+ +

+ +

URL

+ +
    + +
  • + +
+ +
+

Add your URLs! <a rel="me" class="u-url">…</a>

+
+ + + +

Email

+
    + +
  • + +
+ + + +

Note

+

+ +
+

Got a brief bio like a Twitter/Instagram bio? Add it to your own h-card as a note property! <p class="p-note">…</p>

+
+ + + $label) { + if (Mf2\hasProp($hCard, $name)) { + echo sprintf('

%s

    ', $label); + foreach (Mf2\getPlaintextArray($hCard, $name) as $value) { + echo sprintf('
  • %s
  • ', $value); + } + echo '
'; + } + } + ?> + +

See the full list of h-card properties.

+
+ + + $url)) ?> + +
+ + + Want to be able to use h-card data in your code? Check out the open-source implementations. + + +
+

Previous Step | Home | Next Step

+ + +