From 59c605dc4bacd27e5215b76eab77856d5f9c39f0 Mon Sep 17 00:00:00 2001 From: Oleg Zinchenko <1cdecoder@gmail.com> Date: Mon, 17 Aug 2015 01:05:21 +0300 Subject: [PATCH 01/80] updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index dfe1502f..fdc674db 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,8 @@ Here is an example of a simple HTTP server listening on port 1337: ```php Date: Thu, 22 Dec 2016 15:15:40 +0100 Subject: [PATCH 02/80] Remove non-functional CodeClimate badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dfe1502f..10aacea8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Event-driven, non-blocking I/O with PHP. -[![Build Status](https://secure.travis-ci.org/reactphp/react.png?branch=master)](http://travis-ci.org/reactphp/react) [![Code Climate](https://codeclimate.com/github/reactphp.svg)](https://codeclimate.com/github/reactphp) +[![Build Status](https://secure.travis-ci.org/reactphp/react.png?branch=master)](http://travis-ci.org/reactphp/react) ### Notice - (May 25th, 2014) From 365d3ca82705777ab61c0ec2983a572d0434556e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 27 Dec 2016 09:23:25 +0100 Subject: [PATCH 03/80] Update tests to support updated deps which use PSR-4 for tests --- composer.json | 6 +- composer.lock | 1066 +++++++++++++++++++++++++++++++------------ phpunit.xml.dist | 2 +- tests/bootstrap.php | 17 + 4 files changed, 807 insertions(+), 284 deletions(-) diff --git a/composer.json b/composer.json index cbdee523..b4816ddd 100644 --- a/composer.json +++ b/composer.json @@ -16,12 +16,14 @@ "react/http-client": "0.4.*", "react/http": "0.4.*", "react/promise": "~2.1", - "react/socket-client": "0.4.*", + "react/socket-client": "^0.5.3", "react/socket": "0.4.*", "react/stream": "0.4.*" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "~4.0", + "clue/block-react": "^1.1", + "clue/stream-filter": "^1.3" }, "suggest": { "ext-libevent": "Allows for use of a more performant event-loop implementation.", diff --git a/composer.lock b/composer.lock index d4e2496b..ca6a15fd 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,11 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "4f42a5c687c75d76ed0d9a4d167ed8ab", + "hash": "a179da9e35548a884ec322cb78dcc284", + "content-hash": "1d0747f47e8c5d36fed822c807225c0e", "packages": [ { "name": "evenement/evenement", @@ -53,76 +54,135 @@ "time": "2012-11-02 14:49:47" }, { - "name": "guzzle/parser", - "version": "v3.9.2", - "target-dir": "Guzzle/Parser", + "name": "guzzlehttp/psr7", + "version": "1.3.1", "source": { "type": "git", - "url": "https://github.com/guzzle/parser.git", - "reference": "6874d171318a8e93eb6d224cf85e4678490b625c" + "url": "https://github.com/guzzle/psr7.git", + "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/parser/zipball/6874d171318a8e93eb6d224cf85e4678490b625c", - "reference": "6874d171318a8e93eb6d224cf85e4678490b625c", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/5c6447c9df362e8f8093bda8f5d8873fe5c7f65b", + "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.7-dev" + "dev-master": "1.4-dev" } }, "autoload": { - "psr-0": { - "Guzzle\\Parser": "" - } + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Interchangeable parsers used by Guzzle", - "homepage": "http://guzzlephp.org/", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", "keywords": [ - "URI Template", - "cookie", "http", "message", - "url" + "stream", + "uri" ], - "time": "2014-02-05 18:29:46" + "time": "2016-06-24 23:00:38" }, { - "name": "react/cache", - "version": "v0.4.0", + "name": "psr/http-message", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "9882ab5d8b00617baae83c6996f5a34668c11beb" + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/9882ab5d8b00617baae83c6996f5a34668c11beb", - "reference": "9882ab5d8b00617baae83c6996f5a34668c11beb", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { - "php": ">=5.4.0", - "react/promise": "~2.0" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.4-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "React\\Cache\\": "" + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06 14:39:51" + }, + { + "name": "react/cache", + "version": "v0.4.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "558f614891341b1d817a8cdf9a358948ec49638f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/558f614891341b1d817a8cdf9a358948ec49638f", + "reference": "558f614891341b1d817a8cdf9a358948ec49638f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "~2.0|~1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src\\" } }, "notification-url": "https://packagist.org/downloads/", @@ -133,37 +193,35 @@ "keywords": [ "cache" ], - "time": "2014-02-02 01:11:26" + "time": "2016-02-25 18:17:16" }, { "name": "react/child-process", - "version": "v0.4.0", + "version": "v0.4.1", "source": { "type": "git", "url": "https://github.com/reactphp/child-process.git", - "reference": "8bf211533bcbb2034e00528a47400367570dc3d7" + "reference": "3ab4f83c6f6c5862f7ca28d999a92d327472a671" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/8bf211533bcbb2034e00528a47400367570dc3d7", - "reference": "8bf211533bcbb2034e00528a47400367570dc3d7", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/3ab4f83c6f6c5862f7ca28d999a92d327472a671", + "reference": "3ab4f83c6f6c5862f7ca28d999a92d327472a671", "shasum": "" }, "require": { "evenement/evenement": "~2.0", "php": ">=5.4.0", "react/event-loop": "0.4.*", - "react/stream": "0.4.*" + "react/stream": "~0.4.2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" - } + "require-dev": { + "sebastian/environment": "~1.0" }, + "type": "library", "autoload": { "psr-4": { - "React\\ChildProcess\\": "" + "React\\ChildProcess\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -174,37 +232,32 @@ "keywords": [ "process" ], - "time": "2014-02-02 01:11:26" + "time": "2016-08-01 18:09:48" }, { "name": "react/dns", - "version": "v0.4.1", + "version": "v0.4.3", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", - "reference": "8c5ccc35dcb4b06b70eb9201842363fac7b0f3cf" + "reference": "751b3129556e04944f164e3556a20ca6e201e459" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/8c5ccc35dcb4b06b70eb9201842363fac7b0f3cf", - "reference": "8c5ccc35dcb4b06b70eb9201842363fac7b0f3cf", + "url": "https://api.github.com/repos/reactphp/dns/zipball/751b3129556e04944f164e3556a20ca6e201e459", + "reference": "751b3129556e04944f164e3556a20ca6e201e459", "shasum": "" }, "require": { - "php": ">=5.4.0", - "react/cache": "0.4.*", - "react/promise": "~2.0", - "react/socket": "0.4.*" + "php": ">=5.3.0", + "react/cache": "~0.4.0|~0.3.0", + "react/promise": "~2.1|~1.2", + "react/socket": "~0.4.0|~0.3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" - } - }, "autoload": { "psr-4": { - "React\\Dns\\": "" + "React\\Dns\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -216,20 +269,20 @@ "dns", "dns-resolver" ], - "time": "2014-04-12 14:09:10" + "time": "2016-08-01 10:09:07" }, { "name": "react/event-loop", - "version": "v0.4.1", + "version": "v0.4.2", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "18c5297087ca01de85518e2b55078f444144aa1b" + "reference": "164799f73175e1c80bba92a220ea35df6ca371dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/18c5297087ca01de85518e2b55078f444144aa1b", - "reference": "18c5297087ca01de85518e2b55078f444144aa1b", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/164799f73175e1c80bba92a220ea35df6ca371dd", + "reference": "164799f73175e1c80bba92a220ea35df6ca371dd", "shasum": "" }, "require": { @@ -243,12 +296,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.4-dev" + "dev-master": "0.5-dev" } }, "autoload": { "psr-4": { - "React\\EventLoop\\": "" + "React\\EventLoop\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -257,38 +310,36 @@ ], "description": "Event loop abstraction layer that libraries can use for evented I/O.", "keywords": [ + "asynchronous", "event-loop" ], - "time": "2014-02-26 17:36:58" + "time": "2016-03-08 02:09:32" }, { "name": "react/http", - "version": "v0.4.0", + "version": "v0.4.2", "source": { "type": "git", "url": "https://github.com/reactphp/http.git", - "reference": "7b9d293b7a3f73acd840a341497e267d8562d637" + "reference": "abedac54967d7ea237ad104cff8274e2c4077cf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/7b9d293b7a3f73acd840a341497e267d8562d637", - "reference": "7b9d293b7a3f73acd840a341497e267d8562d637", + "url": "https://api.github.com/repos/reactphp/http/zipball/abedac54967d7ea237ad104cff8274e2c4077cf4", + "reference": "abedac54967d7ea237ad104cff8274e2c4077cf4", "shasum": "" }, "require": { - "guzzle/parser": "~3.0", + "evenement/evenement": "^2.0", + "guzzlehttp/psr7": "^1.0", "php": ">=5.4.0", - "react/socket": "0.4.*" + "react/socket": "^0.4", + "react/stream": "^0.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" - } - }, "autoload": { "psr-4": { - "React\\Http\\": "" + "React\\Http\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -299,37 +350,33 @@ "keywords": [ "http" ], - "time": "2014-02-02 01:11:26" + "time": "2016-11-09 15:20:39" }, { "name": "react/http-client", - "version": "v0.4.1", + "version": "v0.4.15", "source": { "type": "git", "url": "https://github.com/reactphp/http-client.git", - "reference": "9f5e634351ad7f82431afa0568798ad99ec20034" + "reference": "01e919008363622334f91419a9908b3a51754ccd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http-client/zipball/9f5e634351ad7f82431afa0568798ad99ec20034", - "reference": "9f5e634351ad7f82431afa0568798ad99ec20034", + "url": "https://api.github.com/repos/reactphp/http-client/zipball/01e919008363622334f91419a9908b3a51754ccd", + "reference": "01e919008363622334f91419a9908b3a51754ccd", "shasum": "" }, "require": { "evenement/evenement": "~2.0", - "guzzle/parser": "~3.0", + "guzzlehttp/psr7": "^1.0", "php": ">=5.4.0", "react/dns": "0.4.*", "react/event-loop": "0.4.*", - "react/socket-client": "0.4.*", + "react/promise": "~2.2", + "react/socket-client": "^0.5 || ^0.4 || ^0.3", "react/stream": "0.4.*" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.5-dev" - } - }, "autoload": { "psr-4": { "React\\HttpClient\\": "src" @@ -343,37 +390,32 @@ "keywords": [ "http" ], - "time": "2014-11-23 15:04:25" + "time": "2016-12-02 10:17:42" }, { "name": "react/promise", - "version": "v2.1.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "937b04f1b0ee8f6d180e75a0830aac778ca4bcd6" + "reference": "2760f3898b7e931aa71153852dcd48a75c9b95db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/937b04f1b0ee8f6d180e75a0830aac778ca4bcd6", - "reference": "937b04f1b0ee8f6d180e75a0830aac778ca4bcd6", + "url": "https://api.github.com/repos/reactphp/promise/zipball/2760f3898b7e931aa71153852dcd48a75c9b95db", + "reference": "2760f3898b7e931aa71153852dcd48a75c9b95db", "shasum": "" }, "require": { "php": ">=5.4.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, "autoload": { "psr-4": { "React\\Promise\\": "src/" }, "files": [ - "src/functions.php" + "src/functions_include.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -383,38 +425,87 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@googlemail.com" + "email": "jsorgalla@gmail.com" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "time": "2014-10-15 20:05:57" + "keywords": [ + "promise", + "promises" + ], + "time": "2016-12-22 14:09:01" }, { - "name": "react/socket", - "version": "v0.4.2", + "name": "react/promise-timer", + "version": "v1.1.1", "source": { "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "a6acf405ca53fc6cfbfe7c77778ededff46aa7cc" + "url": "https://github.com/reactphp/promise-timer.git", + "reference": "ddedc67bfd7f579fc83e66ff67e3564b179297dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/a6acf405ca53fc6cfbfe7c77778ededff46aa7cc", - "reference": "a6acf405ca53fc6cfbfe7c77778ededff46aa7cc", + "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/ddedc67bfd7f579fc83e66ff67e3564b179297dd", + "reference": "ddedc67bfd7f579fc83e66ff67e3564b179297dd", "shasum": "" }, "require": { - "evenement/evenement": "~2.0", - "php": ">=5.4.0", - "react/event-loop": "0.4.*", - "react/stream": "0.4.*" + "php": ">=5.3", + "react/event-loop": "~0.4.0|~0.3.0", + "react/promise": "~2.1|~1.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" + "autoload": { + "psr-4": { + "React\\Promise\\Timer\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" } + ], + "description": "Trivial timeout implementation for Promises", + "homepage": "https://github.com/react/promise-timer", + "keywords": [ + "async", + "event-loop", + "promise", + "reactphp", + "timeout", + "timer" + ], + "time": "2016-12-27 08:12:19" + }, + { + "name": "react/socket", + "version": "v0.4.4", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "d61930e1aefb2a704b0adbe6bb97ee4a835d6a96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/d61930e1aefb2a704b0adbe6bb97ee4a835d6a96", + "reference": "d61930e1aefb2a704b0adbe6bb97ee4a835d6a96", + "shasum": "" }, + "require": { + "evenement/evenement": "~2.0|~1.0", + "php": ">=5.3.0", + "react/event-loop": "0.4.*|0.3.*", + "react/stream": "^0.4.2" + }, + "type": "library", "autoload": { "psr-4": { "React\\Socket\\": "src" @@ -428,35 +519,34 @@ "keywords": [ "Socket" ], - "time": "2014-05-25 17:02:16" + "time": "2016-12-19 22:52:38" }, { "name": "react/socket-client", - "version": "v0.4.2", + "version": "v0.5.3", "source": { "type": "git", "url": "https://github.com/reactphp/socket-client.git", - "reference": "5b4ccbb9071f81280f20971cccd2abe980d027ca" + "reference": "5570838d436f056695e9a5eaf01dd5f80386dd26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket-client/zipball/5b4ccbb9071f81280f20971cccd2abe980d027ca", - "reference": "5b4ccbb9071f81280f20971cccd2abe980d027ca", + "url": "https://api.github.com/repos/reactphp/socket-client/zipball/5570838d436f056695e9a5eaf01dd5f80386dd26", + "reference": "5570838d436f056695e9a5eaf01dd5f80386dd26", "shasum": "" }, "require": { - "php": ">=5.4.0", - "react/dns": "0.4.*", - "react/event-loop": "0.4.*", - "react/promise": "~2.0", - "react/stream": "0.4.*" + "php": ">=5.3.0", + "react/dns": "0.4.*|0.3.*", + "react/event-loop": "0.4.*|0.3.*", + "react/promise": "^2.1 || ^1.2", + "react/promise-timer": "~1.0", + "react/stream": "^0.4.5" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" - } + "require-dev": { + "clue/block-react": "^1.1" }, + "type": "library", "autoload": { "psr-4": { "React\\SocketClient\\": "src" @@ -470,40 +560,36 @@ "keywords": [ "Socket" ], - "time": "2014-10-16 22:23:10" + "time": "2016-12-24 11:19:15" }, { "name": "react/stream", - "version": "v0.4.2", + "version": "v0.4.5", "source": { "type": "git", "url": "https://github.com/reactphp/stream.git", - "reference": "acc7a5fec02e0aea674560e1d13c40ed0c8c5465" + "reference": "23389503012e1ab721ad498a5a1f4b39f7a43c00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/acc7a5fec02e0aea674560e1d13c40ed0c8c5465", - "reference": "acc7a5fec02e0aea674560e1d13c40ed0c8c5465", + "url": "https://api.github.com/repos/reactphp/stream/zipball/23389503012e1ab721ad498a5a1f4b39f7a43c00", + "reference": "23389503012e1ab721ad498a5a1f4b39f7a43c00", "shasum": "" }, "require": { - "evenement/evenement": "~2.0", - "php": ">=5.4.0" + "evenement/evenement": "^2.0|^1.0", + "php": ">=5.3.8" }, "require-dev": { - "react/event-loop": "0.4.*", - "react/promise": "~2.0" + "clue/stream-filter": "~1.2", + "react/event-loop": "^0.4|^0.3", + "react/promise": "^2.0|^1.0" }, "suggest": { - "react/event-loop": "0.4.*", - "react/promise": "~2.0" + "react/event-loop": "^0.4", + "react/promise": "^2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.5-dev" - } - }, "autoload": { "psr-4": { "React\\Stream\\": "src" @@ -518,22 +604,119 @@ "pipe", "stream" ], - "time": "2014-09-10 03:32:31" + "time": "2016-11-13 17:06:02" } ], "packages-dev": [ + { + "name": "clue/block-react", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/clue/php-block-react.git", + "reference": "ed70f8d497dd265e30bc7dd19cf86b2e149b1ecf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-block-react/zipball/ed70f8d497dd265e30bc7dd19cf86b2e149b1ecf", + "reference": "ed70f8d497dd265e30bc7dd19cf86b2e149b1ecf", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/event-loop": "0.4.*|0.3.*", + "react/promise": "~2.1|~1.2", + "react/promise-timer": "~1.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "Integrate async React PHP components into your blocking environment", + "homepage": "https://github.com/clue/php-block-react", + "keywords": [ + "async", + "blocking", + "event loop", + "promise", + "reactphp", + "synchronous" + ], + "time": "2016-03-09 15:10:22" + }, + { + "name": "clue/stream-filter", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/php-stream-filter.git", + "reference": "e3bf9415da163d9ad6701dccb407ed501ae69785" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-stream-filter/zipball/e3bf9415da163d9ad6701dccb407ed501ae69785", + "reference": "e3bf9415da163d9ad6701dccb407ed501ae69785", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "time": "2015-11-08 23:41:30" + }, { "name": "doctrine/instantiator", - "version": "1.0.4", + "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", "shasum": "" }, "require": { @@ -544,7 +727,7 @@ "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "2.0.*@ALPHA" + "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { @@ -553,8 +736,8 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\Instantiator\\": "src" + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -574,20 +757,229 @@ "constructor", "instantiate" ], - "time": "2014-10-13 12:58:55" + "time": "2015-06-14 21:17:01" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org/", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2015-12-27 11:43:31" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2016-09-30 07:12:33" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.2.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2016-11-25 06:54:22" + }, + { + "name": "phpspec/prophecy", + "version": "v1.6.2", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "6c52c2722f8460122f96f86346600e1077ce22cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb", + "reference": "6c52c2722f8460122f96f86346600e1077ce22cb", + "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|^2.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.0", + "phpunit/phpunit": "^4.8 || ^5.6.5" + }, + "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-11-21 14:58:47" }, { "name": "phpunit/php-code-coverage", - "version": "2.0.13", + "version": "2.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5" + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5", - "reference": "0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", "shasum": "" }, "require": { @@ -595,12 +987,12 @@ "phpunit/php-file-iterator": "~1.3", "phpunit/php-text-template": "~1.2", "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "~1.0", + "sebastian/environment": "^1.3.2", "sebastian/version": "~1.0" }, "require-dev": { "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4.1" + "phpunit/phpunit": "~4" }, "suggest": { "ext-dom": "*", @@ -610,7 +1002,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.2.x-dev" } }, "autoload": { @@ -619,9 +1011,6 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -639,35 +1028,37 @@ "testing", "xunit" ], - "time": "2014-12-03 06:41:44" + "time": "2015-10-06 15:47:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.3.4", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", - "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, "autoload": { "classmap": [ - "File/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -684,20 +1075,20 @@ "filesystem", "iterator" ], - "time": "2013-10-10 15:34:57" + "time": "2016-10-03 07:40:28" }, { "name": "phpunit/php-text-template", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", - "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "shasum": "" }, "require": { @@ -706,20 +1097,17 @@ "type": "library", "autoload": { "classmap": [ - "Text/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -728,35 +1116,35 @@ "keywords": [ "template" ], - "time": "2014-01-30 17:20:04" + "time": "2015-06-21 13:50:34" }, { "name": "phpunit/php-timer", - "version": "1.0.5", + "version": "1.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "require-dev": { + "phpunit/phpunit": "~4|~5" + }, "type": "library", "autoload": { "classmap": [ - "PHP/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -772,20 +1160,20 @@ "keywords": [ "timer" ], - "time": "2013-08-02 07:42:54" + "time": "2016-05-12 18:03:57" }, { "name": "phpunit/php-token-stream", - "version": "1.3.0", + "version": "1.4.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "f8d5d08c56de5cfd592b3340424a81733259a876" + "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/f8d5d08c56de5cfd592b3340424a81733259a876", - "reference": "f8d5d08c56de5cfd592b3340424a81733259a876", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b", + "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b", "shasum": "" }, "require": { @@ -798,7 +1186,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -821,20 +1209,20 @@ "keywords": [ "tokenizer" ], - "time": "2014-08-31 06:12:13" + "time": "2016-11-15 14:06:22" }, { "name": "phpunit/phpunit", - "version": "4.4.0", + "version": "4.8.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bbe7bcb83b6ec1a9eaabbe1b70d4795027c53ee0" + "reference": "98b2b39a520766bec663ff5b7ff1b729db9dbfe3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bbe7bcb83b6ec1a9eaabbe1b70d4795027c53ee0", - "reference": "bbe7bcb83b6ec1a9eaabbe1b70d4795027c53ee0", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/98b2b39a520766bec663ff5b7ff1b729db9dbfe3", + "reference": "98b2b39a520766bec663ff5b7ff1b729db9dbfe3", "shasum": "" }, "require": { @@ -844,18 +1232,19 @@ "ext-reflection": "*", "ext-spl": "*", "php": ">=5.3.3", - "phpunit/php-code-coverage": "~2.0", - "phpunit/php-file-iterator": "~1.3.2", + "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.2", + "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.0", - "sebastian/diff": "~1.1", - "sebastian/environment": "~1.1", - "sebastian/exporter": "~1.0", + "sebastian/comparator": "~1.2.2", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", "sebastian/global-state": "~1.0", "sebastian/version": "~1.0", - "symfony/yaml": "~2.0" + "symfony/yaml": "~2.1|~3.0" }, "suggest": { "phpunit/php-invoker": "~1.1" @@ -866,7 +1255,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4.x-dev" + "dev-master": "4.8.x-dev" } }, "autoload": { @@ -892,29 +1281,30 @@ "testing", "xunit" ], - "time": "2014-12-05 06:49:03" + "time": "2016-12-09 02:45:31" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.0", + "version": "2.3.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "c63d2367247365f688544f0d500af90a11a44c65" + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/c63d2367247365f688544f0d500af90a11a44c65", - "reference": "c63d2367247365f688544f0d500af90a11a44c65", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", "shasum": "" }, "require": { - "doctrine/instantiator": "~1.0,>=1.0.1", + "doctrine/instantiator": "^1.0.2", "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2" + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" }, "require-dev": { - "phpunit/phpunit": "~4.3" + "phpunit/phpunit": "~4.4" }, "suggest": { "ext-soap": "*" @@ -947,34 +1337,34 @@ "mock", "xunit" ], - "time": "2014-10-03 05:12:11" + "time": "2015-10-02 06:51:40" }, { "name": "sebastian/comparator", - "version": "1.1.0", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "c484a80f97573ab934e37826dba0135a3301b26a" + "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c484a80f97573ab934e37826dba0135a3301b26a", - "reference": "c484a80f97573ab934e37826dba0135a3301b26a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", + "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", "shasum": "" }, "require": { "php": ">=5.3.3", - "sebastian/diff": "~1.1", - "sebastian/exporter": "~1.0" + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" }, "require-dev": { - "phpunit/phpunit": "~4.1" + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -1011,32 +1401,32 @@ "compare", "equality" ], - "time": "2014-11-16 21:32:38" + "time": "2016-11-19 09:18:40" }, { "name": "sebastian/diff", - "version": "1.2.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "5843509fed39dee4b356a306401e9dd1a931fec7" + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5843509fed39dee4b356a306401e9dd1a931fec7", - "reference": "5843509fed39dee4b356a306401e9dd1a931fec7", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "~4.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -1059,36 +1449,36 @@ } ], "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff" ], - "time": "2014-08-15 10:29:00" + "time": "2015-12-08 07:14:41" }, { "name": "sebastian/environment", - "version": "1.2.1", + "version": "1.3.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7" + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7", - "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.3" + "phpunit/phpunit": "^4.8 || ^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -1113,32 +1503,34 @@ "environment", "hhvm" ], - "time": "2014-10-25 08:00:45" + "time": "2016-08-18 05:49:44" }, { "name": "sebastian/exporter", - "version": "1.0.2", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0" + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", - "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -1178,20 +1570,20 @@ "export", "exporter" ], - "time": "2014-09-10 00:51:36" + "time": "2016-06-17 09:04:28" }, { "name": "sebastian/global-state", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", - "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", "shasum": "" }, "require": { @@ -1229,20 +1621,73 @@ "keywords": [ "global state" ], - "time": "2014-10-06 09:23:50" + "time": "2015-10-12 03:26:01" + }, + { + "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-11 19:50:13" }, { "name": "sebastian/version", - "version": "1.0.3", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43" + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", - "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", "shasum": "" }, "type": "library", @@ -1264,60 +1709,119 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2014-03-07 15:35:33" + "time": "2015-06-21 13:59:46" }, { "name": "symfony/yaml", - "version": "v2.6.1", - "target-dir": "Symfony/Component/Yaml", + "version": "v3.2.1", "source": { "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "3346fc090a3eb6b53d408db2903b241af51dcb20" + "url": "https://github.com/symfony/yaml.git", + "reference": "a7095af4b97a0955f85c8989106c249fa649011f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/3346fc090a3eb6b53d408db2903b241af51dcb20", - "reference": "3346fc090a3eb6b53d408db2903b241af51dcb20", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a7095af4b97a0955f85c8989106c249fa649011f", + "reference": "a7095af4b97a0955f85c8989106c249fa649011f", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.5.9" + }, + "require-dev": { + "symfony/console": "~2.8|~3.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "3.2-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Yaml\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Yaml Component", - "homepage": "http://symfony.com/", - "time": "2014-12-02 20:19:20" + "homepage": "https://symfony.com/", + "time": "2016-12-10 10:07:06" + }, + { + "name": "webmozart/assert", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2016-11-23 20:04:58" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, + "prefer-lowest": false, "platform": { "php": ">=5.4.0" }, diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e48665f8..d7f645a3 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -19,7 +19,7 @@ - ./src/ + ./vendor/react/*/src/ diff --git a/tests/bootstrap.php b/tests/bootstrap.php index b363791d..6105242b 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,5 +1,22 @@ $paths) { + foreach ((array)$paths as $path) { + $autoload->addPsr4($namespace, $base . trim($path, '\\/')); + } + } + } +} + +// load all legacy test bootstrap scripts from React's components foreach (glob(__DIR__ . '/../vendor/react/*/tests/bootstrap.php') as $b) { include $b; } From 6fa7225a76d38d0ed8dc26aa11f20925695defc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 27 Dec 2016 09:30:25 +0100 Subject: [PATCH 04/80] Locks deps to lowest PHP version currently supported --- composer.json | 5 ++ composer.lock | 204 +++++++------------------------------------------- 2 files changed, 32 insertions(+), 177 deletions(-) diff --git a/composer.json b/composer.json index b4816ddd..686523b8 100644 --- a/composer.json +++ b/composer.json @@ -34,5 +34,10 @@ "branch-alias": { "dev-master": "0.5-dev" } + }, + "config": { + "platform": { + "php": "5.4" + } } } diff --git a/composer.lock b/composer.lock index ca6a15fd..1fa818aa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "a179da9e35548a884ec322cb78dcc284", - "content-hash": "1d0747f47e8c5d36fed822c807225c0e", + "hash": "e8553796809bcd1f49aba4ccc2dc8088", + "content-hash": "b23752d99957e709b5dffd1700eb660f", "packages": [ { "name": "evenement/evenement", @@ -759,136 +759,39 @@ ], "time": "2015-06-14 21:17:01" }, - { - "name": "phpdocumentor/reflection-common", - "version": "1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org/", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2015-12-27 11:43:31" - }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.1.1", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", - "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", "shasum": "" }, "require": { - "php": ">=5.5", - "phpdocumentor/reflection-common": "^1.0@dev", - "phpdocumentor/type-resolver": "^0.2.0", - "webmozart/assert": "^1.0" + "php": ">=5.3.3" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2016-09-30 07:12:33" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "0.2.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", - "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", - "shasum": "" - }, - "require": { - "php": ">=5.5", - "phpdocumentor/reflection-common": "^1.0" + "phpunit/phpunit": "~4.0" }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ + "psr-0": { + "phpDocumentor": [ "src/" ] } @@ -900,10 +803,10 @@ "authors": [ { "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "email": "mike.vanriel@naenius.com" } ], - "time": "2016-11-25 06:54:22" + "time": "2015-02-03 12:10:50" }, { "name": "phpspec/prophecy", @@ -1713,31 +1616,25 @@ }, { "name": "symfony/yaml", - "version": "v3.2.1", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "a7095af4b97a0955f85c8989106c249fa649011f" + "reference": "befb26a3713c97af90d25dd12e75621ef14d91ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/a7095af4b97a0955f85c8989106c249fa649011f", - "reference": "a7095af4b97a0955f85c8989106c249fa649011f", + "url": "https://api.github.com/repos/symfony/yaml/zipball/befb26a3713c97af90d25dd12e75621ef14d91ff", + "reference": "befb26a3713c97af90d25dd12e75621ef14d91ff", "shasum": "" }, "require": { - "php": ">=5.5.9" - }, - "require-dev": { - "symfony/console": "~2.8|~3.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "php": ">=5.3.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "2.8-dev" } }, "autoload": { @@ -1764,57 +1661,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com/", - "time": "2016-12-10 10:07:06" - }, - { - "name": "webmozart/assert", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2016-11-23 20:04:58" + "time": "2016-11-14 16:15:57" } ], "aliases": [], @@ -1825,5 +1672,8 @@ "platform": { "php": ">=5.4.0" }, - "platform-dev": [] + "platform-dev": [], + "platform-overrides": { + "php": "5.4" + } } From b43e9d266d1f3e5ce7da63831dc1ad912c2bb433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 30 Jun 2017 14:35:11 +0200 Subject: [PATCH 05/80] Add "getting started" and promote installing individual components --- README.md | 47 +++++++++++++---------------------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 0f84f6af..2c9ff6d6 100644 --- a/README.md +++ b/README.md @@ -7,17 +7,8 @@ Event-driven, non-blocking I/O with PHP. ### Notice - (May 25th, 2014) As of 2014-05-25 we have reversed roles of this and the component repositories. -Instead of reactphp/react being the master code repository it is now the sum of React's parts. +Instead of reactphp/react being the master code repository it is now the sum of React's components. All PRs should be made against their corresponding repository found in [/reactphp](https://github.com/reactphp). -All existing PRs will be evaluated and work will be done with the submitter to merge it into the proper component. - -## Install - -The recommended way to install React is [through composer](http://getcomposer.org). Type the following command in your shell environment: - -``` -php ~/composer.phar require react/react -``` ## What is it? @@ -56,36 +47,24 @@ manageable. You should use these abstractions whenever you can. -## Usage - -Here is an example of a simple HTTP server listening on port 1337: -```php - 'text/plain'); - - $response->writeHead(200, $headers); - $response->end($text); -}; - -$loop = React\EventLoop\Factory::create(); -$socket = new React\Socket\Server($loop); -$http = new React\Http\Server($socket); - -$http->on('request', $app); - -$socket->listen(1337); -$loop->run(); +```bash +$ composer require react/event-loop react/http ``` +For more details, check out [React's homepage](http://reactphp.org) for +quickstart examples and usage details. + ## Documentation Superficial documentation can be found in the README files of the individual From 1d1f8db8fd4ac63b9112753252b34d0606f15345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 17 Oct 2017 12:02:47 +0200 Subject: [PATCH 06/80] Update docs to emphasize ReactPHP consists of individual components --- README.md | 68 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 2c9ff6d6..3f94fc73 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,6 @@ Event-driven, non-blocking I/O with PHP. [![Build Status](https://secure.travis-ci.org/reactphp/react.png?branch=master)](http://travis-ci.org/reactphp/react) -### Notice - (May 25th, 2014) - -As of 2014-05-25 we have reversed roles of this and the component repositories. -Instead of reactphp/react being the master code repository it is now the sum of React's components. -All PRs should be made against their corresponding repository found in [/reactphp](https://github.com/reactphp). - -## What is it? - React is a low-level library for event-driven programming in PHP. At its core is an event loop, on top of which it provides low-level utilities, such as: Streams abstraction, async dns resolver, network client/server, http @@ -30,22 +22,58 @@ Node.js (V8). React is non-blocking by default. Use workers for blocking I/O. -## High-level abstractions +## Core Components + +* **EventLoop** + ReactPHP's core reactor event-loop. + [Read the documentation](https://github.com/reactphp/event-loop) + +* **Stream** + Event-driven readable and writable streams for non-blocking I/O in ReactPHP. + [Read the documentation](https://github.com/reactphp/stream) + +* **Promise** + Promises/A implementation for PHP. + [Read the documentation](https://github.com/reactphp/promise) + + +## Network Components + +* **Socket** + Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP. + [Read the documentation](https://github.com/reactphp/socket) + +* **Datagram** + Event-driven UDP client and server sockets for ReactPHP. + [Read the documentation](https://github.com/reactphp/datagram) + +## Protocol Components + +* **HTTP** + Event-driven, streaming plaintext HTTP and secure HTTPS server for ReactPHP. + [Read the documentation](https://github.com/reactphp/http) + +* **HTTPClient** + Event-driven, streaming HTTP client for ReactPHP. + [Read the documentation](https://github.com/reactphp/http-client) + +* **DNS** + Async DNS resolver for ReactPHP. + [Read the documentation](https://github.com/reactphp/dns) -There are two main abstractions that make dealing with control flow a lot more -manageable. +## Utility Components -* **Stream:** A stream represents an I/O source (ReadableStream) or - destination (WritableStream). These can be used to model pipes, similar - to a unix pipe that is composed of processes. Streams represent very large - values as chunks. +* **Cache** + Async caching for ReactPHP. + [Read the documentation](https://github.com/reactphp/cache) -* **Promise:** A promise represents an eventual return value. Promises can be - composed and are a lot easier to deal with than traditional CPS callback - spaghetti and allow for almost sane error handling. Promises represent the - computation for producing single values. +* **PromiseTimer** + Trivial timeout implementation for ReactPHP's Promise lib. + [Read the documentation](https://github.com/reactphp/promise-timer) -You should use these abstractions whenever you can. +* **ChildProcess** + Library for executing child processes. + [Read the documentation](https://github.com/reactphp/child-process) ## Getting started From fdf16a0d31453155605fa8e19dcf8437ed02e25d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 17 Oct 2017 13:06:24 +0200 Subject: [PATCH 07/80] Simplify test instructions --- .travis.yml | 6 ++++-- README.md | 15 +++++++++++---- {scripts => tests}/travis-init.sh | 0 3 files changed, 15 insertions(+), 6 deletions(-) rename {scripts => tests}/travis-init.sh (100%) diff --git a/.travis.yml b/.travis.yml index a72355b9..cc51a303 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,8 @@ matrix: allow_failures: - php: hhvm -install: ./scripts/travis-init.sh +install: + - ./tests/travis-init.sh -script: php vendor/bin/phpunit --coverage-text +script: + - php vendor/bin/phpunit --coverage-text diff --git a/README.md b/README.md index 2c9ff6d6..d6cf1b51 100644 --- a/README.md +++ b/README.md @@ -77,11 +77,18 @@ Check out #reactphp on irc.freenode.net. Also follow ## Tests -To run the test suite, you need install the dependencies via composer, then -run PHPUnit. +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org): - $ composer install - $ phpunit +```bash +$ composer install +``` + +To run the test suite, go to the project root and run: + +```bash +$ php vendor/bin/phpunit +``` ## License diff --git a/scripts/travis-init.sh b/tests/travis-init.sh similarity index 100% rename from scripts/travis-init.sh rename to tests/travis-init.sh From c10635887248f569aa813387da11770152e2fdac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 17 Oct 2017 13:16:39 +0200 Subject: [PATCH 08/80] Removed outdated benchmarks in favor of EventLoop examples See https://github.com/reactphp/event-loop/tree/master/examples --- benchmark/bench.php | 47 -------------------------------------------- benchmark/timers.php | 32 ------------------------------ 2 files changed, 79 deletions(-) delete mode 100644 benchmark/bench.php delete mode 100644 benchmark/timers.php diff --git a/benchmark/bench.php b/benchmark/bench.php deleted file mode 100644 index 0a21c835..00000000 --- a/benchmark/bench.php +++ /dev/null @@ -1,47 +0,0 @@ -prev = microtime(true); - } - - public function snap() { - $prev = $this->prev; - - $current = microtime(true); - $this->prev = $current; - - return $current - $prev; - } - - public function printSnap($name) { - printf("%-40s: %s s\n", $name, $this->snap()); - } -} - -function benchLoops(array $tests) { - $loops = array( - 'StreamSelectLoop', - 'LibEventLoop', - 'LibEvLoop', - // 'LibUvLoop', - ); - - foreach ($tests as $testName => $test) { - foreach ($loops as $loopName) { - $loopClass = "React\\EventLoop\\$loopName"; - $loop = new $loopClass(); - - $bench = new Bench(); - $bench->start(); - - $test($loop); - - $bench->printSnap("$loopName: $testName"); - } - - printf("----------------------------------------\n"); - } -} diff --git a/benchmark/timers.php b/benchmark/timers.php deleted file mode 100644 index e0c30a34..00000000 --- a/benchmark/timers.php +++ /dev/null @@ -1,32 +0,0 @@ - function ($loop) use ($x) { - for ($i = 0; $i < $x; $i++) { - $loop->addTimer(1, function ($signature, $loop) {}); - } - $loop->run(); - }, - $x . ' periodic timers' => function ($loop) use ($x) { - for ($i = 0; $i < $x; $i++) { - $loop->addPeriodicTimer(2, function ($signature, $loop) use (&$i, $x) { - if ($i >= $x) { - $loop->cancelTimer($signature); - } - }); - } - $loop->run(); - }, -); - -benchLoops($tests); From f9e9196fb0caba66dde082cefc12f4a3f82fbee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 17 Oct 2017 12:10:00 +0200 Subject: [PATCH 09/80] Consistently use ReactPHP name in accordance with branding docs See https://github.com/reactphp/branding/blob/master/README.md#naming --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 11fe8934..9c456af3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# React +# ReactPHP Event-driven, non-blocking I/O with PHP. [![Build Status](https://secure.travis-ci.org/reactphp/react.png?branch=master)](http://travis-ci.org/reactphp/react) -React is a low-level library for event-driven programming in PHP. At its core +ReactPHP is a low-level library for event-driven programming in PHP. At its core is an event loop, on top of which it provides low-level utilities, such as: Streams abstraction, async dns resolver, network client/server, http client/server, interaction with processes. Third-party libraries can use these @@ -20,7 +20,7 @@ Node.js (V8). * Provide a standalone event-loop component that can be re-used by other libraries. * Decouple parts so they can be replaced by alternate implementations. -React is non-blocking by default. Use workers for blocking I/O. +ReactPHP is non-blocking by default. Use workers for blocking I/O. ## Core Components @@ -77,8 +77,8 @@ React is non-blocking by default. Use workers for blocking I/O. ## Getting started -React consists of individual components. -This means that instead of installing something like a "React framework", you actually +ReactPHP consists of individual components. +This means that instead of installing something like a "ReactPHP framework", you actually pick only the components that you need. The recommended way to install these components is [through Composer](http://getcomposer.org). @@ -90,7 +90,7 @@ For example, this may look something like this: $ composer require react/event-loop react/http ``` -For more details, check out [React's homepage](http://reactphp.org) for +For more details, check out [ReactPHP's homepage](https://reactphp.org) for quickstart examples and usage details. ## Documentation From 25d3c81ff9ea8bda5d8cf4ca95e5be87c510b243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 17 Oct 2017 12:22:53 +0200 Subject: [PATCH 10/80] Use ReactPHP logo in accordance with branding docs https://github.com/reactphp/branding/blob/master/README.md#logo --- README.md | 6 +++--- resources/avatar.png | Bin 10038 -> 0 bytes resources/logo.png | Bin 2718 -> 0 bytes resources/logo.psd | Bin 555922 -> 0 bytes resources/logo_huge.png | Bin 57139 -> 0 bytes 5 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 resources/avatar.png delete mode 100644 resources/logo.png delete mode 100644 resources/logo.psd delete mode 100644 resources/logo_huge.png diff --git a/README.md b/README.md index 9c456af3..1e4323d7 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# ReactPHP +ReactPHP Logo -Event-driven, non-blocking I/O with PHP. +**Event-driven, non-blocking I/O with PHP.** -[![Build Status](https://secure.travis-ci.org/reactphp/react.png?branch=master)](http://travis-ci.org/reactphp/react) +[![Build Status](https://travis-ci.org/reactphp/react.svg?branch=master)](http://travis-ci.org/reactphp/react) ReactPHP is a low-level library for event-driven programming in PHP. At its core is an event loop, on top of which it provides low-level utilities, such as: diff --git a/resources/avatar.png b/resources/avatar.png deleted file mode 100644 index a3a9445403dd593fd102481019356775421d5b8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10038 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

RT~@@YGlUE2+%PA4fbM9pxJ~)@`1y5 z4s(#%?8Ae%2=K+l?VU$Xp1_zRA7|+1Md0RXj1k{!fXC*;>oQ9a3@oRIH52?{VX3=2 zwrlrpg6$$vMD+)QoU`u~6`-^8hANOsA+UEShFN_)F=%61<_BFt4QS7L43UGqAZ z+nn&M&Dd`5Oo1%&kIpKd2swg5Zyk-R5igYMlXko9hd_!U%((3sXe~ z!g}qukgmi%4A2MroqnW=LoyQXZs;PhsNLSV7qrHTvX*AA$tT#8|)cZT)&BkOFyUGzm^2ESRln^|-0($fufZf#y& z&3X9A(xU>_%q*q{m$bL0BMc%f;4m~!*6y<1VDU=etL`3MS`5Du+q+jtN~wv)rDGt% zGaVTQnX_hS2xJyi17Mc{*w}hxDNO5)RFRML!i8_84oBZUOjya~jDb!%-Q0hh5wbC` znN;=)r=TUkX6#~2t!+u;e zhFchw_JztYi*{+9A$ia0K;(fGoXtG#Yf?et(Ap6d)rLn~KVptxwN_BMY&ZA(KDc7d zDtD!E*I1u&p`DoxQLp(C*6Jxex?yJj1-&OhhSnL6Jfg(TMWLP7uLFPc0J9cW3M%-k zip`?8+`}5r6R${iYG_kk7Pl;Jy>#jU60fa#;G5?Ad#(cy?e z6;ltZp&Y2-b7vvX9aSwZ^El9Z(?(uT@X~(-k)e~VzJuGHomK&9Y@VrfDom;hd-{yW;Su|f znGdgt6yr+t$_pg{EsXKb(&VmaiTD`EpIJk@7eUXI?t_e{aI!=@b9hJgeA82`+C??n z-|@=4J=XV@uSwmNsxY_hNNzX8X47t)XPU9ED>m*6?E%{vmd-`Q<)!)4zvVsbf6IIr zW-ju^Hp%&HZYox#s>CWSDe+4EU0$j6_B-!*NBno}!|xCDI(>Er`nd{rPPI)JucEE< zKoPTX;Vgo&L+=nfSFmr$igDb^Mj&&Sci!&mc?V$QYs}WGh(`F5v zWAou}yEFZ#%o!Wt7MCF5IUY%tqb#{MT6Tu}cY1YJ?YVv#SBK}oWjlcm&%8@?dqJJTZeLcp$ zg=}M($ZNi$(%N#by;U|W^Z{`=sI#68$YSS}G-c@C%O&&X?zol9l#4>ASJ z5C+G7NbPIMSIxVEtTb6>?k-Q&X4cf!>T2j(S}lVkB$}#6rLvAULWIPESo5HPEEuBpr0O9(LE&(iq@PNo7p? zq30iAwRjU8@H@3x!9OxmFCL)gZ{M?B6?i+$Vv6bO#oRE#FEF=N8g1c75HCy637~X* zc}-4D;9c&&V)G8XrCi(Qr!b(cHD?e_gwDe2cgs8ot40pD(Pbimpx*|uTamhGL%9Jq zyX7ir7Xfq}m`@uuOf8{Ay8IX~M=f;t5NQw$k?^VhzFa>Psma*tRO}>~TVRQpn#+rv z9p+ZSi6oW5I-sFx%MtUS_lnp;4M(rG6koodvEgdz}iVl5qu&mvDs7N9%A2D)w1qWql1324NZl>bn}ksaK& zkL?m|-@6^U47(8SpzhCpy$G+kW58DEGkzf*94)Xh^g}!B!L?;R1s_ptc}sn5pd^u1 z=DC5F znto}Usr|d)LinO~b+LSfzrukvMSze70ec|;LJJV4K(?xI%P$fx%s!8c12|2m=|V96 z2_JmQ`|I`#J4q5uUBezH&;M9NgI#4NA|rymQSkonC-05|?rEE zgyYjpKw6^-Kzm8#wF7kt*+tzJ2nNb5qAQ<;&QpL7Y8Tdz|0nTMD1>c@`9*#tNHArG zW;ffZZSQt$JtNc?%~(62QgHC^@ayo77Xy(lq44Y9fr z%q{%~c0=#ndON7x!FAGhGo|CZjmq&_n?;h+u~I>uhG27z&|;X0tIXTvk6OTz`69?? z{UFl}JSPRT7MIKEqUuN~ew`25iGz2*%`!C%c){;jc;#YuUcnCi6^`VSmawu^fmK)* zps`>qLkKz%#7!mfoxl?W^rH#*9c_!*+EO6OAL9FKgHf@n`hQ;)eg)+AB=?*9D#oh~ zbTg1083X|fTLvz0QH?!3G>XWYTb9}KA-ojky}Hycg+(Q3-lXbUi%Zd@{`gExDL&-3 zv=+V>;1ysbno)Zb{4gXORR*R#+sd{$+s#6HCd*5mo#ytc4D5e{ThXC`>EScYeM)NR z;e<`7jX2u{1)@ojf!P@S=$6D8bu5RGgU8Oi#`#`Z2VTc-wwp^6OoG7USvwU$V)H3xH3N(Y{)kuloMMl zPrMgywHylSe??L!^H7RgD29KG;yJ7(dohy0$D%};-`1In??)+(C`G$w5O;06QNHy!9c4e*y^w2+`8vq ze#L#+TtxH=Do>m|;i1Rd$aqO=MH~UWCe7OuyI_Z8`CONR-2Nhw+gfoSUHRL@NNmFBEgPepf`q)!X&YTJOgm;KY zQ3IB&D-=J}4^9=rM ztwrTp!LAcwlkpP=%q!Pp=4s}w{QAtZ!MuHrre2L#ZEKB3bCGCDYQfDT^Kd*llNt}q zvoWaw_nA%xf#$)s#mYNA$206|EN^Qg$NU~z!3m)z{R&^wj;E$z&<7R)Y{zb9ey82> z!MYGMv!K#D8G+m$htP(@&eV|Uh&?taHHmi2g=%ac?5^Hgu8zAWtcqn6)EDjoE-k1= zIabkDs~W$Wdk+W$La?Ca9E#}h00cCGI4Ld}43%4`fl*>X3V(E#YC(&-OkXWDc!jc^D?nyqLQm7kJ@%A4Gy3Gr$AKN{vEb zT}l`e6O@-pl?g*2@Gg zdq>5|6Cm1&lgAq@#89#j8W`;{2J_##a(E<rwz8Vwi6G*QMWV+kkF1YhZt#VrAFHA z3U!{Yd>~BvJE$vt7&C#0s4UtCXttMMe#Hxv+m6Z;pq&i>8=1){xGL>5TSIFG-KM-b zhrk1aA;UFN))bW-)-=FG96wQ^&FfuDZFU7HC$TZrP!ULm*chdGZ9!7p$Rkf8m8kbb zEPz4F%rTLmm?p)9|^IyHjicVG*|)C!o;l48o*Y z?Krm<5&Y&WSdnb+s5k*NWgc&o#po;oc^_lzNpVmL{8US*?lV)fXhg?ltBj1+Hn=vR zF66%Q8_;%d?Zy(3veSr%KtzvOfzA0i#*Mjzad^Uyjc0x9J9C*v3Mr&!#gY4;***Fs ziw_NA+LIz*LLI1eO|TgnYsf0HN`#k;ChoR=8~-R+le!4}A_mFZ2_BDgn_dle%X;m> z@vKO3HP*s=r_Ga1+;vZ`qGS3sW@6MiJk6I{meCr`NcP^GftjcHi9<(@xQBC&EqnQu zS6+Svlz!=J$*Z`;8}pMJ&7xB5d0l+$jC0C7d5)P=+@4gIkL(DMe(aPp;0|VWU~d@A z?cxxVhT2j)>%4J+_p4i-@&*wKMj7d+>FjD`20;sSBRQM)K8ShHr6AMTi!ge|`z<61 z!RipE3F(z=VmAJD=-sFId)$bUsXajyf_Gpmupn9w1`WghZu>s$bHd$Dw(VTHEVmmA(9QN zcvX*0ioplLzYETYb#bJVOB1>0sAd=|kk%(8p2X9WNH}$ZEgh)LujvOR(#EIwGCII~ zqB%(sLw$i;2DMy!|L|~X$Q&N{qeMWM1MPvz)C-by)1)(h@*+f0Ghg$Mem496?Rz#k zTXPDQytZuVQl3lJ{Et6@>>u-uQ-2EBKgqjaf~%+`38>DbPT8kVp6m5`48WxNj9#}d z(#z32buk0~z%=Nv)(rfUCe>1>3#gG``|=t4L&7MnS#*<&1rYlh_Ohh*WQ2|1$q(s# z=_yV85;7{lb@Xu)HE%FF#9&0^uJe0+WV=v(Hj=J@b^6}A@pN)~+&w+2u3aU9DT1MW zPP~A>vuCq_xNPY%oH*_lL{)5*c*T+s#64x7e7~>P5f~LhwucZNkhzD2QMtJ)3qjl1K*jAs*CbPm?f9c@f5tQf+bib7bRSGjaQ19D36_X zPFax7WRDNVd3~7z73L2y)|nxkLqZJ%!lJw^vkVMNYm#9O`-5pt1%A9nh?NtiGhzKg zKzSW%Cww9YH(s;Awp3?~Tm##@A+sMugB-BwV3k}%(Eu}QG_JEGqXWMkjRe}KL1ciT z6^bWC^BWOQ7wMsk0TmW#rr6v7XX&**a}^yT~4hzIC=*#$Qp#2 zupv=vX;Ktgd%{|Rf-g~!0(xni$}VH*ziQaprAyC^-Ft@zhulFE`yWYZ02rS6{T2mN zP!gptP77Nw-EU!O*w^x4sW^nd=dz9)MQh&+(7kA4y08^xX$7Mw5-egUmI4j|#S zQIr@YW)c7?QNf~^695vK1VIvDmNf6p%(Cns?}wMyto7b~*E8dLEuyQdPQAUqQw>la zUt2W&=dH!n-9V$!-F41B``h1lzLRWha>T7MVW@$7(8lWTj6m1OJ+(KQFjj8)DGcL^ z1#KzX;)tm(Y7nXc4vHPUTC@DnDEVovN&KL8d3aU(5%Q`nvU0&KuvnOFF%HqjHb54= z1UfHxfQIXZ^ZG0C&HP?|0UCy*Mgh;Yp%8NKy(B5SXq^oX_Uz^LH1E{bAC5W zdewQ|9MPkf(=&8;HfoHBVS?zJ^Btt4H*Je;ab*>Ry}bzY#oRsCUU*FGAPa}79U{xc z^1@7MqCzP=LzhYu@3#MHB;}1-#)u-3`ChuK!53+$w8_D@io7uwf{m{W<3;AKojYOy ztq^%&2v!)&4{0*7JS>^cfHLM;i&^ivn2^18t*ijxET?zI3>q@zRW-zV^_M;KW4(;K z2sVB{NT1_4F*e1VykMz^y&fz70W9*RQ6poHag_uxQ)Q4 zWtsNKTIu&|6OuQ)hZpgxM7cz}g=FL}4?V_tuAan*lmYZfm_^XLku zU^3UbHzyZhL6#~A&CKTsZebqo)VF`^Wn(~WkTLMLe|K#Adz``Y8qWEgFa<}QPny3( zEix8+i;PuGYjo}OUN1WL&(>_2>cXtO+@y+Ze4Kut{b)U~s^?y5C`dysbod)zske~WH9Cz&pzw@!u&^q6Pp~FzjzUDi(yPKBnBz0vZf2FnGuvv3c2n* z7BP{JAO^G(3)PU)(`4A66-;zUttSexl7tc{1<|YS3M1V2WFbTXNTYdtjsIcV10Uh! zO)+Y2l(9A}HiV;|!qa;^^X#*~P|sSwxE+zTgVqk(fydfG5Y}enNSlOe(l}68R1WL!yVEEd&*AZgnl0vWp77ij^0ZpxA)}=T`<(t7KXg-;`L3 zpuaBAbNSYoPUC2v;M<6{xJd{I>P`Wfq6K7T&u7%1v*EwiePXjz`qIMg8f3TD$fb11 zNiUMH1|3&W)bIv2X%OJEVtgNnj~CgniDx?0lCRT&3je`p1gzx)

qxni_bg_jG`x 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 ~{0LOa+ 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 QAt@M=f*~pR|5*zDA0nY*Q~&?~ diff --git a/resources/logo_huge.png b/resources/logo_huge.png deleted file mode 100644 index c08bcdb27b6407680007b955598721643506c817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57139 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 From c533e894602a9a88b174839131f7ecabddfc1c89 Mon Sep 17 00:00:00 2001 From: Jan Sorgalla Date: Tue, 17 Oct 2017 16:52:00 +0200 Subject: [PATCH 11/80] Improve readme header --- README.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1e4323d7..429ba92a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,20 @@ -ReactPHP Logo - -**Event-driven, non-blocking I/O with PHP.** - -[![Build Status](https://travis-ci.org/reactphp/react.svg?branch=master)](http://travis-ci.org/reactphp/react) +

+ +
+ +
+ Event-driven, non-blocking I/O with PHP. +
+ +
+ +
+ Build Status +
+ +
ReactPHP is a low-level library for event-driven programming in PHP. At its core is an event loop, on top of which it provides low-level utilities, such as: From d382647ee6d8dbe7ee166b785e1578c22de2abdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 22 Oct 2017 19:39:46 +0200 Subject: [PATCH 12/80] Add PromiseTimer component to README --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 429ba92a..7db7bf58 100644 --- a/README.md +++ b/README.md @@ -79,13 +79,17 @@ ReactPHP is non-blocking by default. Use workers for blocking I/O. Async caching for ReactPHP. [Read the documentation](https://github.com/reactphp/cache) +* **ChildProcess** + Library for executing child processes. + [Read the documentation](https://github.com/reactphp/child-process) + * **PromiseTimer** Trivial timeout implementation for ReactPHP's Promise lib. [Read the documentation](https://github.com/reactphp/promise-timer) -* **ChildProcess** - Library for executing child processes. - [Read the documentation](https://github.com/reactphp/child-process) +* **PromiseStream** + The missing link between Promise-land and Stream-land, built on top of ReactPHP. + [Read the documentation](https://github.com/reactphp/promise-stream) ## Getting started From 0fea624dc94a6035922006a24ea92179ad2870b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 20 Dec 2017 15:45:50 +0100 Subject: [PATCH 13/80] Remove unneeded composer.lock --- composer.lock | 1679 ------------------------------------------------- 1 file changed, 1679 deletions(-) delete mode 100644 composer.lock diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 1fa818aa..00000000 --- a/composer.lock +++ /dev/null @@ -1,1679 +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#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "e8553796809bcd1f49aba4ccc2dc8088", - "content-hash": "b23752d99957e709b5dffd1700eb660f", - "packages": [ - { - "name": "evenement/evenement", - "version": "v2.0.0", - "source": { - "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "f6e843799fd4f4184d54d8fc7b5b3551c9fa803e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/f6e843799fd4f4184d54d8fc7b5b3551c9fa803e", - "reference": "f6e843799fd4f4184d54d8fc7b5b3551c9fa803e", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-0": { - "Evenement": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch", - "homepage": "http://wiedler.ch/igor/" - } - ], - "description": "Événement is a very simple event dispatching library for PHP", - "keywords": [ - "event-dispatcher", - "event-emitter" - ], - "time": "2012-11-02 14:49:47" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/5c6447c9df362e8f8093bda8f5d8873fe5c7f65b", - "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "PSR-7 message implementation", - "keywords": [ - "http", - "message", - "stream", - "uri" - ], - "time": "2016-06-24 23:00:38" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06 14:39:51" - }, - { - "name": "react/cache", - "version": "v0.4.1", - "source": { - "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "558f614891341b1d817a8cdf9a358948ec49638f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/558f614891341b1d817a8cdf9a358948ec49638f", - "reference": "558f614891341b1d817a8cdf9a358948ec49638f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "react/promise": "~2.0|~1.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Cache\\": "src\\" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Async caching.", - "keywords": [ - "cache" - ], - "time": "2016-02-25 18:17:16" - }, - { - "name": "react/child-process", - "version": "v0.4.1", - "source": { - "type": "git", - "url": "https://github.com/reactphp/child-process.git", - "reference": "3ab4f83c6f6c5862f7ca28d999a92d327472a671" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/3ab4f83c6f6c5862f7ca28d999a92d327472a671", - "reference": "3ab4f83c6f6c5862f7ca28d999a92d327472a671", - "shasum": "" - }, - "require": { - "evenement/evenement": "~2.0", - "php": ">=5.4.0", - "react/event-loop": "0.4.*", - "react/stream": "~0.4.2" - }, - "require-dev": { - "sebastian/environment": "~1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\ChildProcess\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Library for executing child processes.", - "keywords": [ - "process" - ], - "time": "2016-08-01 18:09:48" - }, - { - "name": "react/dns", - "version": "v0.4.3", - "source": { - "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "751b3129556e04944f164e3556a20ca6e201e459" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/751b3129556e04944f164e3556a20ca6e201e459", - "reference": "751b3129556e04944f164e3556a20ca6e201e459", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "react/cache": "~0.4.0|~0.3.0", - "react/promise": "~2.1|~1.2", - "react/socket": "~0.4.0|~0.3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Dns\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Async DNS resolver.", - "keywords": [ - "dns", - "dns-resolver" - ], - "time": "2016-08-01 10:09:07" - }, - { - "name": "react/event-loop", - "version": "v0.4.2", - "source": { - "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "164799f73175e1c80bba92a220ea35df6ca371dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/164799f73175e1c80bba92a220ea35df6ca371dd", - "reference": "164799f73175e1c80bba92a220ea35df6ca371dd", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "suggest": { - "ext-event": "~1.0", - "ext-libev": "*", - "ext-libevent": ">=0.1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.5-dev" - } - }, - "autoload": { - "psr-4": { - "React\\EventLoop\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Event loop abstraction layer that libraries can use for evented I/O.", - "keywords": [ - "asynchronous", - "event-loop" - ], - "time": "2016-03-08 02:09:32" - }, - { - "name": "react/http", - "version": "v0.4.2", - "source": { - "type": "git", - "url": "https://github.com/reactphp/http.git", - "reference": "abedac54967d7ea237ad104cff8274e2c4077cf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/abedac54967d7ea237ad104cff8274e2c4077cf4", - "reference": "abedac54967d7ea237ad104cff8274e2c4077cf4", - "shasum": "" - }, - "require": { - "evenement/evenement": "^2.0", - "guzzlehttp/psr7": "^1.0", - "php": ">=5.4.0", - "react/socket": "^0.4", - "react/stream": "^0.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Http\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Library for building an evented http server.", - "keywords": [ - "http" - ], - "time": "2016-11-09 15:20:39" - }, - { - "name": "react/http-client", - "version": "v0.4.15", - "source": { - "type": "git", - "url": "https://github.com/reactphp/http-client.git", - "reference": "01e919008363622334f91419a9908b3a51754ccd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/http-client/zipball/01e919008363622334f91419a9908b3a51754ccd", - "reference": "01e919008363622334f91419a9908b3a51754ccd", - "shasum": "" - }, - "require": { - "evenement/evenement": "~2.0", - "guzzlehttp/psr7": "^1.0", - "php": ">=5.4.0", - "react/dns": "0.4.*", - "react/event-loop": "0.4.*", - "react/promise": "~2.2", - "react/socket-client": "^0.5 || ^0.4 || ^0.3", - "react/stream": "0.4.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\HttpClient\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Asynchronous HTTP client library.", - "keywords": [ - "http" - ], - "time": "2016-12-02 10:17:42" - }, - { - "name": "react/promise", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "2760f3898b7e931aa71153852dcd48a75c9b95db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/2760f3898b7e931aa71153852dcd48a75c9b95db", - "reference": "2760f3898b7e931aa71153852dcd48a75c9b95db", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "time": "2016-12-22 14:09:01" - }, - { - "name": "react/promise-timer", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise-timer.git", - "reference": "ddedc67bfd7f579fc83e66ff67e3564b179297dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/ddedc67bfd7f579fc83e66ff67e3564b179297dd", - "reference": "ddedc67bfd7f579fc83e66ff67e3564b179297dd", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/event-loop": "~0.4.0|~0.3.0", - "react/promise": "~2.1|~1.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Promise\\Timer\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@lueck.tv" - } - ], - "description": "Trivial timeout implementation for Promises", - "homepage": "https://github.com/react/promise-timer", - "keywords": [ - "async", - "event-loop", - "promise", - "reactphp", - "timeout", - "timer" - ], - "time": "2016-12-27 08:12:19" - }, - { - "name": "react/socket", - "version": "v0.4.4", - "source": { - "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "d61930e1aefb2a704b0adbe6bb97ee4a835d6a96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/d61930e1aefb2a704b0adbe6bb97ee4a835d6a96", - "reference": "d61930e1aefb2a704b0adbe6bb97ee4a835d6a96", - "shasum": "" - }, - "require": { - "evenement/evenement": "~2.0|~1.0", - "php": ">=5.3.0", - "react/event-loop": "0.4.*|0.3.*", - "react/stream": "^0.4.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Socket\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Library for building an evented socket server.", - "keywords": [ - "Socket" - ], - "time": "2016-12-19 22:52:38" - }, - { - "name": "react/socket-client", - "version": "v0.5.3", - "source": { - "type": "git", - "url": "https://github.com/reactphp/socket-client.git", - "reference": "5570838d436f056695e9a5eaf01dd5f80386dd26" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket-client/zipball/5570838d436f056695e9a5eaf01dd5f80386dd26", - "reference": "5570838d436f056695e9a5eaf01dd5f80386dd26", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "react/dns": "0.4.*|0.3.*", - "react/event-loop": "0.4.*|0.3.*", - "react/promise": "^2.1 || ^1.2", - "react/promise-timer": "~1.0", - "react/stream": "^0.4.5" - }, - "require-dev": { - "clue/block-react": "^1.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\SocketClient\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Async connector to open TCP/IP and SSL/TLS based connections.", - "keywords": [ - "Socket" - ], - "time": "2016-12-24 11:19:15" - }, - { - "name": "react/stream", - "version": "v0.4.5", - "source": { - "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "23389503012e1ab721ad498a5a1f4b39f7a43c00" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/23389503012e1ab721ad498a5a1f4b39f7a43c00", - "reference": "23389503012e1ab721ad498a5a1f4b39f7a43c00", - "shasum": "" - }, - "require": { - "evenement/evenement": "^2.0|^1.0", - "php": ">=5.3.8" - }, - "require-dev": { - "clue/stream-filter": "~1.2", - "react/event-loop": "^0.4|^0.3", - "react/promise": "^2.0|^1.0" - }, - "suggest": { - "react/event-loop": "^0.4", - "react/promise": "^2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Stream\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Basic readable and writable stream interfaces that support piping.", - "keywords": [ - "pipe", - "stream" - ], - "time": "2016-11-13 17:06:02" - } - ], - "packages-dev": [ - { - "name": "clue/block-react", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/clue/php-block-react.git", - "reference": "ed70f8d497dd265e30bc7dd19cf86b2e149b1ecf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/php-block-react/zipball/ed70f8d497dd265e30bc7dd19cf86b2e149b1ecf", - "reference": "ed70f8d497dd265e30bc7dd19cf86b2e149b1ecf", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/event-loop": "0.4.*|0.3.*", - "react/promise": "~2.1|~1.2", - "react/promise-timer": "~1.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@lueck.tv" - } - ], - "description": "Integrate async React PHP components into your blocking environment", - "homepage": "https://github.com/clue/php-block-react", - "keywords": [ - "async", - "blocking", - "event loop", - "promise", - "reactphp", - "synchronous" - ], - "time": "2016-03-09 15:10:22" - }, - { - "name": "clue/stream-filter", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/clue/php-stream-filter.git", - "reference": "e3bf9415da163d9ad6701dccb407ed501ae69785" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/php-stream-filter/zipball/e3bf9415da163d9ad6701dccb407ed501ae69785", - "reference": "e3bf9415da163d9ad6701dccb407ed501ae69785", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Clue\\StreamFilter\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@lueck.tv" - } - ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", - "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" - ], - "time": "2015-11-08 23:41:30" - }, - { - "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-14 21:17:01" - }, - { - "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-03 12:10:50" - }, - { - "name": "phpspec/prophecy", - "version": "v1.6.2", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "6c52c2722f8460122f96f86346600e1077ce22cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb", - "reference": "6c52c2722f8460122f96f86346600e1077ce22cb", - "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|^2.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.0", - "phpunit/phpunit": "^4.8 || ^5.6.5" - }, - "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-11-21 14:58:47" - }, - { - "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-06 15:47:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "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": "2016-10-03 07:40:28" - }, - { - "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-21 13:50:34" - }, - { - "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-12 18:03:57" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.4.9", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b", - "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b", - "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": "2016-11-15 14:06:22" - }, - { - "name": "phpunit/phpunit", - "version": "4.8.31", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "98b2b39a520766bec663ff5b7ff1b729db9dbfe3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/98b2b39a520766bec663ff5b7ff1b729db9dbfe3", - "reference": "98b2b39a520766bec663ff5b7ff1b729db9dbfe3", - "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.2.2", - "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-12-09 02:45:31" - }, - { - "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-02 06:51:40" - }, - { - "name": "sebastian/comparator", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", - "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2016-11-19 09:18:40" - }, - { - "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-08 07:14:41" - }, - { - "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-18 05:49:44" - }, - { - "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-17 09:04:28" - }, - { - "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-12 03:26:01" - }, - { - "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-11 19:50:13" - }, - { - "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-21 13:59:46" - }, - { - "name": "symfony/yaml", - "version": "v2.8.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "befb26a3713c97af90d25dd12e75621ef14d91ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/befb26a3713c97af90d25dd12e75621ef14d91ff", - "reference": "befb26a3713c97af90d25dd12e75621ef14d91ff", - "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-11-14 16:15:57" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=5.4.0" - }, - "platform-dev": [], - "platform-overrides": { - "php": "5.4" - } -} From 3db6b81eee52430b14fc6d909ed0f1e9cc0069ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 21 Dec 2017 20:50:15 +0100 Subject: [PATCH 14/80] Update dependencies to latest supported versions --- .gitignore | 1 + composer.json | 21 ++++++++++----------- phpunit.xml.dist | 14 +++++++++++++- tests/bootstrap.php | 5 +++++ 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 7c97585f..2866cd9e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .subsplit vendor +/composer.lock diff --git a/composer.json b/composer.json index 686523b8..b02a7701 100644 --- a/composer.json +++ b/composer.json @@ -9,19 +9,18 @@ }, "require": { "php": ">=5.4.0", - "react/cache": "0.4.*", - "react/child-process": "0.4.*", - "react/dns": "0.4.*", - "react/event-loop": "0.4.*", - "react/http-client": "0.4.*", - "react/http": "0.4.*", - "react/promise": "~2.1", - "react/socket-client": "^0.5.3", - "react/socket": "0.4.*", - "react/stream": "0.4.*" + "react/cache": "^0.4", + "react/child-process": "^0.5", + "react/dns": "^0.4", + "react/event-loop": "^0.4", + "react/http": "^0.8", + "react/http-client": "^0.5", + "react/promise": "^2.1", + "react/socket": "^0.8", + "react/stream": "^0.7" }, "require-dev": { - "phpunit/phpunit": "~4.0", + "phpunit/phpunit": "^4.8.35", "clue/block-react": "^1.1", "clue/stream-filter": "^1.3" }, diff --git a/phpunit.xml.dist b/phpunit.xml.dist index d7f645a3..956edbe1 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -13,7 +13,19 @@ > - ./vendor/react/*/tests/ + ./vendor/react/event-loop/tests/ + ./vendor/react/stream/tests/ + ./vendor/react/promise/tests/ + + ./vendor/react/socket/tests/ + ./vendor/react/datagram/tests/ + + ./vendor/react/http/tests/ + ./vendor/react/http-client/tests/ + ./vendor/react/dns/tests/ + + ./vendor/react/cache/tests/ + ./vendor/react/child-process/tests/ diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 6105242b..445336f0 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -18,5 +18,10 @@ // load all legacy test bootstrap scripts from React's components foreach (glob(__DIR__ . '/../vendor/react/*/tests/bootstrap.php') as $b) { + // skip react/promise-stream for now + if (strpos($b, 'react/promise-stream/tests/bootstrap.php') !== false) { + continue; + } + include $b; } From c19f9c7964f2c862ff9312d915b25ea543f37b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 22 Dec 2017 14:05:48 +0100 Subject: [PATCH 15/80] Update react/promise-stream to avoid work arounds for test --- composer.json | 1 + phpunit.xml.dist | 14 +------------- tests/bootstrap.php | 7 +------ 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/composer.json b/composer.json index b02a7701..2a712c8f 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,7 @@ "react/http": "^0.8", "react/http-client": "^0.5", "react/promise": "^2.1", + "react/promise-stream": "^1.1.1", "react/socket": "^0.8", "react/stream": "^0.7" }, diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 956edbe1..d7f645a3 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -13,19 +13,7 @@ > - ./vendor/react/event-loop/tests/ - ./vendor/react/stream/tests/ - ./vendor/react/promise/tests/ - - ./vendor/react/socket/tests/ - ./vendor/react/datagram/tests/ - - ./vendor/react/http/tests/ - ./vendor/react/http-client/tests/ - ./vendor/react/dns/tests/ - - ./vendor/react/cache/tests/ - ./vendor/react/child-process/tests/ + ./vendor/react/*/tests/ diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 445336f0..fd51842f 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -10,7 +10,7 @@ $base = dirname($b) . '/'; foreach ($config['autoload-dev']['psr-4'] as $namespace => $paths) { foreach ((array)$paths as $path) { - $autoload->addPsr4($namespace, $base . trim($path, '\\/')); + $autoload->addPsr4($namespace, $base . $path); } } } @@ -18,10 +18,5 @@ // load all legacy test bootstrap scripts from React's components foreach (glob(__DIR__ . '/../vendor/react/*/tests/bootstrap.php') as $b) { - // skip react/promise-stream for now - if (strpos($b, 'react/promise-stream/tests/bootstrap.php') !== false) { - continue; - } - include $b; } From 011c284f066ecfde2ef257c85a55e5594549c515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 24 Dec 2017 12:56:37 +0100 Subject: [PATCH 16/80] Update react/socket component to fix critical bug with ext-event --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2a712c8f..ffabf895 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "react/http-client": "^0.5", "react/promise": "^2.1", "react/promise-stream": "^1.1.1", - "react/socket": "^0.8", + "react/socket": "^0.8.7", "react/stream": "^0.7" }, "require-dev": { From 38d5bc1f56597ee9cd5c1c136e856426d4442841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 5 Jan 2018 16:36:32 +0100 Subject: [PATCH 17/80] Update react/http component to fix fragile tests with ext-event --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index ffabf895..2299470e 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "react/child-process": "^0.5", "react/dns": "^0.4", "react/event-loop": "^0.4", - "react/http": "^0.8", + "react/http": "^0.8.1", "react/http-client": "^0.5", "react/promise": "^2.1", "react/promise-stream": "^1.1.1", From f2ff7e41c83f554fa97844d932a457032a1a446a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 6 Jan 2018 13:17:35 +0100 Subject: [PATCH 18/80] Update react/socket component to fix flaky online integration tests --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2299470e..1a409b27 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "react/http-client": "^0.5", "react/promise": "^2.1", "react/promise-stream": "^1.1.1", - "react/socket": "^0.8.7", + "react/socket": "^0.8.8", "react/stream": "^0.7" }, "require-dev": { From ae6ada3a05dfe012cfedfe8910ac078c871e2ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 22 Dec 2017 13:58:55 +0100 Subject: [PATCH 19/80] Remove outdated examples --- examples/child-child.php | 10 ------ examples/child-process.php | 25 ------------- examples/dns-resolver.php | 23 ------------ examples/echo-server.php | 18 ---------- examples/http-client.php | 40 --------------------- examples/next-tick.php | 58 ------------------------------ examples/parallel-download.php | 46 ------------------------ examples/pump-shitload-of-data.php | 23 ------------ examples/scalability.php | 21 ----------- examples/tcp-chat.php | 35 ------------------ examples/test-close-conn.php | 22 ------------ examples/test-memory-http.php | 28 --------------- examples/test-memory.php | 26 -------------- 13 files changed, 375 deletions(-) delete mode 100644 examples/child-child.php delete mode 100644 examples/child-process.php delete mode 100644 examples/dns-resolver.php delete mode 100644 examples/echo-server.php delete mode 100644 examples/http-client.php delete mode 100644 examples/next-tick.php delete mode 100644 examples/parallel-download.php delete mode 100644 examples/pump-shitload-of-data.php delete mode 100644 examples/scalability.php delete mode 100644 examples/tcp-chat.php delete mode 100644 examples/test-close-conn.php delete mode 100644 examples/test-memory-http.php delete mode 100644 examples/test-memory.php diff --git a/examples/child-child.php b/examples/child-child.php deleted file mode 100644 index a86064ec..00000000 --- a/examples/child-child.php +++ /dev/null @@ -1,10 +0,0 @@ -on('exit', function($exitCode, $termSignal) { - echo "Child exit\n"; -}); - -$loop->addTimer(0.001, function($timer) use ($process) { - $process->start($timer->getLoop()); - - $process->stdout->on('data', function($output) { - echo "Child script says: {$output}"; - }); -}); - -$loop->addPeriodicTimer(5, function($timer) { - echo "Parent cannot be blocked by child\n"; -}); - -$loop->run(); diff --git a/examples/dns-resolver.php b/examples/dns-resolver.php deleted file mode 100644 index 3cac3bee..00000000 --- a/examples/dns-resolver.php +++ /dev/null @@ -1,23 +0,0 @@ -create('8.8.8.8', $loop); - -$domain = 'igor.io'; - -$dns - ->resolve($domain) - ->then(function ($ip) { - echo "Host: $ip\n"; - }, function ($e) { - echo "Error: {$e->getMessage()}\n"; - }); - -echo "Resolving domain $domain...\n"; - -$loop->run(); diff --git a/examples/echo-server.php b/examples/echo-server.php deleted file mode 100644 index 8f1ec12c..00000000 --- a/examples/echo-server.php +++ /dev/null @@ -1,18 +0,0 @@ -on('connection', function ($conn) { - $conn->pipe($conn); -}); - -echo "Socket server listening on port 4000.\n"; -echo "You can connect to it by running: telnet localhost 4000\n"; - -$socket->listen(4000); -$loop->run(); diff --git a/examples/http-client.php b/examples/http-client.php deleted file mode 100644 index af8925ae..00000000 --- a/examples/http-client.php +++ /dev/null @@ -1,40 +0,0 @@ -createCached('8.8.8.8', $loop); - -$factory = new React\HttpClient\Factory(); -$client = $factory->create($loop, $dnsResolver); - -$request = $client->request('GET', 'https://api.github.com/repos/reactphp/react/commits'); -$request->on('response', function ($response) { - $buffer = ''; - - $response->on('data', function ($data) use (&$buffer) { - $buffer .= $data; - echo "."; - }); - - $response->on('end', function () use (&$buffer) { - $decoded = json_decode($buffer, true); - $latest = $decoded[0]['commit']; - $author = $latest['author']['name']; - $date = date('F j, Y', strtotime($latest['author']['date'])); - - echo "\n"; - echo "Latest commit on react was done by {$author} on {$date}\n"; - echo "{$latest['message']}\n"; - }); -}); -$request->on('end', function ($error, $response) { - echo $error; -}); -$request->end(); - -$loop->run(); diff --git a/examples/next-tick.php b/examples/next-tick.php deleted file mode 100644 index 64b9bcfb..00000000 --- a/examples/next-tick.php +++ /dev/null @@ -1,58 +0,0 @@ -addTimer( - 0, - function () { - echo 'timer' . PHP_EOL; - } -); - -$loop->nextTick( - function ($loop) { - echo 'next-tick #1' . PHP_EOL; - - $loop->nextTick( - function () { - echo 'next-tick #2' . PHP_EOL; - } - ); - } -); - -$loop->futureTick( - function ($loop) { - echo 'future-tick #1' . PHP_EOL; - - $loop->futureTick( - function () { - echo 'future-tick #2' . PHP_EOL; - } - ); - } -); - -$loop->run(); diff --git a/examples/parallel-download.php b/examples/parallel-download.php deleted file mode 100644 index 90c8edf8..00000000 --- a/examples/parallel-download.php +++ /dev/null @@ -1,46 +0,0 @@ - 'http://nodejs.org/dist/v0.6.18/node-v0.6.18.tar.gz', - 'php-5.5.15.tar.gz' => 'http://it.php.net/get/php-5.5.15.tar.gz/from/this/mirror', -); - -foreach ($files as $file => $url) { - $readStream = fopen($url, 'r'); - $writeStream = fopen($file, 'w'); - - stream_set_blocking($readStream, 0); - stream_set_blocking($writeStream, 0); - - $read = new React\Stream\Stream($readStream, $loop); - $write = new React\Stream\Stream($writeStream, $loop); - - $read->on('end', function () use ($file, &$files) { - unset($files[$file]); - echo "Finished downloading $file\n"; - }); - - $read->pipe($write); -} - -$loop->addPeriodicTimer(5, function ($timer) use (&$files) { - if (0 === count($files)) { - $timer->cancel(); - } - - foreach ($files as $file => $url) { - $mbytes = filesize($file) / (1024 * 1024); - $formatted = number_format($mbytes, 3); - echo "$file: $formatted MiB\n"; - } -}); - -echo "This script will show the download status every 5 seconds.\n"; - -$loop->run(); diff --git a/examples/pump-shitload-of-data.php b/examples/pump-shitload-of-data.php deleted file mode 100644 index 7efad58e..00000000 --- a/examples/pump-shitload-of-data.php +++ /dev/null @@ -1,23 +0,0 @@ -on('connection', function ($conn) { - $shitload = str_repeat('a', 1024*1024*32); - $conn->write($shitload); - $conn->end(); -}); - -echo "Socket server listening on port 4000.\n"; -echo "You can connect to it by running: telnet localhost 4000\n"; - -$socket->listen(4000); -$loop->run(); diff --git a/examples/scalability.php b/examples/scalability.php deleted file mode 100644 index 84276118..00000000 --- a/examples/scalability.php +++ /dev/null @@ -1,21 +0,0 @@ -addReadStream($s, function ($s) use ($i) { - $c=stream_socket_accept($s); - $len=strlen($i)+4; - fwrite($c,"HTTP/1.1 200 OK\r\nContent-Length: $len\r\n\r\nHi:$i\n"); - echo "Served on port 800$i\n"; - }); -} - -echo "Access your brand new HTTP server on 127.0.0.1:800x. Replace x with any number from 0-9\n"; - -$loop->run(); diff --git a/examples/tcp-chat.php b/examples/tcp-chat.php deleted file mode 100644 index 8ed2ffc5..00000000 --- a/examples/tcp-chat.php +++ /dev/null @@ -1,35 +0,0 @@ -on('connection', function ($conn) use ($conns) { - $conns->attach($conn); - - $conn->on('data', function ($data) use ($conns, $conn) { - foreach ($conns as $current) { - if ($conn === $current) { - continue; - } - - $current->write($conn->getRemoteAddress().': '); - $current->write($data); - } - }); - - $conn->on('end', function () use ($conns, $conn) { - $conns->detach($conn); - }); -}); - -echo "Socket server listening on port 4000.\n"; -echo "You can connect to it by running: telnet localhost 4000\n"; - -$socket->listen(4000); -$loop->run(); diff --git a/examples/test-close-conn.php b/examples/test-close-conn.php deleted file mode 100644 index a949aeaa..00000000 --- a/examples/test-close-conn.php +++ /dev/null @@ -1,22 +0,0 @@ -on('connection', function ($conn) use (&$i, $loop) { - $i++; - - $conn->on('end', function () use (&$i) { - $i--; - }); -}); - -$loop->addPeriodicTimer(2, function () use (&$i) { - echo "$i open connections?\n"; -}); - -$socket->listen(8080); -$loop->run(); diff --git a/examples/test-memory-http.php b/examples/test-memory-http.php deleted file mode 100644 index 634dd8bc..00000000 --- a/examples/test-memory-http.php +++ /dev/null @@ -1,28 +0,0 @@ -on('request', function ($request, $response) use (&$i) { - $i++; - $response->writeHead(); - $response->end("Hello World!\n"); -}); - -$loop->addPeriodicTimer(2, function () use (&$i) { - $kmem = memory_get_usage(true) / 1024; - echo "Request: $i\n"; - echo "Memory: $kmem KiB\n"; -}); - -$socket->listen(8080); -$loop->run(); diff --git a/examples/test-memory.php b/examples/test-memory.php deleted file mode 100644 index 4e478011..00000000 --- a/examples/test-memory.php +++ /dev/null @@ -1,26 +0,0 @@ -addPeriodicTimer(0.001, function () use (&$i, $loop) { - $i++; - - // $loop->addTimer(1, function ($timer) { - // }); - - $loop->addPeriodicTimer(1, function ($timer) { - $timer->cancel(); - }); -}); - -$loop->addPeriodicTimer(2, function () use (&$i) { - $kmem = memory_get_usage(true) / 1024; - echo "Run: $i\n"; - echo "Memory: $kmem KiB\n"; -}); - -$loop->run(); From e4de88023fffca1b83a7583e711aa40a642dad4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 19 Jan 2018 16:07:16 +0100 Subject: [PATCH 20/80] Update react/stream component to fix test timeout --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1a409b27..46de1b43 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ "react/promise": "^2.1", "react/promise-stream": "^1.1.1", "react/socket": "^0.8.8", - "react/stream": "^0.7" + "react/stream": "^0.7.7" }, "require-dev": { "phpunit/phpunit": "^4.8.35", From 931b54138d6db404428bfaa719cedfb180e147e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 8 Apr 2018 12:03:59 +0200 Subject: [PATCH 21/80] Do not install extensions for now due to Travis build errors --- .travis.yml | 2 +- tests/travis-init.sh | 36 ------------------------------------ 2 files changed, 1 insertion(+), 37 deletions(-) delete mode 100755 tests/travis-init.sh diff --git a/.travis.yml b/.travis.yml index cc51a303..80c75e01 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ matrix: - php: hhvm install: - - ./tests/travis-init.sh + - composer install --no-interaction script: - php vendor/bin/phpunit --coverage-text diff --git a/tests/travis-init.sh b/tests/travis-init.sh deleted file mode 100755 index 6360e58f..00000000 --- a/tests/travis-init.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -e -set -o pipefail - -if [ "$TRAVIS_PHP_VERSION" != "hhvm" ]; then - - # install "libevent" (used by 'event' and 'libevent' PHP extensions) - sudo apt-get install -y libevent-dev - - # install 'event' PHP extension - echo "yes" | pecl install event - - # install 'libevent' PHP extension - curl http://pecl.php.net/get/libevent-0.0.5.tgz | tar -xz - pushd libevent-0.0.5 - phpize - ./configure - make - make install - popd - echo "extension=libevent.so" >> "$(php -r 'echo php_ini_loaded_file();')" - - # install 'libev' PHP extension - git clone --recursive https://github.com/m4rw3r/php-libev - pushd php-libev - phpize - ./configure --with-libev - make - make install - popd - echo "extension=libev.so" >> "$(php -r 'echo php_ini_loaded_file();')" - -fi - -composer self-update -composer install --dev --prefer-source From 512d96ceb140aa1b56e0bc3d56ee40a2448e5574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 8 Apr 2018 14:22:34 +0200 Subject: [PATCH 22/80] Update react/event-loop component to latest v0.5 --- composer.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 46de1b43..9efecbf9 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "react/cache": "^0.4", "react/child-process": "^0.5", "react/dns": "^0.4", - "react/event-loop": "^0.4", + "react/event-loop": "^0.5", "react/http": "^0.8.1", "react/http-client": "^0.5", "react/promise": "^2.1", @@ -25,11 +25,6 @@ "clue/block-react": "^1.1", "clue/stream-filter": "^1.3" }, - "suggest": { - "ext-libevent": "Allows for use of a more performant event-loop implementation.", - "ext-libev": "Allows for use of a more performant event-loop implementation.", - "ext-event": "Allows for use of a more performant event-loop implementation." - }, "extra": { "branch-alias": { "dev-master": "0.5-dev" From 52e379b2345d20d6a79fc834ef4ed73fc35bf0a9 Mon Sep 17 00:00:00 2001 From: Daniel Ruf Date: Thu, 17 May 2018 00:35:31 +0200 Subject: [PATCH 23/80] chore: add PHP 7 --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 80c75e01..85e2bf0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,9 @@ php: - 5.4 - 5.5 - 5.6 + - 7.0 + - 7.1 + - 7.2 - hhvm matrix: From 79a44dab16bcd2fd5f28b1c41967834e1af54b67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 20 Dec 2017 15:47:13 +0100 Subject: [PATCH 24/80] Merge legacy v0.3 update guide into legacy CHANGELOG --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ UPGRADE-0.3.md | 33 --------------------------------- 2 files changed, 29 insertions(+), 33 deletions(-) delete mode 100644 UPGRADE-0.3.md diff --git a/CHANGELOG.md b/CHANGELOG.md index f0103f00..ecc2bad4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,35 @@ CHANGELOG * Feature: [SocketClient] New SocketClient component extracted from HttpClient (@clue) * Feature: [Stream] Factory method for BufferedSink +#### EventLoop + +* The timer callback now receives a `Timer` instance, with the following + useful methods: + + * `cancel` + * `isActive` + * `setData($data)` + * `getData` + + And some other less common ones. These are prefered over + `LoopInterface::cancelTimer` and `LoopInterface::isTimerActive`. + +* You can no longer return a boolean from a periodic timer callback to abort + it. + +#### HttpClient + +* `HttpClient\*ConnectionManager` has been moved to `SocketClient\*Connector`, + and the `getConnection` method has been renamed to `create`. + + Before: + + $connectionManager->getConnection($host, $port); + + After: + + $connector->create($host, $port); + ### 0.2.7 (2013-01-05) * Bug fix: [EventLoop] Fix libevent timers with PHP 5.3 diff --git a/UPGRADE-0.3.md b/UPGRADE-0.3.md deleted file mode 100644 index e26bce81..00000000 --- a/UPGRADE-0.3.md +++ /dev/null @@ -1,33 +0,0 @@ -UPGRADE for 0.3.x -================= - -EventLoop ---------- - -* The timer callback now receives a `Timer` instance, with the following - useful methods: - - * `cancel` - * `isActive` - * `setData($data)` - * `getData` - - And some other less common ones. These are prefered over - `LoopInterface::cancelTimer` and `LoopInterface::isTimerActive`. - -* You can no longer return a boolean from a periodic timer callback to abort - it. - -HttpClient ----------- - -* `HttpClient\*ConnectionManager` has been moved to `SocketClient\*Connector`, - and the `getConnection` method has been renamed to `create`. - - Before: - - $connectionManager->getConnection($host, $port); - - After: - - $connector->create($host, $port); From ad03d1d325d6ad2e512068a83b8b63e1acd4dc58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 17 Apr 2018 16:16:27 +0200 Subject: [PATCH 25/80] Update CHANGELOG to include texts from releases --- CHANGELOG.md | 57 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecc2bad4..bfcae615 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,19 +1,21 @@ -CHANGELOG -========= +# Changelog -### 0.4.1 (2014-04-13) +## 0.4.2 (2014-12-11) + +**Real Split**: The one where we remember to tag the change were the master repo pulls in all the split components. + +## 0.4.1 (2014-04-13) + +**Hungry Hungry CPU**: CPU starvation bug fixes and other bug fixes. * Bug fix: [EventLoop] null timeout in StreamSelectLoop causing 100% CPU usage (@clue) * Bug fix: [Socket] Check read buffer for data before shutdown signal and end emit (@ArtyDev) * Bug fix: [DNS] Fixed PSR-4 autoload path (@marcj/WyriHaximus) * Bug fix: v0.3.4 changes merged for v0.4.1 -### 0.3.4 (2014-03-30) - - * Bug fix: [Stream] Fixed 100% CPU spike from non-empty write buffer on closed stream - * Buf fix: [Socket] Reset socket to non-blocking after shutting down (PHP bug) +## 0.4.0 (2014-02-02) -### 0.4.0 (2014-02-02) +**Fore!** * Feature: Added ChildProcess to run async child processes within the event loop (@jmikola) * Feature: [EventLoop] Added `EventLoopInterface::nextTick()`, implemented in all event loops (@jmalloc) @@ -29,25 +31,32 @@ CHANGELOG * Bug fix: [Dns] Properly resolve CNAME aliases * Dependency: Autoloading and filesystem structure now PSR-4 instead of PSR-0 -### 0.3.3 (2013-07-08) +## 0.3.4 (2014-03-30) + + * Bug fix: [Stream] Fixed 100% CPU spike from non-empty write buffer on closed stream + * Buf fix: [Socket] Reset socket to non-blocking after shutting down (PHP bug) + +## 0.3.3 (2013-07-08) + +**Connection state bug fixes** * Bug fix: [EventLoop] No error on removing non-existent streams (@clue) * Bug fix: [EventLoop] Do not silently remove feof listeners in `LibEvLoop` * Bug fix: [Stream] Correctly detect closed connections -### 0.3.2 (2013-05-10) +## 0.3.2 (2013-05-10) * Feature: [Dns] Support default port for IPv6 addresses (@clue) * Bug fix: [Stream] Make sure CompositeStream is closed properly -### 0.3.1 (2013-04-21) +## 0.3.1 (2013-04-21) * Feature: [Socket] Support binding to IPv6 addresses (@clue) * Feature: [SocketClient] Support connecting to IPv6 addresses (@clue) * Bug fix: [Stream] Allow any `ReadableStreamInterface` on `BufferedSink::createPromise()` * Bug fix: [HttpClient] Correct requirement for socket-client -### 0.3.0 (2013-04-14) +## 0.3.0 (2013-04-14) * BC break: [EventLoop] New timers API (@nrk) * BC break: [EventLoop] Remove check on return value from stream callbacks (@nrk) @@ -55,7 +64,7 @@ CHANGELOG * Feature: [SocketClient] New SocketClient component extracted from HttpClient (@clue) * Feature: [Stream] Factory method for BufferedSink -#### EventLoop +### EventLoop * The timer callback now receives a `Timer` instance, with the following useful methods: @@ -71,7 +80,7 @@ CHANGELOG * You can no longer return a boolean from a periodic timer callback to abort it. -#### HttpClient +### HttpClient * `HttpClient\*ConnectionManager` has been moved to `SocketClient\*Connector`, and the `getConnection` method has been renamed to `create`. @@ -84,58 +93,58 @@ CHANGELOG $connector->create($host, $port); -### 0.2.7 (2013-01-05) +## 0.2.7 (2013-01-05) * Bug fix: [EventLoop] Fix libevent timers with PHP 5.3 * Bug fix: [EventLoop] Fix libevent timer cancellation (@nrk) -### 0.2.6 (2012-12-26) +## 0.2.6 (2012-12-26) * Feature: [Cache] New cache component, used by DNS * Bug fix: [Http] Emit end event when Response closes (@beaucollins) * Bug fix: [EventLoop] Plug memory issue in libevent timers (@cameronjacobson) * Bug fix: [EventLoop] Correctly pause LibEvLoop on stop() -### 0.2.5 (2012-11-26) +## 0.2.5 (2012-11-26) * Feature: [Stream] Make BufferedSink trigger progress events on the promise (@jsor) * Feature: [HttpClient] Use a promise-based API internally * Bug fix: [HttpClient] Use DNS resolver correctly -### 0.2.4 (2012-11-18) +## 0.2.4 (2012-11-18) * Feature: [Stream] Added ThroughStream, CompositeStream, ReadableStream and WritableStream * Feature: [Stream] Added BufferedSink * Feature: [Dns] Change to promise-based API (@jsor) -### 0.2.3 (2012-11-14) +## 0.2.3 (2012-11-14) * Feature: LibEvLoop, integration of `php-libev` * Bug fix: Forward drain events from HTTP response (@cs278) * Dependency: Updated guzzle deps to `3.0.*` -### 0.2.2 (2012-10-28) +## 0.2.2 (2012-10-28) * Major: Dropped Espresso as a core component now available as `react/espresso` only * Feature: DNS executor timeout handling (@arnaud-lb) * Feature: DNS retry executor (@arnaud-lb) * Feature: HTTP client (@arnaud-lb) -### 0.2.1 (2012-10-14) +## 0.2.1 (2012-10-14) * Feature: Support HTTP 1.1 continue * Bug fix: Check for EOF in `Buffer::write()` * Bug fix: Make `Espresso\Stack` work with invokables (such as `Espresso\Application`) * Minor adjustments to DNS parser -### 0.2.0 (2012-09-10) +## 0.2.0 (2012-09-10) * Feature: DNS resolver -### 0.1.1 (2012-07-12) +## 0.1.1 (2012-07-12) * Bug fix: Testing and functional against PHP >= 5.3.3 and <= 5.3.8 -### 0.1.0 (2012-07-11) +## 0.1.0 (2012-07-11) * First tagged release From 9f273c44e9198717ae07ae5dc5851ab8a609bf6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 4 Jul 2018 22:50:49 +0200 Subject: [PATCH 26/80] Link to new combined changelog for all ReactPHP components --- CHANGELOG.md | 9 ++++++++- README.md | 3 +++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfcae615..473e57dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,14 @@ ## 0.4.2 (2014-12-11) -**Real Split**: The one where we remember to tag the change were the master repo pulls in all the split components. +**Real Split**: The one where we tag the change where the master repo pulls in all the split components. + +New component releases are now tagged and released in their respective +component repository. See also [core components](https://reactphp.org/#core-components) +to learn more about this. + +This project continues to be under active development and is anything but dead. +You can check out the combined [changelog for all ReactPHP components](https://reactphp.org/changelog.html). ## 0.4.1 (2014-04-13) diff --git a/README.md b/README.md index 7db7bf58..32903e5f 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,9 @@ $ composer require react/event-loop react/http For more details, check out [ReactPHP's homepage](https://reactphp.org) for quickstart examples and usage details. +See also the combined [changelog for all ReactPHP components](https://reactphp.org/changelog.html) +for details about version upgrades. + ## Documentation Superficial documentation can be found in the README files of the individual From d4dfd0de51618061bbb289dc3eb3245ebdeb18da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 7 Nov 2017 22:49:44 +0000 Subject: [PATCH 27/80] Add "Built with ReactPHP" to README --- README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.md b/README.md index 32903e5f..9065ef60 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,38 @@ ReactPHP is non-blocking by default. Use workers for blocking I/O. The missing link between Promise-land and Stream-land, built on top of ReactPHP. [Read the documentation](https://github.com/reactphp/promise-stream) + +## Built with ReactPHP + +* **Thruway** + PHP Client and Router Library for Autobahn and WAMP (Web Application Messaging + Protocol) for Real-Time Application Messaging + [voryx/Thruway](https://github.com/voryx/Thruway) + +* **PPM - PHP Process Manager** + PPM is a process manager, supercharger and load balancer for modern PHP + applications. + [php-pm/php-pm](https://github.com/php-pm/php-pm) + +* **php-ar-drone** + 🚁 Port of node-ar-drone which allows user to control a Parrot AR Drone over + PHP + [jolicode/php-ar-drone](https://github.com/jolicode/php-ar-drone) + +* **Ratchet** + Asynchronous WebSocket server + [ratchetphp/Ratchet](https://github.com/ratchetphp/Ratchet) + +* **Predis\Async** + Asynchronous PHP client library for Redis built on top of ReactPHP + [nrk/predis-async](https://github.com/nrk/predis-async) + +* **clue/redis-server** + A Redis server implementation in pure PHP + [clue/redis-server](https://github.com/clue/php-redis-server) + +[And many more on our wiki page »](https://github.com/reactphp/react/wiki/Users) + ## Getting started ReactPHP consists of individual components. From 692df4cd760285aef0b792221562a99170f4df51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 7 Nov 2017 22:52:24 +0000 Subject: [PATCH 28/80] Add Articles to README --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 9065ef60..253fcd1f 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,25 @@ ReactPHP is non-blocking by default. Use workers for blocking I/O. [And many more on our wiki page »](https://github.com/reactphp/react/wiki/Users) +## Articles + +* **Sergey Zhuk** + A series of articles covering ReactPHP: from the basics to the real + application examples. + [sergeyzhuk.me](http://sergeyzhuk.me/reactphp-series) + +* **Cees-Jan Kiewiet** + Blog series about several ReactPHP components and how they work. + [blog.wyrihaximus.net](http://blog.wyrihaximus.net/categories/reactphp-series/) + +* **Loïc Faugeron** + Super Speed Symfony - ReactPHP. + [gnugat.github.io](https://gnugat.github.io/2016/04/13/super-speed-sf-react-php.html) + +* **Marc J. Schmidt** + Bring High Performance Into Your PHP App (with ReactPHP). + [marcjschmidt.de](http://marcjschmidt.de/blog/2014/02/08/php-high-performance.html) + ## Getting started ReactPHP consists of individual components. From b098acf3c6fcae0091d09b34bceb051a80ca6bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 7 Nov 2017 22:55:50 +0000 Subject: [PATCH 29/80] Add Talks to README --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 253fcd1f..7516cb3a 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,17 @@ ReactPHP is non-blocking by default. Use workers for blocking I/O. Bring High Performance Into Your PHP App (with ReactPHP). [marcjschmidt.de](http://marcjschmidt.de/blog/2014/02/08/php-high-performance.html) +## Talks + +* **Christian Lück** + [Pushing the limits with ReactPHP](https://www.youtube.com/watch?v=-5ZdGUvOqx4) + +* **Jeremy Mikola** + [Async PHP With React](https://www.youtube.com/watch?v=s6xrnYae1FU) + +* **Igor Wiedler** + [Event-driven PHP](https://www.youtube.com/watch?v=MWNcItWuKpI) + ## Getting started ReactPHP consists of individual components. From 26365550aa35886ceb62a1c4a7b323d385a5479b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 5 Jul 2018 18:23:02 +0200 Subject: [PATCH 30/80] Skip integration tests relying on stable internet connection --- .travis.yml | 2 +- README.md | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 85e2bf0f..54c9f908 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,4 +17,4 @@ install: - composer install --no-interaction script: - - php vendor/bin/phpunit --coverage-text + - php vendor/bin/phpunit --coverage-text --exclude-group internet diff --git a/README.md b/README.md index 32903e5f..8d553bf7 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,15 @@ To run the test suite, go to the project root and run: $ php vendor/bin/phpunit ``` +The test suite also contains a number of functional integration tests that rely +on a stable internet connection. Due to the vast number of integration tests, +these are skipped by default on Travis CI. If you also do not want to run these, +they can simply be skipped like this: + +```bash +$ php vendor/bin/phpunit --exclude-group internet +``` + ## License MIT, see LICENSE. From ce3072f7794837a146a3bca4210f87e213078cb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 5 Jul 2018 18:25:05 +0200 Subject: [PATCH 31/80] Update react/cache component to latest v0.5 --- composer.json | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 9efecbf9..3c64d011 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ }, "require": { "php": ">=5.4.0", - "react/cache": "^0.4", + "react/cache": "^0.5", "react/child-process": "^0.5", "react/dns": "^0.4", "react/event-loop": "^0.5", @@ -21,18 +21,8 @@ "react/stream": "^0.7.7" }, "require-dev": { - "phpunit/phpunit": "^4.8.35", + "phpunit/phpunit": "^5.7 || ^4.8.35", "clue/block-react": "^1.1", "clue/stream-filter": "^1.3" - }, - "extra": { - "branch-alias": { - "dev-master": "0.5-dev" - } - }, - "config": { - "platform": { - "php": "5.4" - } } } From 3734c6a0476255b0a2ef47a48e5ec369f3bf24ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 10 Jul 2018 16:48:27 +0200 Subject: [PATCH 32/80] Improve support section --- README.md | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 847bf862..6b9bfb06 100644 --- a/README.md +++ b/README.md @@ -174,15 +174,44 @@ quickstart examples and usage details. See also the combined [changelog for all ReactPHP components](https://reactphp.org/changelog.html) for details about version upgrades. -## Documentation - -Superficial documentation can be found in the README files of the individual -components. See `vendor/react/*/src/README.md`. - -## Community - -Check out #reactphp on irc.freenode.net. Also follow -[@reactphp](https://twitter.com/reactphp) on twitter. +## Support + +Do you have a question and need help with ReactPHP? Don't worry, we're here to help! + +As a first step, check the elaborate documentation that comes with each +component (see links to individual documentation for each component above). +If you find your question is not answered within the documentation, there's a +fair chance that it may be relevant to more people. Please do not hesitate to +file your question as an issue in the relevant component so others can also +participate. + +Check out `#reactphp` on `irc.freenode.net`. You can use the +[Webchat](http://webchat.freenode.net/?channels=%23reactphp) if you don't +already use an IRC client. Many of us are available in this channel, so many +questions get answered in a few minutes to some hours. We also use this channel +to announce all new releases and ongoing development efforts, so consider +setting up an IRC client and idling in this channel for a little longer. + +Also follow [@reactphp](https://twitter.com/reactphp) on Twitter for updates. +We use this mostly for noteworthy, bigger updates and to keep the community +updated about ongoing development efforts. You can always use the `#reactphp` +hashtag if you have anything to share! + +We're a very open project and we prefer public communication whenever possible, +so that more people can participate and help getting the best solutions available. +At the same time, we realize that some things are better addressed in private. +Whether you just want to say *thank you*, want to report a security issue or +want to help sponsor a certain feature development, you can reach out to the +core team in private by sending an email to `support@reactphp.org`. Please keep in +mind that we're a small team of volunteers and do our best to support anybody +reaching out. + +Do you want to support ReactPHP? Awesome! Let's start with letting the the world +know why you think ReactPHP is awesome and try to help others getting on board! +Send a tweet, write a blog post, give a talk at your local user group or +conference or even write a book. There are many ways you can help. You can +always reach out to us in private and help others in our support channels. +Thank you! ## Tests From 7bf23193db569d45636d01e09ca869e47eb82423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 10 Jul 2018 12:39:59 +0200 Subject: [PATCH 33/80] Business speak and project highlights --- README.md | 40 ++++++++++++++++++++++++++++++---------- composer.json | 4 ++-- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 847bf862..83f19efe 100644 --- a/README.md +++ b/README.md @@ -17,22 +17,42 @@
ReactPHP is a low-level library for event-driven programming in PHP. At its core -is an event loop, on top of which it provides low-level utilities, such as: -Streams abstraction, async dns resolver, network client/server, http -client/server, interaction with processes. Third-party libraries can use these +is an event loop, on top of which it provides low-level utilities, such as: +Streams abstraction, async DNS resolver, network client/server, HTTP +client/server and interaction with processes. Third-party libraries can use these components to create async network clients/servers and more. +ReactPHP is production ready and battle-tested with millions of installations +from all kinds of projects around the world. Its event-driven architecture makes +it a perfect fit for efficient network servers and clients handling hundreds or +thousands of concurrent connections, long-running applications and many other +forms of cooperative multitasking with non-blocking I/O operations. What makes +ReactPHP special is its vivid ecosystem with hundreds of third-party libraries +allowing you to integrate with many existing systems, such as common network +services, database systems and other third-party APIs. + +* **Production ready** and battle-tested. +* **Rock-solid** with stable long-term support (LTS) releases. +* **Requires no extensions** and runs on any platform - no excuses! +* Takes advantage of **optional extensions** to get better performance when available. +* **Highly recommends latest version of PHP 7+** for best performance and support. +* **Supports legacy PHP 5.3+ and HHVM** for maximum compatibility. +* **Well designed** and **reusable components**. +* **Decoupled parts** so they can be replaced by alternate implementations. +* Carefully **tested** (unit & functional). +* Promotes **standard PSRs** where possible for maximum interoperability. +* Aims to be **technology neutral**, so you can use your preferred application stack. +* Small **core team of professionals** supported by **large network** of outside contributors. + +ReactPHP is non-blocking by default. Use workers for blocking I/O. The event loop is based on the reactor pattern (hence the name) and strongly inspired by libraries such as EventMachine (Ruby), Twisted (Python) and Node.js (V8). -## Design goals - -* Usable with a bare minimum of PHP extensions, add more extensions to get better performance. -* Provide a standalone event-loop component that can be re-used by other libraries. -* Decouple parts so they can be replaced by alternate implementations. - -ReactPHP is non-blocking by default. Use workers for blocking I/O. +> This repository you're currently looking at is mostly used as a meta + repository to discuss and plan all things @ReactPHP. See the individual + components linked below for more details about each component, its + documentation and source code. ## Core Components diff --git a/composer.json b/composer.json index 3c64d011..8e76c6dc 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "react/react", - "description": "Nuclear Reactor written in PHP.", - "keywords": ["event-loop", "reactor", "asynchronous"], + "description": "ReactPHP: Event-driven, non-blocking I/O with PHP.", + "keywords": ["reactor", "asynchronous", "ReactPHP"], "license": "MIT", "support": { "issues": "https://github.com/reactphp/react/issues", From 1a31e8a517a6311f78f0edf8db78333b578ca955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 11 Jul 2018 16:56:58 +0200 Subject: [PATCH 34/80] Update ReactPHP components to latest v1.0 --- composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 8e76c6dc..27302fad 100644 --- a/composer.json +++ b/composer.json @@ -12,13 +12,13 @@ "react/cache": "^0.5", "react/child-process": "^0.5", "react/dns": "^0.4", - "react/event-loop": "^0.5", + "react/event-loop": "^1.0", "react/http": "^0.8.1", "react/http-client": "^0.5", "react/promise": "^2.1", "react/promise-stream": "^1.1.1", - "react/socket": "^0.8.8", - "react/stream": "^0.7.7" + "react/socket": "^1.0", + "react/stream": "^1.0" }, "require-dev": { "phpunit/phpunit": "^5.7 || ^4.8.35", From 71d550454b7b4d092be8ff2442e69b45ffe35a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 26 Jan 2019 14:15:21 +0100 Subject: [PATCH 35/80] Backwards compatibility with Promise v1 API This simple patch updates this project to target either the current Promise v2 API or the legacy Promise v1 API. While we actively encourage people to use the current Promise v2 API, we still provide active support for the old Promsie v1 API. For the most part, they are fully compatible, see also the https://github.com/reactphp/promise/blob/2.x/CHANGELOG.md for details. The legacy Promise v1 API also supports outdated legacy PHP 5.3 which we understand is still a requirement for a certain non-zero number of projects. That being said, we actively encourage our users to update to the latest version of PHP 7+ for best performance. --- .travis.yml | 7 +++++++ composer.json | 4 ++-- tests/bootstrap.php | 9 +++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 54c9f908..79683903 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: php php: +# - 5.3 # requires old distro, see below - 5.4 - 5.5 - 5.6 @@ -9,7 +10,13 @@ php: - 7.2 - hhvm +# lock distro so new future defaults will not break the build +dist: trusty + matrix: + include: + - php: 5.3 + dist: precise allow_failures: - php: hhvm diff --git a/composer.json b/composer.json index 27302fad..76f34838 100644 --- a/composer.json +++ b/composer.json @@ -8,14 +8,14 @@ "irc": "irc://irc.freenode.org/reactphp" }, "require": { - "php": ">=5.4.0", + "php": ">=5.3.8", "react/cache": "^0.5", "react/child-process": "^0.5", "react/dns": "^0.4", "react/event-loop": "^1.0", "react/http": "^0.8.1", "react/http-client": "^0.5", - "react/promise": "^2.1", + "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", "react/socket": "^1.0", "react/stream": "^1.0" diff --git a/tests/bootstrap.php b/tests/bootstrap.php index fd51842f..db5b8cac 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -18,5 +18,14 @@ // load all legacy test bootstrap scripts from React's components foreach (glob(__DIR__ . '/../vendor/react/*/tests/bootstrap.php') as $b) { + // skip legacy react/promise for now and use manual autoload path from bootstrap config + // @link https://github.com/reactphp/promise/blob/1.x/tests/bootstrap.php + // @link https://github.com/reactphp/promise/blob/2.x/tests/bootstrap.php + if (strpos($b, 'react/promise/tests/bootstrap.php') !== false) { + $autoload->add('React\Promise', __DIR__ . '/../vendor/react/promise/tests'); + $autoload->addPsr4('React\\Promise\\', __DIR__ . '/../vendor/react/promise/tests'); + continue; + } + include $b; } From 5e44ee4505adc6b1ac8674a4197d8845bdd73459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Mon, 28 Jan 2019 11:47:10 +0100 Subject: [PATCH 36/80] Update react/child-process component to latest v0.6 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 76f34838..e36b753a 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "require": { "php": ">=5.3.8", "react/cache": "^0.5", - "react/child-process": "^0.5", + "react/child-process": "^0.6", "react/dns": "^0.4", "react/event-loop": "^1.0", "react/http": "^0.8.1", From 6098d9c394440d29026f776221a4c80f7c18f036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 10 Jul 2019 15:28:25 +0200 Subject: [PATCH 37/80] Only install stable components, remove HTTP and ChildProcess for now --- README.md | 15 +++++++++++++-- composer.json | 3 --- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 19610b8c..effa7feb 100644 --- a/README.md +++ b/README.md @@ -175,19 +175,30 @@ Node.js (V8). ## Getting started -ReactPHP consists of individual components. +ReactPHP consists of a set of individual [components](#core-components). This means that instead of installing something like a "ReactPHP framework", you actually pick only the components that you need. -The recommended way to install these components is [through Composer](http://getcomposer.org). +The recommended way to install these components is [through Composer](https://getcomposer.org). [New to Composer?](http://getcomposer.org/doc/00-intro.md) For example, this may look something like this: ```bash +# recommended install: pick required components $ composer require react/event-loop react/http ``` +As an alternative, we also provide a meta package that will install all stable +components at once. Installing this is only recommended for quick prototyping, +as the list of stable components may change over time. This meta package can be +installed like this: + +```bash +# quick protoyping only: install all stable components +$ composer require react/react:dev-master +``` + For more details, check out [ReactPHP's homepage](https://reactphp.org) for quickstart examples and usage details. diff --git a/composer.json b/composer.json index e36b753a..6eb0f646 100644 --- a/composer.json +++ b/composer.json @@ -10,11 +10,8 @@ "require": { "php": ">=5.3.8", "react/cache": "^0.5", - "react/child-process": "^0.6", "react/dns": "^0.4", "react/event-loop": "^1.0", - "react/http": "^0.8.1", - "react/http-client": "^0.5", "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", "react/socket": "^1.0", From 10fea32c89e61a978e7fe1c53b133dfb314285d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 11 Jul 2019 12:18:50 +0200 Subject: [PATCH 38/80] Update DNS and Cache components to stable LTS release --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 6eb0f646..4e8a1220 100644 --- a/composer.json +++ b/composer.json @@ -9,8 +9,8 @@ }, "require": { "php": ">=5.3.8", - "react/cache": "^0.5", - "react/dns": "^0.4", + "react/cache": "^1.0", + "react/dns": "^1.0", "react/event-loop": "^1.0", "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", From 25b2bc82d3c8715b86d85fd32723879b12f71ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 11 Jul 2019 17:47:00 +0200 Subject: [PATCH 39/80] Temporarily skip broken tests from Socket component See https://github.com/reactphp/socket/issues/207 for upstream report. --- phpunit.xml.dist | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index d7f645a3..4954d676 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,6 +14,9 @@ ./vendor/react/*/tests/ + + ./vendor/react/socket/tests/ConnectorTest.php + ./vendor/react/socket/tests/DnsConnectorTest.php From f11a13b09febb6676febd1f8f70befd0593bffb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 11 Jul 2019 17:59:40 +0200 Subject: [PATCH 40/80] Prepare v1.0.0 release --- CHANGELOG.md | 17 +++++++++++++++++ README.md | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 473e57dd..9f64ba9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 1.0.0 (2019-07-11) + +* First stable LTS release, now following [SemVer](https://semver.org/). + We'd like to emphasize that this project is production ready and battle-tested. + We plan to support all long-term support (LTS) releases for at least 24 months, + so you have a rock-solid foundation to build on top of. + +> ReactPHP consists of a set of individual [components](https://reactphp.org/#core-components). + This means that instead of installing something like a "ReactPHP framework", + you actually can pick only the components that you need. As an alternative, + we also provide this meta package that will install all stable components at + once. Installing this is only recommended for quick prototyping, as the list + of stable components may change over time. + In other words, this meta package does not contain any source code and + instead only consists of links to all our main components, see also our + [list of components](https://reactphp.org/#core-components) for more details. + ## 0.4.2 (2014-12-11) **Real Split**: The one where we tag the change where the master repo pulls in all the split components. diff --git a/README.md b/README.md index effa7feb..5408d010 100644 --- a/README.md +++ b/README.md @@ -179,6 +179,7 @@ ReactPHP consists of a set of individual [components](#core-components). This means that instead of installing something like a "ReactPHP framework", you actually pick only the components that you need. +This project follows [SemVer](https://semver.org/) for all its stable components. The recommended way to install these components is [through Composer](https://getcomposer.org). [New to Composer?](http://getcomposer.org/doc/00-intro.md) @@ -196,7 +197,7 @@ installed like this: ```bash # quick protoyping only: install all stable components -$ composer require react/react:dev-master +$ composer require react/react:^1.0 ``` For more details, check out [ReactPHP's homepage](https://reactphp.org) for From 0660ce8749face66918f75fd965d571ddcb8b8e3 Mon Sep 17 00:00:00 2001 From: Marc Morera Date: Fri, 16 Aug 2019 14:52:18 +0200 Subject: [PATCH 41/80] Added "When ReactPHP meet Symfony" article --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 5408d010..327f9638 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,10 @@ Node.js (V8). * **Marc J. Schmidt** Bring High Performance Into Your PHP App (with ReactPHP). [marcjschmidt.de](http://marcjschmidt.de/blog/2014/02/08/php-high-performance.html) + +* **Marc Morera** + When ReactPHP meet Symfony + [medium.com/@apisearch](https://medium.com/@apisearch/symfony-and-reactphp-series-82082167f6fb) ## Talks From 9a1d2e928fa332582b36fdcc0ce6c710bc84d60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 17 Nov 2019 20:21:36 +0100 Subject: [PATCH 42/80] Link to our official Gitter chat room We've deprecated our old IRC channel and now use a Gitter chat room instead: https://gitter.im/reactphp/reactphp --- README.md | 9 ++++----- composer.json | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5408d010..39b112fb 100644 --- a/README.md +++ b/README.md @@ -217,12 +217,11 @@ fair chance that it may be relevant to more people. Please do not hesitate to file your question as an issue in the relevant component so others can also participate. -Check out `#reactphp` on `irc.freenode.net`. You can use the -[Webchat](http://webchat.freenode.net/?channels=%23reactphp) if you don't -already use an IRC client. Many of us are available in this channel, so many -questions get answered in a few minutes to some hours. We also use this channel +You can also check out our official [Gitter chat room](https://gitter.im/reactphp/reactphp). +Most of the people involved in this project are available in this chat room, so many +questions get answered in a few minutes to some hours. We also use this chat room to announce all new releases and ongoing development efforts, so consider -setting up an IRC client and idling in this channel for a little longer. +staying in this chat room for a little longer. Also follow [@reactphp](https://twitter.com/reactphp) on Twitter for updates. We use this mostly for noteworthy, bigger updates and to keep the community diff --git a/composer.json b/composer.json index 4e8a1220..0cb8e066 100644 --- a/composer.json +++ b/composer.json @@ -2,10 +2,11 @@ "name": "react/react", "description": "ReactPHP: Event-driven, non-blocking I/O with PHP.", "keywords": ["reactor", "asynchronous", "ReactPHP"], + "homepage": "https://reactphp.org/", "license": "MIT", "support": { "issues": "https://github.com/reactphp/react/issues", - "irc": "irc://irc.freenode.org/reactphp" + "chat": "https://gitter.im/reactphp/reactphp" }, "require": { "php": ">=5.3.8", From 5761b2e7f600bf5be2941e253e9239f01d9fab2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Mon, 18 Nov 2019 13:56:51 +0100 Subject: [PATCH 43/80] Update links to project meta repo --- README.md | 2 +- composer.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 77d8701f..b8d6aa53 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@
- Build Status + Build Status

diff --git a/composer.json b/composer.json index 0cb8e066..90586b7f 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,6 @@ "homepage": "https://reactphp.org/", "license": "MIT", "support": { - "issues": "https://github.com/reactphp/react/issues", "chat": "https://gitter.im/reactphp/reactphp" }, "require": { From c67feba6c8c461b0cc0e00fce2f0fca2b4bad994 Mon Sep 17 00:00:00 2001 From: Sam Reed Date: Sun, 1 Dec 2019 01:59:57 +0000 Subject: [PATCH 44/80] Add .gitattributes to exclude dev files from exports --- .gitattributes | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..982c460d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +/.gitattributes export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/phpunit.xml.dist export-ignore +/tests export-ignore From f509da189ed5d9479c4d1d55af80b9c5ab9557ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 1 Jul 2020 15:19:21 +0200 Subject: [PATCH 45/80] Install from source to actually run any tests (excluded otherwise) --- composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/composer.json b/composer.json index 90586b7f..712959c1 100644 --- a/composer.json +++ b/composer.json @@ -21,5 +21,10 @@ "phpunit/phpunit": "^5.7 || ^4.8.35", "clue/block-react": "^1.1", "clue/stream-filter": "^1.3" + }, + "config": { + "preferred-install": { + "react/*": "source" + } } } From 57ac1c9bd4d0cd7dd703f9dc02a8a7b6232148d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 22 Mar 2020 15:04:27 +0100 Subject: [PATCH 46/80] Upgrade react/socket to avoid skipping DNS tests Refs https://github.com/reactphp/socket/pull/208 --- composer.json | 4 ++-- phpunit.xml.dist | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 712959c1..d4f7e176 100644 --- a/composer.json +++ b/composer.json @@ -10,11 +10,11 @@ "require": { "php": ">=5.3.8", "react/cache": "^1.0", - "react/dns": "^1.0", + "react/dns": "^1.1", "react/event-loop": "^1.0", "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", - "react/socket": "^1.0", + "react/socket": "^1.4", "react/stream": "^1.0" }, "require-dev": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4954d676..d7f645a3 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,9 +14,6 @@ ./vendor/react/*/tests/ - - ./vendor/react/socket/tests/ConnectorTest.php - ./vendor/react/socket/tests/DnsConnectorTest.php From 52f330eaab056b61ed86ea81fb37ce33588e0174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 10 Jul 2020 17:36:44 +0200 Subject: [PATCH 47/80] Run tests on PHP 7.4 and simplify test matrix Refs https://github.com/reactphp/dns/pull/156 and https://github.com/reactphp/promise-timer/pull/41 --- .travis.yml | 21 ++++++++++----------- composer.json | 7 ++++--- phpunit.xml.dist | 14 ++------------ 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/.travis.yml b/.travis.yml index 79683903..bc648517 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,5 @@ language: php -php: -# - 5.3 # requires old distro, see below - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - 7.1 - - 7.2 - - hhvm - # lock distro so new future defaults will not break the build dist: trusty @@ -17,8 +7,17 @@ matrix: include: - php: 5.3 dist: precise + - php: 5.4 + - php: 5.5 + - php: 5.6 + - php: 7.0 + - php: 7.1 + - php: 7.2 + - php: 7.3 + - php: 7.4 + - php: hhvm-3.18 allow_failures: - - php: hhvm + - php: hhvm-3.18 install: - composer install --no-interaction diff --git a/composer.json b/composer.json index d4f7e176..b56807fc 100644 --- a/composer.json +++ b/composer.json @@ -10,17 +10,18 @@ "require": { "php": ">=5.3.8", "react/cache": "^1.0", - "react/dns": "^1.1", + "react/dns": "^1.3", "react/event-loop": "^1.0", "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", + "react/promise-timer": "^1.6", "react/socket": "^1.4", "react/stream": "^1.0" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^4.8.35", "clue/block-react": "^1.1", - "clue/stream-filter": "^1.3" + "clue/stream-filter": "^1.3", + "phpunit/phpunit": "^7.0 || ^6.0 || ^5.7 || ^4.8.35" }, "config": { "preferred-install": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index d7f645a3..1cf2f8a6 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,18 +1,8 @@ - + - + ./vendor/react/*/tests/ From 40d469f311bae28243be9d1c925b869d31160a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 10 Jul 2020 18:15:03 +0200 Subject: [PATCH 48/80] Skip affected test cases to avoid bogus test failure on PHP 7.4 The build error on PHP 7.4 will be addressed via https://github.com/reactphp/dns/pull/164. Interestingly, it fails in the `FunctionalResolverTest` class and does not fail anymore by excluding some other test cases. It can only be reproduced by running: ``` $ vendor/bin/phpunit --coverage-text --exclude-group internet ``` It can not be reproduced when running on any other PHP version, when `ext-xdebug` is disabled, when coverage is not collected or when not excluding this group. This means the test failure is bogus. We work around this by temporarily skipping some test case for now. --- phpunit.xml.dist | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 1cf2f8a6..4dc40d79 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -4,6 +4,10 @@ ./vendor/react/*/tests/ + + ./vendor/react/dns/tests/FunctionalResolverTest.php + ./vendor/react/dns/tests/Query/CoopExecutorTest.php + ./vendor/react/dns/tests/Query/SelectiveTransportExecutorTest.php From 4040b609cac80184286721a7a595cd4b1120a7a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 11 Jul 2020 15:38:46 +0200 Subject: [PATCH 49/80] Add HTTP client and server implementation via react/http --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index b56807fc..d9e908cb 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "react/cache": "^1.0", "react/dns": "^1.3", "react/event-loop": "^1.0", + "react/http": "^1.0", "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", "react/promise-timer": "^1.6", From 527e5cc6c88c85858b39f1a58e32f3173f5233c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 11 Jul 2020 18:33:07 +0200 Subject: [PATCH 50/80] Prepare v1.1.0 release --- CHANGELOG.md | 13 +++++++++++++ README.md | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f64ba9f..061cbd27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 1.1.0 (2020-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2020/announcing-reactphp-http). + +* Feature: Add event-driven, streaming HTTP client and server implementation via [`react/http`](https://reactphp.org/http/). + (#440 by @clue) + +* Update documentation to link to project meta repo and link to our official Gitter chat room. + (#432 and #433 by @clue) + +* Improve test suite to run tests on PHP 7.4 and add `.gitattributes` to exclude dev files from exports. + (#434 by @reedy and #439 by @clue) + ## 1.0.0 (2019-07-11) * First stable LTS release, now following [SemVer](https://semver.org/). diff --git a/README.md b/README.md index b8d6aa53..6c4e13e3 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ installed like this: ```bash # quick protoyping only: install all stable components -$ composer require react/react:^1.0 +$ composer require react/react:^1.1 ``` For more details, check out [ReactPHP's homepage](https://reactphp.org) for From c6f3bab8ab87a567b0a9b72a880f56568e5fb5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 22 Jan 2021 19:51:22 +0100 Subject: [PATCH 51/80] Use GitHub actions for continuous integration (CI) Bye bye Travis CI, you've served us well. --- .gitattributes | 2 +- .github/workflows/ci.yml | 42 ++++++++++++++++++++++++++++++++++++++++ .travis.yml | 26 ------------------------- README.md | 4 ++-- 4 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml diff --git a/.gitattributes b/.gitattributes index 982c460d..4a09071e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,5 @@ /.gitattributes export-ignore +/.github/ export-ignore /.gitignore export-ignore -/.travis.yml export-ignore /phpunit.xml.dist export-ignore /tests export-ignore diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..4be7ca28 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: CI + +on: + push: + pull_request: + +jobs: + PHPUnit: + name: PHPUnit (PHP ${{ matrix.php }}) + runs-on: ubuntu-18.04 + strategy: + matrix: + php: + - 7.4 + - 7.3 + - 7.2 + - 7.1 + - 7.0 + - 5.6 + - 5.5 + - 5.4 + - 5.3 + steps: + - uses: actions/checkout@v2 + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: xdebug + - run: composer install + - run: vendor/bin/phpunit --coverage-text --exclude-group internet + + PHPUnit-hhvm: + name: PHPUnit (HHVM) + runs-on: ubuntu-18.04 + continue-on-error: true + steps: + - uses: actions/checkout@v2 + - uses: azjezz/setup-hhvm@v1 + with: + version: lts-3.30 + - run: hhvm $(which composer) require phpunit/phpunit:^5 --dev # requires legacy phpunit + - run: hhvm vendor/bin/phpunit --exclude-group internet diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index bc648517..00000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: php - -# lock distro so new future defaults will not break the build -dist: trusty - -matrix: - include: - - php: 5.3 - dist: precise - - php: 5.4 - - php: 5.5 - - php: 5.6 - - php: 7.0 - - php: 7.1 - - php: 7.2 - - php: 7.3 - - php: 7.4 - - php: hhvm-3.18 - allow_failures: - - php: hhvm-3.18 - -install: - - composer install --no-interaction - -script: - - php vendor/bin/phpunit --coverage-text --exclude-group internet diff --git a/README.md b/README.md index 6c4e13e3..ba93429a 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@
- Build Status + Build Status

@@ -265,7 +265,7 @@ $ php vendor/bin/phpunit The test suite also contains a number of functional integration tests that rely on a stable internet connection. Due to the vast number of integration tests, -these are skipped by default on Travis CI. If you also do not want to run these, +these are skipped by default during CI runs. If you also do not want to run these, they can simply be skipped like this: ```bash From 69c680cb311107a65a6c8fe0ed9a636717cbb3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 10 Jul 2021 10:03:18 +0200 Subject: [PATCH 52/80] Simplify usage by supporting new default loop --- README.md | 19 +++++++++++++++++++ composer.json | 12 ++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ba93429a..19e5da55 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,25 @@ Streams abstraction, async DNS resolver, network client/server, HTTP client/server and interaction with processes. Third-party libraries can use these components to create async network clients/servers and more. +```php +$server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) { + return new React\Http\Message\Response( + 200, + array( + 'Content-Type' => 'text/plain' + ), + "Hello World!\n" + ); +}); + +$socket = new React\Socket\Server('127.0.0.1:8080'); +$server->listen($socket); + +echo "Server running at http://127.0.0.1:8080" . PHP_EOL; +``` + +This simple web server written in ReactPHP responds with "Hello World!" for every request. + ReactPHP is production ready and battle-tested with millions of installations from all kinds of projects around the world. Its event-driven architecture makes it a perfect fit for efficient network servers and clients handling hundreds or diff --git a/composer.json b/composer.json index d9e908cb..1045b721 100644 --- a/composer.json +++ b/composer.json @@ -10,14 +10,14 @@ "require": { "php": ">=5.3.8", "react/cache": "^1.0", - "react/dns": "^1.3", - "react/event-loop": "^1.0", - "react/http": "^1.0", + "react/dns": "^1.8", + "react/event-loop": "^1.2", + "react/http": "^1.4", "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", - "react/promise-timer": "^1.6", - "react/socket": "^1.4", - "react/stream": "^1.0" + "react/promise-timer": "^1.7", + "react/socket": "^1.8", + "react/stream": "^1.2" }, "require-dev": { "clue/block-react": "^1.1", From e8b02e710c3659d548f30b73d6ed93d18ca57b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 9 Mar 2021 17:10:23 +0100 Subject: [PATCH 53/80] Don't skip tests on PHP 7.4 now that this has been fixed upstream --- phpunit.xml.dist | 4 ---- 1 file changed, 4 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4dc40d79..1cf2f8a6 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -4,10 +4,6 @@ ./vendor/react/*/tests/ - - ./vendor/react/dns/tests/FunctionalResolverTest.php - ./vendor/react/dns/tests/Query/CoopExecutorTest.php - ./vendor/react/dns/tests/Query/SelectiveTransportExecutorTest.php From 5e74f4a0eaa13f558ede10d5ca50622edeee2c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 11 Jul 2021 15:28:52 +0200 Subject: [PATCH 54/80] Skip bogus test failures --- phpunit.xml.dist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 1cf2f8a6..69bbf0ea 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -4,6 +4,8 @@ ./vendor/react/*/tests/ + + ./vendor/react/event-loop/tests/BinTest.php From 1967584fde3d434d356b32b054e89ed5c1887c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 11 Jul 2021 15:39:02 +0200 Subject: [PATCH 55/80] Prepare v1.2.0 release --- CHANGELOG.md | 7 +++++++ README.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 061cbd27..c588ac1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 1.2.0 (2021-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2021/announcing-reactphp-default-loop). + +* Feature: Simplify usage by supporting new [default loop](https://reactphp.org/event-loop/#loop). + (#445 by @clue) + ## 1.1.0 (2020-07-11) A major new feature release, see [**release announcement**](https://clue.engineering/2020/announcing-reactphp-http). diff --git a/README.md b/README.md index 19e5da55..0adc0fb1 100644 --- a/README.md +++ b/README.md @@ -220,7 +220,7 @@ installed like this: ```bash # quick protoyping only: install all stable components -$ composer require react/react:^1.1 +$ composer require react/react:^1.2 ``` For more details, check out [ReactPHP's homepage](https://reactphp.org) for From 099e24268215c0a739d805b5ecb477eb64ba5af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 7 Aug 2021 11:57:01 +0200 Subject: [PATCH 56/80] Update HTTP server example for reactphp/http v1.5.0 --- README.md | 4 ++-- composer.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0adc0fb1..d4d54303 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ client/server and interaction with processes. Third-party libraries can use thes components to create async network clients/servers and more. ```php -$server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) { +$server = new React\Http\HttpServer(function (Psr\Http\Message\ServerRequestInterface $request) { return new React\Http\Message\Response( 200, array( @@ -33,7 +33,7 @@ $server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterfac ); }); -$socket = new React\Socket\Server('127.0.0.1:8080'); +$socket = new React\Socket\SocketServer('127.0.0.1:8080'); $server->listen($socket); echo "Server running at http://127.0.0.1:8080" . PHP_EOL; diff --git a/composer.json b/composer.json index 1045b721..731113fe 100644 --- a/composer.json +++ b/composer.json @@ -12,11 +12,11 @@ "react/cache": "^1.0", "react/dns": "^1.8", "react/event-loop": "^1.2", - "react/http": "^1.4", + "react/http": "^1.5", "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", "react/promise-timer": "^1.7", - "react/socket": "^1.8", + "react/socket": "^1.9", "react/stream": "^1.2" }, "require-dev": { From 2aec8c918486fac5428f83b0f445c1ce0cfe8dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 3 Feb 2022 15:31:17 +0100 Subject: [PATCH 57/80] Update HTTP server example for reactphp/http v1.6.0 --- README.md | 6 +----- composer.json | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d4d54303..adfd7c3d 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,7 @@ components to create async network clients/servers and more. ```php $server = new React\Http\HttpServer(function (Psr\Http\Message\ServerRequestInterface $request) { - return new React\Http\Message\Response( - 200, - array( - 'Content-Type' => 'text/plain' - ), + return React\Http\Message\Response::plaintext( "Hello World!\n" ); }); diff --git a/composer.json b/composer.json index 731113fe..b3706086 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "react/cache": "^1.0", "react/dns": "^1.8", "react/event-loop": "^1.2", - "react/http": "^1.5", + "react/http": "^1.6", "react/promise": "^2.1 || ^1.2", "react/promise-stream": "^1.1.1", "react/promise-timer": "^1.7", From db19ce4e7ca9afa4c3452addecde7955de1bb472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 4 Feb 2022 09:07:03 +0100 Subject: [PATCH 58/80] Skip bogus test failures --- phpunit.xml.dist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 69bbf0ea..2b235aaa 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -6,6 +6,8 @@ ./vendor/react/*/tests/ ./vendor/react/event-loop/tests/BinTest.php + + ./vendor/react/http/tests/HttpServerTest.php From 67f301da4cca8736b7a1aa18897f74818f542160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 4 Feb 2022 08:06:03 +0100 Subject: [PATCH 59/80] Update test suite to support PHPUnit 9 --- .gitattributes | 3 ++- .github/workflows/ci.yml | 5 ++++- composer.json | 10 +++++----- phpunit.xml.dist | 16 ++++++++++------ phpunit.xml.legacy | 22 ++++++++++++++++++++++ 5 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 phpunit.xml.legacy diff --git a/.gitattributes b/.gitattributes index 4a09071e..21be40ca 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,4 +2,5 @@ /.github/ export-ignore /.gitignore export-ignore /phpunit.xml.dist export-ignore -/tests export-ignore +/phpunit.xml.legacy export-ignore +/tests/ export-ignore diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4be7ca28..02ec2a25 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,9 @@ jobs: coverage: xdebug - run: composer install - run: vendor/bin/phpunit --coverage-text --exclude-group internet + if: ${{ matrix.php >= 7.3 }} + - run: vendor/bin/phpunit --coverage-text --exclude-group internet -c phpunit.xml.legacy + if: ${{ matrix.php < 7.3 }} PHPUnit-hhvm: name: PHPUnit (HHVM) @@ -38,5 +41,5 @@ jobs: - uses: azjezz/setup-hhvm@v1 with: version: lts-3.30 - - run: hhvm $(which composer) require phpunit/phpunit:^5 --dev # requires legacy phpunit + - run: hhvm $(which composer) install - run: hhvm vendor/bin/phpunit --exclude-group internet diff --git a/composer.json b/composer.json index b3706086..42ce9ddf 100644 --- a/composer.json +++ b/composer.json @@ -9,20 +9,20 @@ }, "require": { "php": ">=5.3.8", - "react/cache": "^1.0", + "react/cache": "^1.1", "react/dns": "^1.8", "react/event-loop": "^1.2", "react/http": "^1.6", - "react/promise": "^2.1 || ^1.2", - "react/promise-stream": "^1.1.1", + "react/promise": "^2.8 || ^1.2", + "react/promise-stream": "^1.3", "react/promise-timer": "^1.7", "react/socket": "^1.9", "react/stream": "^1.2" }, "require-dev": { - "clue/block-react": "^1.1", + "clue/block-react": "^1.5", "clue/stream-filter": "^1.3", - "phpunit/phpunit": "^7.0 || ^6.0 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "config": { "preferred-install": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 2b235aaa..918f9b84 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,6 +1,11 @@ - + + ./vendor/react/*/tests/ @@ -10,10 +15,9 @@ ./vendor/react/http/tests/HttpServerTest.php - - - + + ./vendor/react/*/src/ - - + + diff --git a/phpunit.xml.legacy b/phpunit.xml.legacy new file mode 100644 index 00000000..35922e02 --- /dev/null +++ b/phpunit.xml.legacy @@ -0,0 +1,22 @@ + + + + + + + ./vendor/react/*/tests/ + + ./vendor/react/event-loop/tests/BinTest.php + + ./vendor/react/http/tests/HttpServerTest.php + + + + + ./vendor/react/*/src/ + + + From 767d11e86b66a08703c5ad8b849b9939e872eafb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 11 Feb 2022 11:54:00 +0100 Subject: [PATCH 60/80] Support PHP 8.1 release --- .github/workflows/ci.yml | 2 ++ composer.json | 8 ++++---- phpunit.xml.dist | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02ec2a25..75d8208f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,8 @@ jobs: strategy: matrix: php: + - 8.1 + - 8.0 - 7.4 - 7.3 - 7.2 diff --git a/composer.json b/composer.json index 42ce9ddf..7ff078e4 100644 --- a/composer.json +++ b/composer.json @@ -10,13 +10,13 @@ "require": { "php": ">=5.3.8", "react/cache": "^1.1", - "react/dns": "^1.8", + "react/dns": "^1.9", "react/event-loop": "^1.2", "react/http": "^1.6", - "react/promise": "^2.8 || ^1.2", + "react/promise": "^2.9 || ^1.2", "react/promise-stream": "^1.3", - "react/promise-timer": "^1.7", - "react/socket": "^1.9", + "react/promise-timer": "^1.8", + "react/socket": "^1.11", "react/stream": "^1.2" }, "require-dev": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 918f9b84..fdf4d22a 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -5,12 +5,14 @@ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd" bootstrap="tests/bootstrap.php" cacheResult="false" - colors="true"> + colors="true" + convertDeprecationsToExceptions="true"> ./vendor/react/*/tests/ ./vendor/react/event-loop/tests/BinTest.php + ./vendor/react/event-loop/tests/ExtLibeventLoopTest.php ./vendor/react/http/tests/HttpServerTest.php From 2c2019a8786c9318129841ae84a90ca77d66d9f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 18 Mar 2022 18:14:49 +0100 Subject: [PATCH 61/80] Update test suite to avoid skipping EventLoop tests --- composer.json | 2 +- phpunit.xml.dist | 3 --- phpunit.xml.legacy | 2 -- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 7ff078e4..1db55ded 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "php": ">=5.3.8", "react/cache": "^1.1", "react/dns": "^1.9", - "react/event-loop": "^1.2", + "react/event-loop": "^1.3", "react/http": "^1.6", "react/promise": "^2.9 || ^1.2", "react/promise-stream": "^1.3", diff --git a/phpunit.xml.dist b/phpunit.xml.dist index fdf4d22a..15445651 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -10,9 +10,6 @@ ./vendor/react/*/tests/ - - ./vendor/react/event-loop/tests/BinTest.php - ./vendor/react/event-loop/tests/ExtLibeventLoopTest.php ./vendor/react/http/tests/HttpServerTest.php diff --git a/phpunit.xml.legacy b/phpunit.xml.legacy index 35922e02..8a0d9b7f 100644 --- a/phpunit.xml.legacy +++ b/phpunit.xml.legacy @@ -8,8 +8,6 @@ ./vendor/react/*/tests/ - - ./vendor/react/event-loop/tests/BinTest.php ./vendor/react/http/tests/HttpServerTest.php From 407f9a928750c5a4a239d98555952818625594f4 Mon Sep 17 00:00:00 2001 From: Simon Frings Date: Tue, 12 Apr 2022 10:59:33 +0200 Subject: [PATCH 62/80] Fix legacy HHVM build by downgrading Composer --- .github/workflows/ci.yml | 1 + README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 75d8208f..90bced73 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,5 +43,6 @@ jobs: - uses: azjezz/setup-hhvm@v1 with: version: lts-3.30 + - run: composer self-update --2.2 # downgrade Composer for HHVM - run: hhvm $(which composer) install - run: hhvm vendor/bin/phpunit --exclude-group internet diff --git a/README.md b/README.md index adfd7c3d..2e7700b2 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@
- Build Status + Build Status

From a01b9cd36a597f13260025e0ffe3c218dba095b5 Mon Sep 17 00:00:00 2001 From: Nicolas Hedger Date: Mon, 20 Jun 2022 16:59:20 +0200 Subject: [PATCH 63/80] chore(docs): remove leading dollar sign --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2e7700b2..7f1c6e31 100644 --- a/README.md +++ b/README.md @@ -206,7 +206,7 @@ For example, this may look something like this: ```bash # recommended install: pick required components -$ composer require react/event-loop react/http +composer require react/event-loop react/http ``` As an alternative, we also provide a meta package that will install all stable @@ -216,7 +216,7 @@ installed like this: ```bash # quick protoyping only: install all stable components -$ composer require react/react:^1.2 +composer require react/react:^1.2 ``` For more details, check out [ReactPHP's homepage](https://reactphp.org) for @@ -269,13 +269,13 @@ To run the test suite, you first need to clone this repo and then install all dependencies [through Composer](https://getcomposer.org): ```bash -$ composer install +composer install ``` To run the test suite, go to the project root and run: ```bash -$ php vendor/bin/phpunit +vendor/bin/phpunit ``` The test suite also contains a number of functional integration tests that rely @@ -284,7 +284,7 @@ these are skipped by default during CI runs. If you also do not want to run thes they can simply be skipped like this: ```bash -$ php vendor/bin/phpunit --exclude-group internet +vendor/bin/phpunit --exclude-group internet ``` ## License From 2f8eb2f54cf8609003fead4d8b2baf53f5f688e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 2 Jul 2022 12:01:13 +0200 Subject: [PATCH 64/80] Add new Async component to core components --- .github/workflows/ci.yml | 2 +- README.md | 3 +++ composer.json | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90bced73..7759d40c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,5 +44,5 @@ jobs: with: version: lts-3.30 - run: composer self-update --2.2 # downgrade Composer for HHVM - - run: hhvm $(which composer) install + - run: hhvm $(which composer) require react/async:^2@dev # downgrade Async component for HHVM - run: hhvm vendor/bin/phpunit --exclude-group internet diff --git a/README.md b/README.md index 7f1c6e31..746374b9 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,9 @@ Node.js (V8). Promises/A implementation for PHP. [Read the documentation](https://github.com/reactphp/promise) +* **Async** + Async utilities and fibers for ReactPHP. + [Read the documentation](https://github.com/reactphp/async) ## Network Components diff --git a/composer.json b/composer.json index 1db55ded..b632d081 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ }, "require": { "php": ">=5.3.8", + "react/async": "^4@dev || ^3@dev || ^2@dev", "react/cache": "^1.1", "react/dns": "^1.9", "react/event-loop": "^1.3", From 18df373539bd9863b8e685767c35ab2628d0be88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 10 Jul 2022 17:53:52 +0200 Subject: [PATCH 65/80] Update to stable releases of new Async component --- .github/workflows/ci.yml | 2 +- composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7759d40c..39888dbb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,5 +44,5 @@ jobs: with: version: lts-3.30 - run: composer self-update --2.2 # downgrade Composer for HHVM - - run: hhvm $(which composer) require react/async:^2@dev # downgrade Async component for HHVM + - run: hhvm $(which composer) require react/async:^2 # downgrade Async component for HHVM - run: hhvm vendor/bin/phpunit --exclude-group internet diff --git a/composer.json b/composer.json index b632d081..64f517de 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ }, "require": { "php": ">=5.3.8", - "react/async": "^4@dev || ^3@dev || ^2@dev", + "react/async": "^4 || ^3 || ^2", "react/cache": "^1.1", "react/dns": "^1.9", "react/event-loop": "^1.3", From d442dfe0e4b59f5d46c6604a6d502b6031129d4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 24 Jun 2022 12:23:07 +0200 Subject: [PATCH 66/80] Improve quickstart example, update HTTP component description --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7f1c6e31..fd21baf3 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,13 @@ client/server and interaction with processes. Third-party libraries can use thes components to create async network clients/servers and more. ```php + Date: Mon, 11 Jul 2022 16:40:40 +0200 Subject: [PATCH 67/80] Prepare v1.3.0 release --- CHANGELOG.md | 16 ++++++++++++++++ README.md | 10 +++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c588ac1f..45b68ac2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 1.3.0 (2022-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2022/announcing-reactphp-async). + +* Feature: Add new Async component to core components. + (#458 by @clue) + +* Feature: Support PHP 8.1 release. + (#451 by @clue) + +* Improve documentation, update HTTP server example for reactphp/http v1.6.0 release. + (#449 and #459 by @clue and #457 by @nhedger) + +* Improve test suite, support PHPUnit 9 and update dependencies to avoid skipping tests. + (#450 and #454 by @clue and #455 by @SimonFrings) + ## 1.2.0 (2021-07-11) A major new feature release, see [**release announcement**](https://clue.engineering/2021/announcing-reactphp-default-loop). diff --git a/README.md b/README.md index eb2b73d4..4cf54602 100644 --- a/README.md +++ b/README.md @@ -202,8 +202,8 @@ This means that instead of installing something like a "ReactPHP framework", you pick only the components that you need. This project follows [SemVer](https://semver.org/) for all its stable components. -The recommended way to install these components is [through Composer](https://getcomposer.org). -[New to Composer?](http://getcomposer.org/doc/00-intro.md) +The recommended way to install these components is [through Composer](https://getcomposer.org/). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) For example, this may look something like this: @@ -219,10 +219,10 @@ installed like this: ```bash # quick protoyping only: install all stable components -composer require react/react:^1.2 +composer require react/react:^1.3 ``` -For more details, check out [ReactPHP's homepage](https://reactphp.org) for +For more details, check out [ReactPHP's homepage](https://reactphp.org/) for quickstart examples and usage details. See also the combined [changelog for all ReactPHP components](https://reactphp.org/changelog.html) @@ -269,7 +269,7 @@ Thank you! ## Tests To run the test suite, you first need to clone this repo and then install all -dependencies [through Composer](https://getcomposer.org): +dependencies [through Composer](https://getcomposer.org/): ```bash composer install From 342c5e1b2ca53befe73e0e18f7e610c0241bba8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 10 Aug 2022 19:11:49 +0200 Subject: [PATCH 68/80] Update test suite to use new reactphp/async package --- composer.json | 9 ++++----- phpunit.xml.dist | 4 ++-- phpunit.xml.legacy | 2 -- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 64f517de..175d9b5c 100644 --- a/composer.json +++ b/composer.json @@ -11,17 +11,16 @@ "php": ">=5.3.8", "react/async": "^4 || ^3 || ^2", "react/cache": "^1.1", - "react/dns": "^1.9", + "react/dns": "^1.10", "react/event-loop": "^1.3", - "react/http": "^1.6", + "react/http": "^1.7", "react/promise": "^2.9 || ^1.2", - "react/promise-stream": "^1.3", + "react/promise-stream": "^1.5", "react/promise-timer": "^1.8", - "react/socket": "^1.11", + "react/socket": "^1.12", "react/stream": "^1.2" }, "require-dev": { - "clue/block-react": "^1.5", "clue/stream-filter": "^1.3", "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 15445651..419e177a 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -9,9 +9,9 @@ convertDeprecationsToExceptions="true"> + + ./vendor/react/event-loop/tests/ ./vendor/react/*/tests/ - - ./vendor/react/http/tests/HttpServerTest.php diff --git a/phpunit.xml.legacy b/phpunit.xml.legacy index 8a0d9b7f..00fceeb4 100644 --- a/phpunit.xml.legacy +++ b/phpunit.xml.legacy @@ -8,8 +8,6 @@ ./vendor/react/*/tests/ - - ./vendor/react/http/tests/HttpServerTest.php From cdfd338a5221f9fcaa9d9d7e169b61f5ca4b7268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Mon, 5 Sep 2022 17:21:52 +0200 Subject: [PATCH 69/80] Forward compatibility with upcoming Promise v3 --- .github/workflows/ci.yml | 2 +- composer.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39888dbb..03f03c6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,5 +44,5 @@ jobs: with: version: lts-3.30 - run: composer self-update --2.2 # downgrade Composer for HHVM - - run: hhvm $(which composer) require react/async:^2 # downgrade Async component for HHVM + - run: hhvm $(which composer) require react/async:^2 react/promise:^2 # downgrade Async and Promise for HHVM - run: hhvm vendor/bin/phpunit --exclude-group internet diff --git a/composer.json b/composer.json index 175d9b5c..c871aed0 100644 --- a/composer.json +++ b/composer.json @@ -13,10 +13,10 @@ "react/cache": "^1.1", "react/dns": "^1.10", "react/event-loop": "^1.3", - "react/http": "^1.7", - "react/promise": "^2.9 || ^1.2", + "react/http": "^1.8@dev || ^1.7", + "react/promise": "^3@dev || ^2.9 || ^1.2", "react/promise-stream": "^1.5", - "react/promise-timer": "^1.8", + "react/promise-timer": "^1.9", "react/socket": "^1.12", "react/stream": "^1.2" }, From ff84cf3c939868a853cd955f1d8446335dfb9608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 29 Sep 2022 16:34:24 +0200 Subject: [PATCH 70/80] Update to stable reactphp/http v1.8.0 --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index c871aed0..ea8d6513 100644 --- a/composer.json +++ b/composer.json @@ -13,8 +13,8 @@ "react/cache": "^1.1", "react/dns": "^1.10", "react/event-loop": "^1.3", - "react/http": "^1.8@dev || ^1.7", - "react/promise": "^3@dev || ^2.9 || ^1.2", + "react/http": "^1.8", + "react/promise": "^3 || ^2.9 || ^1.2", "react/promise-stream": "^1.5", "react/promise-timer": "^1.9", "react/socket": "^1.12", From ba05d1f3ef5e442d2e7aaef71856a718aa96096b Mon Sep 17 00:00:00 2001 From: Simon Frings Date: Tue, 6 Sep 2022 16:27:06 +0200 Subject: [PATCH 71/80] Add issue template for better orientation --- .github/ISSUE_TEMPLATE/bug.md | 11 +++++++++++ .github/ISSUE_TEMPLATE/config.yml | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 00000000..d26fe152 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,11 @@ +--- +name: Bug report +about: Found a bug in our project? Create a report to help us improve. +labels: bug +--- + + + +```php +// Please add code examples if possible, so we can reproduce your steps +``` diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..4b4a0ea6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Report a security vulnerability + url: https://reactphp.org/#support + about: 'If you discover a security vulnerability, please send us an email. Do not disclose security-related issues publicly.' + - name: Feature request + url: https://github.com/orgs/reactphp/discussions/categories/ideas + about: 'You have ideas to improve our project? Start a new discussion in our "Ideas" category.' + - name: Questions + url: https://github.com/orgs/reactphp/discussions/categories/q-a + about: 'We are happy to answer your questions! Start a new discussion in our "Q&A" category.' From a438579f053bcc4ac0b0532228ad5b60df410198 Mon Sep 17 00:00:00 2001 From: Niels Vanpachtenbeke <10651054+Nielsvanpach@users.noreply.github.com> Date: Thu, 29 Dec 2022 10:48:38 +0100 Subject: [PATCH 72/80] run ci with php 8.2 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03f03c6f..55dd7f32 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,7 @@ jobs: strategy: matrix: php: + - 8.2 - 8.1 - 8.0 - 7.4 From e87800c9a243713d19058e15a0623c6978d4ab4a Mon Sep 17 00:00:00 2001 From: Simon Frings Date: Mon, 9 Jan 2023 12:47:33 +0100 Subject: [PATCH 73/80] Revert issue template changes to use organisation issue template --- .github/ISSUE_TEMPLATE/bug.md | 11 ----------- .github/ISSUE_TEMPLATE/config.yml | 11 ----------- 2 files changed, 22 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug.md delete mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md deleted file mode 100644 index d26fe152..00000000 --- a/.github/ISSUE_TEMPLATE/bug.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Bug report -about: Found a bug in our project? Create a report to help us improve. -labels: bug ---- - - - -```php -// Please add code examples if possible, so we can reproduce your steps -``` diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 4b4a0ea6..00000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,11 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Report a security vulnerability - url: https://reactphp.org/#support - about: 'If you discover a security vulnerability, please send us an email. Do not disclose security-related issues publicly.' - - name: Feature request - url: https://github.com/orgs/reactphp/discussions/categories/ideas - about: 'You have ideas to improve our project? Start a new discussion in our "Ideas" category.' - - name: Questions - url: https://github.com/orgs/reactphp/discussions/categories/q-a - about: 'We are happy to answer your questions! Start a new discussion in our "Q&A" category.' From 300bfaf43ebca786d52e16d353766c2669113c5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sun, 15 Jan 2023 16:07:36 +0100 Subject: [PATCH 74/80] Update test suite and report failed assertions --- .github/workflows/ci.yml | 26 +++++++++++++++++--------- composer.json | 12 ++++++------ phpunit.xml.dist | 12 ++++++++++-- phpunit.xml.legacy | 10 +++++++++- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 55dd7f32..87704d9a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: jobs: PHPUnit: name: PHPUnit (PHP ${{ matrix.php }}) - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04 strategy: matrix: php: @@ -24,11 +24,16 @@ jobs: - 5.4 - 5.3 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} coverage: xdebug + ini-file: development + ini-values: disable_functions='' # do not disable PCNTL functions on PHP < 8.1 + extensions: sockets, pcntl + env: + fail-fast: true # fail step if any extension can not be installed - run: composer install - run: vendor/bin/phpunit --coverage-text --exclude-group internet if: ${{ matrix.php >= 7.3 }} @@ -37,13 +42,16 @@ jobs: PHPUnit-hhvm: name: PHPUnit (HHVM) - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04 continue-on-error: true steps: - - uses: actions/checkout@v2 - - uses: azjezz/setup-hhvm@v1 + - uses: actions/checkout@v3 + - run: cp "$(which composer)" composer.phar && ./composer.phar self-update --2.2 # downgrade Composer for HHVM + - name: Run hhvm composer.phar require react/async:^2 react/promise:^2 # downgrade Async and Promise for HHVM + uses: docker://hhvm/hhvm:3.30-lts-latest with: - version: lts-3.30 - - run: composer self-update --2.2 # downgrade Composer for HHVM - - run: hhvm $(which composer) require react/async:^2 react/promise:^2 # downgrade Async and Promise for HHVM - - run: hhvm vendor/bin/phpunit --exclude-group internet + args: hhvm composer.phar require react/async:^2 react/promise:^2 + - name: Run hhvm vendor/bin/phpunit --exclude-group internet + uses: docker://hhvm/hhvm:3.30-lts-latest + with: + args: hhvm vendor/bin/phpunit --exclude-group internet diff --git a/composer.json b/composer.json index ea8d6513..3515e769 100644 --- a/composer.json +++ b/composer.json @@ -11,18 +11,18 @@ "php": ">=5.3.8", "react/async": "^4 || ^3 || ^2", "react/cache": "^1.1", - "react/dns": "^1.10", - "react/event-loop": "^1.3", + "react/dns": "^1.11", + "react/event-loop": "^1.4", "react/http": "^1.8", - "react/promise": "^3 || ^2.9 || ^1.2", + "react/promise": "^3 || ^2.10 || ^1.2", "react/promise-stream": "^1.5", "react/promise-timer": "^1.9", - "react/socket": "^1.12", - "react/stream": "^1.2" + "react/socket": "^1.13", + "react/stream": "^1.3" }, "require-dev": { "clue/stream-filter": "^1.3", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "config": { "preferred-install": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 419e177a..d5d26a2e 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,8 +1,8 @@ - + ./vendor/react/*/src/ + + + + + + + +
diff --git a/phpunit.xml.legacy b/phpunit.xml.legacy index 00fceeb4..2cd2f9b1 100644 --- a/phpunit.xml.legacy +++ b/phpunit.xml.legacy @@ -1,6 +1,6 @@ - + ./vendor/react/*/src/ + + + + + + + + From 4b502d054df09fd33d0fd666fe9cb77ade977e71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 4 Jul 2023 22:59:58 +0200 Subject: [PATCH 75/80] Update test suite to avoid unhandled promise rejections --- .github/workflows/ci.yml | 4 ++-- composer.json | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 87704d9a..2cc7f0ea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,10 +47,10 @@ jobs: steps: - uses: actions/checkout@v3 - run: cp "$(which composer)" composer.phar && ./composer.phar self-update --2.2 # downgrade Composer for HHVM - - name: Run hhvm composer.phar require react/async:^2 react/promise:^2 # downgrade Async and Promise for HHVM + - name: Run hhvm composer.phar require --dev react/async:^2 react/promise:^2 phpunit/phpunit:^5.7 # downgrade Async and Promise for HHVM uses: docker://hhvm/hhvm:3.30-lts-latest with: - args: hhvm composer.phar require react/async:^2 react/promise:^2 + args: hhvm composer.phar require --dev react/async:^2 react/promise:^2 phpunit/phpunit:^5.7 - name: Run hhvm vendor/bin/phpunit --exclude-group internet uses: docker://hhvm/hhvm:3.30-lts-latest with: diff --git a/composer.json b/composer.json index 3515e769..d50528c6 100644 --- a/composer.json +++ b/composer.json @@ -15,14 +15,21 @@ "react/event-loop": "^1.4", "react/http": "^1.8", "react/promise": "^3 || ^2.10 || ^1.2", - "react/promise-stream": "^1.5", + "react/promise-stream": "^1.6", "react/promise-timer": "^1.9", "react/socket": "^1.13", "react/stream": "^1.3" }, "require-dev": { "clue/stream-filter": "^1.3", - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.6 || ^7.5 || ^5.7 || ^4.8.36", + "react/async": "^4.2@dev || ^3.2@dev || ^4 || ^3 || ^2", + "react/dns": "^1.12@dev", + "react/http": "^1.10@dev", + "react/promise": "^3@dev || ^2.10 || ^1.2", + "react/promise-stream": "^1.7@dev", + "react/promise-timer": "^1.10@dev", + "react/socket": "^1.14@dev" }, "config": { "preferred-install": { From 726e5de40567c9effaa8e5665b1a2621af8d7ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 11 Jul 2023 18:08:54 +0200 Subject: [PATCH 76/80] Prepare v1.4.0 release --- CHANGELOG.md | 13 +++++++++++++ README.md | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45b68ac2..f5f711e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 1.4.0 (2023-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2023/announcing-reactphp-promise-v3). + +* Feature: Add support for new Promise v3 release. + (#464 and #524 by @clue) + +* Feature: Support PHP 8.2 release. + (#491 by @Nielsvanpach) + +* Improve test suite, update dependencies and report failed assertions. + (#462 and #501 by @clue and #466 and #492 by @SimonFrings) + ## 1.3.0 (2022-07-11) A major new feature release, see [**release announcement**](https://clue.engineering/2022/announcing-reactphp-async). diff --git a/README.md b/README.md index 4cf54602..f8e1d0f2 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ installed like this: ```bash # quick protoyping only: install all stable components -composer require react/react:^1.3 +composer require react/react:^1.4 ``` For more details, check out [ReactPHP's homepage](https://reactphp.org/) for From 24352c38e5827a15527977d0aaa5925d32d926a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Thu, 16 Nov 2023 18:31:40 +0100 Subject: [PATCH 77/80] Update test suite to remove legacy test bootstrapping --- composer.json | 3 +-- tests/bootstrap.php | 18 +++--------------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/composer.json b/composer.json index d50528c6..67676a85 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "react/dns": "^1.11", "react/event-loop": "^1.4", "react/http": "^1.8", - "react/promise": "^3 || ^2.10 || ^1.2", + "react/promise": "^3 || ^2.10 || ^1.3", "react/promise-stream": "^1.6", "react/promise-timer": "^1.9", "react/socket": "^1.13", @@ -26,7 +26,6 @@ "react/async": "^4.2@dev || ^3.2@dev || ^4 || ^3 || ^2", "react/dns": "^1.12@dev", "react/http": "^1.10@dev", - "react/promise": "^3@dev || ^2.10 || ^1.2", "react/promise-stream": "^1.7@dev", "react/promise-timer": "^1.10@dev", "react/socket": "^1.14@dev" diff --git a/tests/bootstrap.php b/tests/bootstrap.php index db5b8cac..2af732cf 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -2,7 +2,9 @@ $autoload = require __DIR__ . '/../vendor/autoload.php'; -// register all `autoload-dev` paths from React's components +assert($autoload instanceof Composer\Autoload\ClassLoader); + +// register all `autoload-dev` paths from ReactPHP's components foreach (glob(__DIR__ . '/../vendor/react/*/composer.json') as $b) { $config = json_decode(file_get_contents($b), true); @@ -15,17 +17,3 @@ } } } - -// load all legacy test bootstrap scripts from React's components -foreach (glob(__DIR__ . '/../vendor/react/*/tests/bootstrap.php') as $b) { - // skip legacy react/promise for now and use manual autoload path from bootstrap config - // @link https://github.com/reactphp/promise/blob/1.x/tests/bootstrap.php - // @link https://github.com/reactphp/promise/blob/2.x/tests/bootstrap.php - if (strpos($b, 'react/promise/tests/bootstrap.php') !== false) { - $autoload->add('React\Promise', __DIR__ . '/../vendor/react/promise/tests'); - $autoload->addPsr4('React\\Promise\\', __DIR__ . '/../vendor/react/promise/tests'); - continue; - } - - include $b; -} From f25e5d8e732618625e1d15ca2ef7745876d345ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 18 Nov 2023 19:19:11 +0100 Subject: [PATCH 78/80] Test on PHP 8.3 and update test environment --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2cc7f0ea..85aad9c5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,7 @@ jobs: strategy: matrix: php: + - 8.3 - 8.2 - 8.1 - 8.0 @@ -24,7 +25,7 @@ jobs: - 5.4 - 5.3 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} @@ -45,7 +46,7 @@ jobs: runs-on: ubuntu-22.04 continue-on-error: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: cp "$(which composer)" composer.phar && ./composer.phar self-update --2.2 # downgrade Composer for HHVM - name: Run hhvm composer.phar require --dev react/async:^2 react/promise:^2 phpunit/phpunit:^5.7 # downgrade Async and Promise for HHVM uses: docker://hhvm/hhvm:3.30-lts-latest From 4a396be0b306893ee2a1e38ed306b60600ed4d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Sat, 12 Aug 2023 13:50:04 +0200 Subject: [PATCH 79/80] Update test environment to all stable dependencies --- composer.json | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/composer.json b/composer.json index 67676a85..524986d3 100644 --- a/composer.json +++ b/composer.json @@ -9,26 +9,20 @@ }, "require": { "php": ">=5.3.8", - "react/async": "^4 || ^3 || ^2", + "react/async": "^4.2 || ^3.2 || ^2.2", "react/cache": "^1.1", - "react/dns": "^1.11", + "react/dns": "^1.12", "react/event-loop": "^1.4", - "react/http": "^1.8", + "react/http": "^1.10", "react/promise": "^3 || ^2.10 || ^1.3", - "react/promise-stream": "^1.6", - "react/promise-timer": "^1.9", - "react/socket": "^1.13", + "react/promise-stream": "^1.7", + "react/promise-timer": "^1.10", + "react/socket": "^1.14", "react/stream": "^1.3" }, "require-dev": { "clue/stream-filter": "^1.3", - "phpunit/phpunit": "^9.6 || ^7.5 || ^5.7 || ^4.8.36", - "react/async": "^4.2@dev || ^3.2@dev || ^4 || ^3 || ^2", - "react/dns": "^1.12@dev", - "react/http": "^1.10@dev", - "react/promise-stream": "^1.7@dev", - "react/promise-timer": "^1.10@dev", - "react/socket": "^1.14@dev" + "phpunit/phpunit": "^9.6 || ^7.5 || ^5.7 || ^4.8.36" }, "config": { "preferred-install": { From 88dc8e692a40bc1134406f5f61d1a15313cb38f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 21 May 2024 19:37:56 +0200 Subject: [PATCH 80/80] Improve PHP 8.4+ support by avoiding implicitly nullable types --- composer.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 524986d3..3f752a63 100644 --- a/composer.json +++ b/composer.json @@ -9,16 +9,16 @@ }, "require": { "php": ">=5.3.8", - "react/async": "^4.2 || ^3.2 || ^2.2", + "react/async": "^4.3 || ^3.2 || ^2.2", "react/cache": "^1.1", - "react/dns": "^1.12", - "react/event-loop": "^1.4", - "react/http": "^1.10", - "react/promise": "^3 || ^2.10 || ^1.3", + "react/dns": "^1.13", + "react/event-loop": "^1.5", + "react/http": "^1.11", + "react/promise": "^3.2 || ^2.10 || ^1.3", "react/promise-stream": "^1.7", - "react/promise-timer": "^1.10", - "react/socket": "^1.14", - "react/stream": "^1.3" + "react/promise-timer": "^1.11", + "react/socket": "^1.15", + "react/stream": "^1.4" }, "require-dev": { "clue/stream-filter": "^1.3",