├── .gitignore ├── .travis.yml ├── CREDITS ├── LICENSE ├── NOTICE ├── README.md ├── build.xml ├── composer.json ├── composer.lock ├── examples ├── ItemrankImport.php ├── ItemrankQuery.php └── SampleEvent.php ├── phpunit.xml.dist ├── src └── predictionio │ ├── BaseClient.php │ ├── EngineClient.php │ ├── EventClient.php │ ├── Exporter.php │ ├── FileExporter.php │ └── PredictionIOAPIError.php └── tests └── Unit ├── EngineClientTest.php ├── EventClientTest.php ├── ExporterTest.php └── FileExporterTest.php /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | composer.phar 3 | docs 4 | vendor 5 | .idea 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one or more 2 | # contributor license agreements. See the NOTICE file distributed with 3 | # this work for additional information regarding copyright ownership. 4 | # The ASF licenses this file to You under the Apache License, Version 2.0 5 | # (the "License"); you may not use this file except in compliance with 6 | # the License. You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | language: php 16 | php: 17 | - 7.2 18 | - 7.1 19 | - 7.0 20 | - 5.6 21 | before_script: 22 | - pear channel-discover pear.phing.info 23 | - pear install phing/phing 24 | - phpenv rehash 25 | - phing 26 | - composer install 27 | script: 28 | - phing test 29 | -------------------------------------------------------------------------------- /CREDITS: -------------------------------------------------------------------------------- 1 | Apache PredictionIO PHP SDK is made possible by the Apache PredictionIO 2 | PHP SDK open source project and other open source software. 3 | 4 | 5 | Guzzle 6 | http://guzzlephp.org/ 7 | ---------------------------------------- 8 | Copyright (c) 2011 Michael Dowling, https://github.com/mtdowling 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in 18 | all copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 26 | THE SOFTWARE. 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | Apache PredictionIO 2 | Copyright 2017 The Apache Software Foundation 3 | 4 | This product includes software developed at 5 | The Apache Software Foundation (http://www.apache.org/). 6 | 7 | This product depends on third party software that falls under a variety of licenses. 8 | All dependencies with licenses other than Apache are specified in the LICENSE file. 9 | Please see LICENSE for additional copyright and licensing information. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Apache PredictionIO PHP SDK 2 | 3 | [![Build 4 | Status](https://travis-ci.org/apache/predictionio-sdk-php.svg?branch=develop)](https://travis-ci.org/apache/predictionio-sdk-php) 5 | 6 | ## Prerequisites 7 | 8 | * PHP 5.6+ (http://php.net/) 9 | * PHP: cURL (http://php.net/manual/en/book.curl.php) 10 | * Phing (http://www.phing.info/) 11 | * ApiGen (http://apigen.org/) 12 | 13 | Note: This SDK only supports Apache PredictionIO version 0.8.2 or higher. 14 | 15 | ## Getting Started 16 | 17 | The easiest way to install PredictionIO PHP client is to use 18 | [Composer](http://getcomposer.org/). 19 | 20 | 1. `predictionio` is available on [Packagist](https://packagist.org) and can be 21 | installed using [Composer](https://getcomposer.org/): 22 | 23 | composer require predictionio/predictionio 24 | 25 | 2. Include Composer's autoloader in your PHP code 26 | 27 | require_once("vendor/autoload.php"); 28 | 29 | ## Usage 30 | 31 | This package is a web service client based on Guzzle. 32 | A few quick examples are shown below. 33 | 34 | ### Instantiate PredictionIO API Event Client 35 | 36 | ```PHP 37 | use predictionio\EventClient; 38 | $accessKey = 'j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O'; 39 | $client = new EventClient($accessKey, 'http://localhost:7070'); 40 | ``` 41 | 42 | ### Set a User Record from Your App 43 | 44 | ```PHP 45 | // assume you have a user with user ID 5 46 | $response = $client->setUser(5); 47 | ``` 48 | 49 | 50 | ### Set an Item Record from Your App 51 | 52 | ```PHP 53 | // assume you have a book with ID 'bookId1' and we assign 1 as the type ID for book 54 | $response = $client->setItem('bookId1', array('itypes' => 1)); 55 | ``` 56 | 57 | 58 | ### Import a User Action (View) form Your App 59 | 60 | ```PHP 61 | // assume this user has viewed this book item 62 | $client->recordUserActionOnItem('view', 5, 'bookId1'); 63 | ``` 64 | 65 | 66 | ### Retrieving Prediction Result 67 | 68 | ```PHP 69 | // assume you have created an itemrank engine on localhost:8000 70 | // we try to get ranking of 5 items (item IDs: 1, 2, 3, 4, 5) for a user (user ID 7) 71 | 72 | $engineClient = new EngineClient('http://localhost:8000'); 73 | $response = $engineClient->sendQuery(array('uid'=>7, 'iids'=>array(1,2,3,4,5))); 74 | 75 | print_r($response); 76 | ``` 77 | 78 | ## Bugs and Feature Requests 79 | 80 | Use [Apache JIRA](https://issues.apache.org/jira/browse/PIO) to report bugs or 81 | request new features. 82 | 83 | ## Community 84 | 85 | Keep track of development and community news. 86 | 87 | * Subscribe to the [user mailing 88 | list](mailto:user-subscribe@predictionio.apache.org) and the [dev mailing 89 | list](mailto:dev-subscribe@predictionio.apache.org). 90 | * Follow [@PredictionIO](https://twitter.com/PredictionIO) on Twitter. 91 | 92 | ## Contributing 93 | 94 | Read the [Contribute 95 | Code](http://predictionio.apache.org/community/contribute-code/) page. 96 | 97 | ## License 98 | 99 | Apache PredictionIO is under [Apache 2 100 | license](http://www.apache.org/licenses/LICENSE-2.0.html). 101 | -------------------------------------------------------------------------------- /build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | Composer is installed 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "predictionio/predictionio", 3 | "type": "library", 4 | "description": "Apache PredictionIO API PHP Client", 5 | "keywords": [ 6 | "predictionio", 7 | "rest", 8 | "restful", 9 | "web service", 10 | "prediction", 11 | "recommendation" 12 | ], 13 | "homepage": "http://predictionio.apache.org", 14 | "license": "Apache-2.0", 15 | "authors": [ 16 | { 17 | "name": "Apache PredictionIO", 18 | "email": "dev@predictionio.apache.org", 19 | "homepage": "http://predictionio.apache.org" 20 | } 21 | ], 22 | "require": { 23 | "php": ">=5.6.0", 24 | "guzzlehttp/guzzle": "^6.1" 25 | }, 26 | "require-dev": { 27 | "symfony/class-loader": "^2.3", 28 | "phpunit/phpunit": "^5", 29 | "apigen/apigen": "^4.1.2" 30 | }, 31 | "autoload": { 32 | "psr-4": { 33 | "predictionio\\": "src/predictionio/" 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "bae15d857f4a61c45b8021628d1b2f72", 8 | "packages": [ 9 | { 10 | "name": "guzzlehttp/guzzle", 11 | "version": "6.3.3", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/guzzle/guzzle.git", 15 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", 20 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "guzzlehttp/promises": "^1.0", 25 | "guzzlehttp/psr7": "^1.4", 26 | "php": ">=5.5" 27 | }, 28 | "require-dev": { 29 | "ext-curl": "*", 30 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 31 | "psr/log": "^1.0" 32 | }, 33 | "suggest": { 34 | "psr/log": "Required for using the Log middleware" 35 | }, 36 | "type": "library", 37 | "extra": { 38 | "branch-alias": { 39 | "dev-master": "6.3-dev" 40 | } 41 | }, 42 | "autoload": { 43 | "files": [ 44 | "src/functions_include.php" 45 | ], 46 | "psr-4": { 47 | "GuzzleHttp\\": "src/" 48 | } 49 | }, 50 | "notification-url": "https://packagist.org/downloads/", 51 | "license": [ 52 | "MIT" 53 | ], 54 | "authors": [ 55 | { 56 | "name": "Michael Dowling", 57 | "email": "mtdowling@gmail.com", 58 | "homepage": "https://github.com/mtdowling" 59 | } 60 | ], 61 | "description": "Guzzle is a PHP HTTP client library", 62 | "homepage": "http://guzzlephp.org/", 63 | "keywords": [ 64 | "client", 65 | "curl", 66 | "framework", 67 | "http", 68 | "http client", 69 | "rest", 70 | "web service" 71 | ], 72 | "time": "2018-04-22T15:46:56+00:00" 73 | }, 74 | { 75 | "name": "guzzlehttp/promises", 76 | "version": "v1.3.1", 77 | "source": { 78 | "type": "git", 79 | "url": "https://github.com/guzzle/promises.git", 80 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 81 | }, 82 | "dist": { 83 | "type": "zip", 84 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 85 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 86 | "shasum": "" 87 | }, 88 | "require": { 89 | "php": ">=5.5.0" 90 | }, 91 | "require-dev": { 92 | "phpunit/phpunit": "^4.0" 93 | }, 94 | "type": "library", 95 | "extra": { 96 | "branch-alias": { 97 | "dev-master": "1.4-dev" 98 | } 99 | }, 100 | "autoload": { 101 | "psr-4": { 102 | "GuzzleHttp\\Promise\\": "src/" 103 | }, 104 | "files": [ 105 | "src/functions_include.php" 106 | ] 107 | }, 108 | "notification-url": "https://packagist.org/downloads/", 109 | "license": [ 110 | "MIT" 111 | ], 112 | "authors": [ 113 | { 114 | "name": "Michael Dowling", 115 | "email": "mtdowling@gmail.com", 116 | "homepage": "https://github.com/mtdowling" 117 | } 118 | ], 119 | "description": "Guzzle promises library", 120 | "keywords": [ 121 | "promise" 122 | ], 123 | "time": "2016-12-20T10:07:11+00:00" 124 | }, 125 | { 126 | "name": "guzzlehttp/psr7", 127 | "version": "1.4.2", 128 | "source": { 129 | "type": "git", 130 | "url": "https://github.com/guzzle/psr7.git", 131 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" 132 | }, 133 | "dist": { 134 | "type": "zip", 135 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 136 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 137 | "shasum": "" 138 | }, 139 | "require": { 140 | "php": ">=5.4.0", 141 | "psr/http-message": "~1.0" 142 | }, 143 | "provide": { 144 | "psr/http-message-implementation": "1.0" 145 | }, 146 | "require-dev": { 147 | "phpunit/phpunit": "~4.0" 148 | }, 149 | "type": "library", 150 | "extra": { 151 | "branch-alias": { 152 | "dev-master": "1.4-dev" 153 | } 154 | }, 155 | "autoload": { 156 | "psr-4": { 157 | "GuzzleHttp\\Psr7\\": "src/" 158 | }, 159 | "files": [ 160 | "src/functions_include.php" 161 | ] 162 | }, 163 | "notification-url": "https://packagist.org/downloads/", 164 | "license": [ 165 | "MIT" 166 | ], 167 | "authors": [ 168 | { 169 | "name": "Michael Dowling", 170 | "email": "mtdowling@gmail.com", 171 | "homepage": "https://github.com/mtdowling" 172 | }, 173 | { 174 | "name": "Tobias Schultze", 175 | "homepage": "https://github.com/Tobion" 176 | } 177 | ], 178 | "description": "PSR-7 message implementation that also provides common utility methods", 179 | "keywords": [ 180 | "http", 181 | "message", 182 | "request", 183 | "response", 184 | "stream", 185 | "uri", 186 | "url" 187 | ], 188 | "time": "2017-03-20T17:10:46+00:00" 189 | }, 190 | { 191 | "name": "psr/http-message", 192 | "version": "1.0.1", 193 | "source": { 194 | "type": "git", 195 | "url": "https://github.com/php-fig/http-message.git", 196 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 197 | }, 198 | "dist": { 199 | "type": "zip", 200 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 201 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 202 | "shasum": "" 203 | }, 204 | "require": { 205 | "php": ">=5.3.0" 206 | }, 207 | "type": "library", 208 | "extra": { 209 | "branch-alias": { 210 | "dev-master": "1.0.x-dev" 211 | } 212 | }, 213 | "autoload": { 214 | "psr-4": { 215 | "Psr\\Http\\Message\\": "src/" 216 | } 217 | }, 218 | "notification-url": "https://packagist.org/downloads/", 219 | "license": [ 220 | "MIT" 221 | ], 222 | "authors": [ 223 | { 224 | "name": "PHP-FIG", 225 | "homepage": "http://www.php-fig.org/" 226 | } 227 | ], 228 | "description": "Common interface for HTTP messages", 229 | "homepage": "https://github.com/php-fig/http-message", 230 | "keywords": [ 231 | "http", 232 | "http-message", 233 | "psr", 234 | "psr-7", 235 | "request", 236 | "response" 237 | ], 238 | "time": "2016-08-06T14:39:51+00:00" 239 | } 240 | ], 241 | "packages-dev": [ 242 | { 243 | "name": "andrewsville/php-token-reflection", 244 | "version": "1.4.0", 245 | "source": { 246 | "type": "git", 247 | "url": "https://github.com/Andrewsville/PHP-Token-Reflection.git", 248 | "reference": "e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee" 249 | }, 250 | "dist": { 251 | "type": "zip", 252 | "url": "https://api.github.com/repos/Andrewsville/PHP-Token-Reflection/zipball/e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee", 253 | "reference": "e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee", 254 | "shasum": "" 255 | }, 256 | "require": { 257 | "ext-tokenizer": "*", 258 | "php": ">=5.3.0" 259 | }, 260 | "type": "library", 261 | "autoload": { 262 | "psr-0": { 263 | "TokenReflection": "./" 264 | } 265 | }, 266 | "notification-url": "https://packagist.org/downloads/", 267 | "license": [ 268 | "BSD-3" 269 | ], 270 | "authors": [ 271 | { 272 | "name": "Ondřej Nešpor", 273 | "homepage": "https://github.com/andrewsville" 274 | }, 275 | { 276 | "name": "Jaroslav Hanslík", 277 | "homepage": "https://github.com/kukulich" 278 | } 279 | ], 280 | "description": "Library emulating the PHP internal reflection using just the tokenized source code.", 281 | "homepage": "http://andrewsville.github.com/PHP-Token-Reflection/", 282 | "keywords": [ 283 | "library", 284 | "reflection", 285 | "tokenizer" 286 | ], 287 | "time": "2014-08-06T16:37:08+00:00" 288 | }, 289 | { 290 | "name": "apigen/apigen", 291 | "version": "v4.1.2", 292 | "source": { 293 | "type": "git", 294 | "url": "https://github.com/ApiGen/ApiGen.git", 295 | "reference": "3365433ea3433b0e5c8f763608f8e63cbedb2a3a" 296 | }, 297 | "dist": { 298 | "type": "zip", 299 | "url": "https://api.github.com/repos/ApiGen/ApiGen/zipball/3365433ea3433b0e5c8f763608f8e63cbedb2a3a", 300 | "reference": "3365433ea3433b0e5c8f763608f8e63cbedb2a3a", 301 | "shasum": "" 302 | }, 303 | "require": { 304 | "andrewsville/php-token-reflection": "~1.4", 305 | "apigen/theme-bootstrap": "~1.1.2", 306 | "apigen/theme-default": "~1.0.1", 307 | "herrera-io/phar-update": "~2.0", 308 | "kdyby/events": "~2.0", 309 | "kukulich/fshl": "~2.1", 310 | "latte/latte": ">=2.2.0,<2.3.5", 311 | "michelf/php-markdown": "~1.4", 312 | "nette/application": "~2.2", 313 | "nette/bootstrap": "~2.2", 314 | "nette/di": "~2.2", 315 | "nette/mail": "~2.2", 316 | "nette/neon": "~2.2", 317 | "nette/robot-loader": "~2.2", 318 | "nette/safe-stream": "~2.2", 319 | "php": ">=5.4", 320 | "symfony/console": "~2.6", 321 | "symfony/options-resolver": "~2.6.1", 322 | "symfony/yaml": "~2.6", 323 | "tracy/tracy": "~2.2" 324 | }, 325 | "require-dev": { 326 | "herrera-io/box": "~1.6", 327 | "mockery/mockery": "~0.9" 328 | }, 329 | "bin": [ 330 | "bin/apigen" 331 | ], 332 | "type": "library", 333 | "extra": { 334 | "branch-alias": { 335 | "dev-master": "4.1.0-dev" 336 | } 337 | }, 338 | "autoload": { 339 | "psr-4": { 340 | "ApiGen\\": "src" 341 | } 342 | }, 343 | "notification-url": "https://packagist.org/downloads/", 344 | "license": [ 345 | "MIT" 346 | ], 347 | "authors": [ 348 | { 349 | "name": "David Grudl", 350 | "homepage": "http://davidgrudl.com" 351 | }, 352 | { 353 | "name": "Ondřej Nešpor", 354 | "homepage": "https://github.com/andrewsville" 355 | }, 356 | { 357 | "name": "Jaroslav Hanslík", 358 | "homepage": "https://github.com/kukulich" 359 | }, 360 | { 361 | "name": "Tomáš Votruba", 362 | "email": "tomas.vot@gmail.com" 363 | }, 364 | { 365 | "name": "Olivier Laviale", 366 | "homepage": "https://github.com/olvlvl" 367 | } 368 | ], 369 | "description": "PHP source code API generator", 370 | "homepage": "http://apigen.org/", 371 | "keywords": [ 372 | "api", 373 | "documentation", 374 | "generator", 375 | "phpdoc" 376 | ], 377 | "time": "2015-11-29T20:11:30+00:00" 378 | }, 379 | { 380 | "name": "apigen/theme-bootstrap", 381 | "version": "v1.1.3", 382 | "source": { 383 | "type": "git", 384 | "url": "https://github.com/ApiGen/ThemeBootstrap.git", 385 | "reference": "55a35b4a3a9a5fcaa6a8fc43fb304983cab98c6c" 386 | }, 387 | "dist": { 388 | "type": "zip", 389 | "url": "https://api.github.com/repos/ApiGen/ThemeBootstrap/zipball/55a35b4a3a9a5fcaa6a8fc43fb304983cab98c6c", 390 | "reference": "55a35b4a3a9a5fcaa6a8fc43fb304983cab98c6c", 391 | "shasum": "" 392 | }, 393 | "require": { 394 | "latte/latte": "~2.2" 395 | }, 396 | "type": "library", 397 | "notification-url": "https://packagist.org/downloads/", 398 | "license": [ 399 | "MIT" 400 | ], 401 | "authors": [ 402 | { 403 | "name": "Tomáš Votruba", 404 | "email": "tomas.vot@gmail.com" 405 | }, 406 | { 407 | "name": "Olivier Laviale", 408 | "homepage": "https://github.com/olvlvl" 409 | } 410 | ], 411 | "description": "Twitter Bootstrap theme for ApiGen", 412 | "homepage": "http://apigen.org/", 413 | "abandoned": "apigen/apigen", 414 | "time": "2015-10-11T14:52:50+00:00" 415 | }, 416 | { 417 | "name": "apigen/theme-default", 418 | "version": "v1.0.2", 419 | "source": { 420 | "type": "git", 421 | "url": "https://github.com/ApiGen/ThemeDefault.git", 422 | "reference": "51648cf83645d9ae6c655fe46bcd26a347d45336" 423 | }, 424 | "dist": { 425 | "type": "zip", 426 | "url": "https://api.github.com/repos/ApiGen/ThemeDefault/zipball/51648cf83645d9ae6c655fe46bcd26a347d45336", 427 | "reference": "51648cf83645d9ae6c655fe46bcd26a347d45336", 428 | "shasum": "" 429 | }, 430 | "require": { 431 | "latte/latte": "~2.2" 432 | }, 433 | "type": "library", 434 | "notification-url": "https://packagist.org/downloads/", 435 | "license": [ 436 | "MIT" 437 | ], 438 | "authors": [ 439 | { 440 | "name": "David Grudl", 441 | "homepage": "http://davidgrudl.com" 442 | }, 443 | { 444 | "name": "Ondřej Nešpor", 445 | "homepage": "https://github.com/andrewsville" 446 | }, 447 | { 448 | "name": "Jaroslav Hanslík", 449 | "homepage": "https://github.com/kukulich" 450 | }, 451 | { 452 | "name": "Tomáš Votruba", 453 | "email": "tomas.vot@gmail.com" 454 | }, 455 | { 456 | "name": "Olivier Laviale", 457 | "homepage": "https://github.com/olvlvl" 458 | } 459 | ], 460 | "description": "Default theme for ApiGen", 461 | "homepage": "http://apigen.org/", 462 | "abandoned": "apigen/apigen", 463 | "time": "2015-10-11T14:55:30+00:00" 464 | }, 465 | { 466 | "name": "doctrine/instantiator", 467 | "version": "1.0.5", 468 | "source": { 469 | "type": "git", 470 | "url": "https://github.com/doctrine/instantiator.git", 471 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 472 | }, 473 | "dist": { 474 | "type": "zip", 475 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 476 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 477 | "shasum": "" 478 | }, 479 | "require": { 480 | "php": ">=5.3,<8.0-DEV" 481 | }, 482 | "require-dev": { 483 | "athletic/athletic": "~0.1.8", 484 | "ext-pdo": "*", 485 | "ext-phar": "*", 486 | "phpunit/phpunit": "~4.0", 487 | "squizlabs/php_codesniffer": "~2.0" 488 | }, 489 | "type": "library", 490 | "extra": { 491 | "branch-alias": { 492 | "dev-master": "1.0.x-dev" 493 | } 494 | }, 495 | "autoload": { 496 | "psr-4": { 497 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 498 | } 499 | }, 500 | "notification-url": "https://packagist.org/downloads/", 501 | "license": [ 502 | "MIT" 503 | ], 504 | "authors": [ 505 | { 506 | "name": "Marco Pivetta", 507 | "email": "ocramius@gmail.com", 508 | "homepage": "http://ocramius.github.com/" 509 | } 510 | ], 511 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 512 | "homepage": "https://github.com/doctrine/instantiator", 513 | "keywords": [ 514 | "constructor", 515 | "instantiate" 516 | ], 517 | "time": "2015-06-14T21:17:01+00:00" 518 | }, 519 | { 520 | "name": "herrera-io/json", 521 | "version": "1.0.3", 522 | "source": { 523 | "type": "git", 524 | "url": "https://github.com/kherge-php/json.git", 525 | "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1" 526 | }, 527 | "dist": { 528 | "type": "zip", 529 | "url": "https://api.github.com/repos/kherge-php/json/zipball/60c696c9370a1e5136816ca557c17f82a6fa83f1", 530 | "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1", 531 | "shasum": "" 532 | }, 533 | "require": { 534 | "ext-json": "*", 535 | "justinrainbow/json-schema": ">=1.0,<2.0-dev", 536 | "php": ">=5.3.3", 537 | "seld/jsonlint": ">=1.0,<2.0-dev" 538 | }, 539 | "require-dev": { 540 | "herrera-io/phpunit-test-case": "1.*", 541 | "mikey179/vfsstream": "1.1.0", 542 | "phpunit/phpunit": "3.7.*" 543 | }, 544 | "type": "library", 545 | "extra": { 546 | "branch-alias": { 547 | "dev-master": "1.0-dev" 548 | } 549 | }, 550 | "autoload": { 551 | "files": [ 552 | "src/lib/json_version.php" 553 | ], 554 | "psr-0": { 555 | "Herrera\\Json": "src/lib" 556 | } 557 | }, 558 | "notification-url": "https://packagist.org/downloads/", 559 | "license": [ 560 | "MIT" 561 | ], 562 | "authors": [ 563 | { 564 | "name": "Kevin Herrera", 565 | "email": "kevin@herrera.io", 566 | "homepage": "http://kevin.herrera.io" 567 | } 568 | ], 569 | "description": "A library for simplifying JSON linting and validation.", 570 | "homepage": "http://herrera-io.github.com/php-json", 571 | "keywords": [ 572 | "json", 573 | "lint", 574 | "schema", 575 | "validate" 576 | ], 577 | "abandoned": "kherge/json", 578 | "time": "2013-10-30T16:51:34+00:00" 579 | }, 580 | { 581 | "name": "herrera-io/phar-update", 582 | "version": "2.0.0", 583 | "source": { 584 | "type": "git", 585 | "url": "https://github.com/kherge-abandoned/php-phar-update.git", 586 | "reference": "15643c90d3d43620a4f45c910e6afb7a0ad4b488" 587 | }, 588 | "dist": { 589 | "type": "zip", 590 | "url": "https://api.github.com/repos/kherge-abandoned/php-phar-update/zipball/15643c90d3d43620a4f45c910e6afb7a0ad4b488", 591 | "reference": "15643c90d3d43620a4f45c910e6afb7a0ad4b488", 592 | "shasum": "" 593 | }, 594 | "require": { 595 | "herrera-io/json": "1.*", 596 | "herrera-io/version": "1.*", 597 | "php": ">=5.3.3" 598 | }, 599 | "require-dev": { 600 | "herrera-io/phpunit-test-case": "1.*", 601 | "mikey179/vfsstream": "1.1.0", 602 | "phpunit/phpunit": "3.7.*" 603 | }, 604 | "type": "library", 605 | "extra": { 606 | "branch-alias": { 607 | "dev-master": "2.0-dev" 608 | } 609 | }, 610 | "autoload": { 611 | "files": [ 612 | "src/lib/constants.php" 613 | ], 614 | "psr-0": { 615 | "Herrera\\Phar\\Update": "src/lib" 616 | } 617 | }, 618 | "notification-url": "https://packagist.org/downloads/", 619 | "license": [ 620 | "MIT" 621 | ], 622 | "authors": [ 623 | { 624 | "name": "Kevin Herrera", 625 | "email": "kevin@herrera.io", 626 | "homepage": "http://kevin.herrera.io" 627 | } 628 | ], 629 | "description": "A library for self-updating Phars.", 630 | "homepage": "http://herrera-io.github.com/php-phar-update", 631 | "keywords": [ 632 | "phar", 633 | "update" 634 | ], 635 | "abandoned": true, 636 | "time": "2013-11-09T17:13:13+00:00" 637 | }, 638 | { 639 | "name": "herrera-io/version", 640 | "version": "1.1.1", 641 | "source": { 642 | "type": "git", 643 | "url": "https://github.com/kherge-abandoned/php-version.git", 644 | "reference": "d39d9642b92a04d8b8a28b871b797a35a2545e85" 645 | }, 646 | "dist": { 647 | "type": "zip", 648 | "url": "https://api.github.com/repos/kherge-abandoned/php-version/zipball/d39d9642b92a04d8b8a28b871b797a35a2545e85", 649 | "reference": "d39d9642b92a04d8b8a28b871b797a35a2545e85", 650 | "shasum": "" 651 | }, 652 | "require": { 653 | "php": ">=5.3.3" 654 | }, 655 | "require-dev": { 656 | "herrera-io/phpunit-test-case": "1.*", 657 | "phpunit/phpunit": "3.7.*" 658 | }, 659 | "type": "library", 660 | "extra": { 661 | "branch-alias": { 662 | "dev-master": "1.1.x-dev" 663 | } 664 | }, 665 | "autoload": { 666 | "psr-0": { 667 | "Herrera\\Version": "src/lib" 668 | } 669 | }, 670 | "notification-url": "https://packagist.org/downloads/", 671 | "license": [ 672 | "MIT" 673 | ], 674 | "authors": [ 675 | { 676 | "name": "Kevin Herrera", 677 | "email": "kevin@herrera.io", 678 | "homepage": "http://kevin.herrera.io" 679 | } 680 | ], 681 | "description": "A library for creating, editing, and comparing semantic versioning numbers.", 682 | "homepage": "http://github.com/herrera-io/php-version", 683 | "keywords": [ 684 | "semantic", 685 | "version" 686 | ], 687 | "abandoned": true, 688 | "time": "2014-05-27T05:29:25+00:00" 689 | }, 690 | { 691 | "name": "justinrainbow/json-schema", 692 | "version": "1.6.1", 693 | "source": { 694 | "type": "git", 695 | "url": "https://github.com/justinrainbow/json-schema.git", 696 | "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341" 697 | }, 698 | "dist": { 699 | "type": "zip", 700 | "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341", 701 | "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341", 702 | "shasum": "" 703 | }, 704 | "require": { 705 | "php": ">=5.3.29" 706 | }, 707 | "require-dev": { 708 | "json-schema/json-schema-test-suite": "1.1.0", 709 | "phpdocumentor/phpdocumentor": "~2", 710 | "phpunit/phpunit": "~3.7" 711 | }, 712 | "bin": [ 713 | "bin/validate-json" 714 | ], 715 | "type": "library", 716 | "extra": { 717 | "branch-alias": { 718 | "dev-master": "1.6.x-dev" 719 | } 720 | }, 721 | "autoload": { 722 | "psr-4": { 723 | "JsonSchema\\": "src/JsonSchema/" 724 | } 725 | }, 726 | "notification-url": "https://packagist.org/downloads/", 727 | "license": [ 728 | "BSD-3-Clause" 729 | ], 730 | "authors": [ 731 | { 732 | "name": "Bruno Prieto Reis", 733 | "email": "bruno.p.reis@gmail.com" 734 | }, 735 | { 736 | "name": "Justin Rainbow", 737 | "email": "justin.rainbow@gmail.com" 738 | }, 739 | { 740 | "name": "Igor Wiedler", 741 | "email": "igor@wiedler.ch" 742 | }, 743 | { 744 | "name": "Robert Schönthal", 745 | "email": "seroscho@googlemail.com" 746 | } 747 | ], 748 | "description": "A library to validate a json schema.", 749 | "homepage": "https://github.com/justinrainbow/json-schema", 750 | "keywords": [ 751 | "json", 752 | "schema" 753 | ], 754 | "time": "2016-01-25T15:43:01+00:00" 755 | }, 756 | { 757 | "name": "kdyby/events", 758 | "version": "v2.4.1", 759 | "source": { 760 | "type": "git", 761 | "url": "https://github.com/Kdyby/Events.git", 762 | "reference": "d8a0e8a64a59f501996f8f9591aa3f950208f091" 763 | }, 764 | "dist": { 765 | "type": "zip", 766 | "url": "https://api.github.com/repos/Kdyby/Events/zipball/d8a0e8a64a59f501996f8f9591aa3f950208f091", 767 | "reference": "d8a0e8a64a59f501996f8f9591aa3f950208f091", 768 | "shasum": "" 769 | }, 770 | "require": { 771 | "nette/di": "~2.3@dev", 772 | "nette/utils": "~2.3@dev" 773 | }, 774 | "require-dev": { 775 | "latte/latte": "~2.3@dev", 776 | "nette/application": "~2.3@dev", 777 | "nette/bootstrap": "~2.3@dev", 778 | "nette/caching": "~2.3@dev", 779 | "nette/component-model": "~2.2@dev", 780 | "nette/database": "~2.3@dev", 781 | "nette/deprecated": "~2.3@dev", 782 | "nette/di": "~2.3@dev", 783 | "nette/finder": "~2.3@dev", 784 | "nette/forms": "~2.3@dev", 785 | "nette/http": "~2.3@dev", 786 | "nette/mail": "~2.3@dev", 787 | "nette/neon": "~2.3@dev", 788 | "nette/php-generator": "~2.3@dev", 789 | "nette/reflection": "~2.3@dev", 790 | "nette/robot-loader": "~2.3@dev", 791 | "nette/safe-stream": "~2.3@dev", 792 | "nette/security": "~2.3@dev", 793 | "nette/tester": "~1.4", 794 | "nette/tokenizer": "~2.2@dev", 795 | "nette/utils": "~2.3@dev", 796 | "symfony/event-dispatcher": "~2.3", 797 | "tracy/tracy": "~2.3@dev" 798 | }, 799 | "type": "library", 800 | "extra": { 801 | "branch-alias": { 802 | "dev-master": "2.4-dev" 803 | } 804 | }, 805 | "autoload": { 806 | "psr-0": { 807 | "Kdyby\\Events\\": "src/" 808 | }, 809 | "classmap": [ 810 | "src/Kdyby/Events/exceptions.php" 811 | ], 812 | "files": [ 813 | "src/Doctrine/compatibility.php" 814 | ] 815 | }, 816 | "notification-url": "https://packagist.org/downloads/", 817 | "license": [ 818 | "BSD-3-Clause", 819 | "GPL-2.0", 820 | "GPL-3.0" 821 | ], 822 | "authors": [ 823 | { 824 | "name": "Filip Procházka", 825 | "email": "filip@prochazka.su", 826 | "homepage": "http://filip-prochazka.com" 827 | } 828 | ], 829 | "description": "Events for Nette Framework", 830 | "homepage": "http://kdyby.org", 831 | "keywords": [ 832 | "kdyby", 833 | "nette" 834 | ], 835 | "time": "2016-04-19T11:19:31+00:00" 836 | }, 837 | { 838 | "name": "kukulich/fshl", 839 | "version": "2.1.0", 840 | "source": { 841 | "type": "git", 842 | "url": "https://github.com/kukulich/fshl.git", 843 | "reference": "974c294ade5d76c0c16b6fe3fd3a584ba999b24f" 844 | }, 845 | "dist": { 846 | "type": "zip", 847 | "url": "https://api.github.com/repos/kukulich/fshl/zipball/974c294ade5d76c0c16b6fe3fd3a584ba999b24f", 848 | "reference": "974c294ade5d76c0c16b6fe3fd3a584ba999b24f", 849 | "shasum": "" 850 | }, 851 | "require": { 852 | "php": ">=5.3" 853 | }, 854 | "type": "library", 855 | "autoload": { 856 | "psr-0": { 857 | "FSHL": "./" 858 | } 859 | }, 860 | "notification-url": "https://packagist.org/downloads/", 861 | "license": [ 862 | "GPL-2.0+" 863 | ], 864 | "authors": [ 865 | { 866 | "name": "Jaroslav Hanslík", 867 | "homepage": "https://github.com/kukulich" 868 | } 869 | ], 870 | "description": "FSHL is a free, open source, universal, fast syntax highlighter written in PHP.", 871 | "homepage": "http://fshl.kukulich.cz/", 872 | "keywords": [ 873 | "highlight", 874 | "library", 875 | "syntax" 876 | ], 877 | "time": "2012-09-08T19:00:07+00:00" 878 | }, 879 | { 880 | "name": "latte/latte", 881 | "version": "v2.3.4", 882 | "source": { 883 | "type": "git", 884 | "url": "https://github.com/nette/latte.git", 885 | "reference": "5e891af999776d2204a9d06ad66ad8fa0bcd4f8b" 886 | }, 887 | "dist": { 888 | "type": "zip", 889 | "url": "https://api.github.com/repos/nette/latte/zipball/5e891af999776d2204a9d06ad66ad8fa0bcd4f8b", 890 | "reference": "5e891af999776d2204a9d06ad66ad8fa0bcd4f8b", 891 | "shasum": "" 892 | }, 893 | "require": { 894 | "ext-tokenizer": "*", 895 | "php": ">=5.3.1" 896 | }, 897 | "require-dev": { 898 | "nette/tester": "~1.3" 899 | }, 900 | "suggest": { 901 | "ext-fileinfo": "to use filter |datastream", 902 | "ext-mbstring": "to use filters like lower, upper, capitalize, ..." 903 | }, 904 | "type": "library", 905 | "autoload": { 906 | "classmap": [ 907 | "src/" 908 | ] 909 | }, 910 | "notification-url": "https://packagist.org/downloads/", 911 | "license": [ 912 | "BSD-3-Clause", 913 | "GPL-2.0", 914 | "GPL-3.0" 915 | ], 916 | "authors": [ 917 | { 918 | "name": "David Grudl", 919 | "homepage": "http://davidgrudl.com" 920 | }, 921 | { 922 | "name": "Nette Community", 923 | "homepage": "http://nette.org/contributors" 924 | } 925 | ], 926 | "description": "Latte: the amazing template engine for PHP", 927 | "homepage": "http://latte.nette.org", 928 | "keywords": [ 929 | "templating", 930 | "twig" 931 | ], 932 | "time": "2015-08-23T12:36:55+00:00" 933 | }, 934 | { 935 | "name": "michelf/php-markdown", 936 | "version": "1.8.0", 937 | "source": { 938 | "type": "git", 939 | "url": "https://github.com/michelf/php-markdown.git", 940 | "reference": "01ab082b355bf188d907b9929cd99b2923053495" 941 | }, 942 | "dist": { 943 | "type": "zip", 944 | "url": "https://api.github.com/repos/michelf/php-markdown/zipball/01ab082b355bf188d907b9929cd99b2923053495", 945 | "reference": "01ab082b355bf188d907b9929cd99b2923053495", 946 | "shasum": "" 947 | }, 948 | "require": { 949 | "php": ">=5.3.0" 950 | }, 951 | "type": "library", 952 | "autoload": { 953 | "psr-4": { 954 | "Michelf\\": "Michelf/" 955 | } 956 | }, 957 | "notification-url": "https://packagist.org/downloads/", 958 | "license": [ 959 | "BSD-3-Clause" 960 | ], 961 | "authors": [ 962 | { 963 | "name": "Michel Fortin", 964 | "email": "michel.fortin@michelf.ca", 965 | "homepage": "https://michelf.ca/", 966 | "role": "Developer" 967 | }, 968 | { 969 | "name": "John Gruber", 970 | "homepage": "https://daringfireball.net/" 971 | } 972 | ], 973 | "description": "PHP Markdown", 974 | "homepage": "https://michelf.ca/projects/php-markdown/", 975 | "keywords": [ 976 | "markdown" 977 | ], 978 | "time": "2018-01-15T00:49:33+00:00" 979 | }, 980 | { 981 | "name": "myclabs/deep-copy", 982 | "version": "1.7.0", 983 | "source": { 984 | "type": "git", 985 | "url": "https://github.com/myclabs/DeepCopy.git", 986 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" 987 | }, 988 | "dist": { 989 | "type": "zip", 990 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 991 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 992 | "shasum": "" 993 | }, 994 | "require": { 995 | "php": "^5.6 || ^7.0" 996 | }, 997 | "require-dev": { 998 | "doctrine/collections": "^1.0", 999 | "doctrine/common": "^2.6", 1000 | "phpunit/phpunit": "^4.1" 1001 | }, 1002 | "type": "library", 1003 | "autoload": { 1004 | "psr-4": { 1005 | "DeepCopy\\": "src/DeepCopy/" 1006 | }, 1007 | "files": [ 1008 | "src/DeepCopy/deep_copy.php" 1009 | ] 1010 | }, 1011 | "notification-url": "https://packagist.org/downloads/", 1012 | "license": [ 1013 | "MIT" 1014 | ], 1015 | "description": "Create deep copies (clones) of your objects", 1016 | "keywords": [ 1017 | "clone", 1018 | "copy", 1019 | "duplicate", 1020 | "object", 1021 | "object graph" 1022 | ], 1023 | "time": "2017-10-19T19:58:43+00:00" 1024 | }, 1025 | { 1026 | "name": "nette/application", 1027 | "version": "v2.4.12", 1028 | "source": { 1029 | "type": "git", 1030 | "url": "https://github.com/nette/application.git", 1031 | "reference": "fe1915f880d8e5d16217bad467950733fd5cbad3" 1032 | }, 1033 | "dist": { 1034 | "type": "zip", 1035 | "url": "https://api.github.com/repos/nette/application/zipball/fe1915f880d8e5d16217bad467950733fd5cbad3", 1036 | "reference": "fe1915f880d8e5d16217bad467950733fd5cbad3", 1037 | "shasum": "" 1038 | }, 1039 | "require": { 1040 | "nette/component-model": "^2.3", 1041 | "nette/http": "^2.2", 1042 | "nette/reflection": "^2.2", 1043 | "nette/utils": "^2.4 || ~3.0.0", 1044 | "php": ">=5.6.0" 1045 | }, 1046 | "conflict": { 1047 | "nette/di": "<2.4", 1048 | "nette/forms": "<2.4", 1049 | "nette/latte": "<2.4", 1050 | "nette/nette": "<2.2" 1051 | }, 1052 | "require-dev": { 1053 | "latte/latte": "^2.4.3", 1054 | "mockery/mockery": "^0.9.5", 1055 | "nette/di": "^2.4 || ~3.0.0", 1056 | "nette/forms": "^2.4", 1057 | "nette/robot-loader": "^2.4.2 || ^3.0", 1058 | "nette/security": "^2.4", 1059 | "nette/tester": "^2.0", 1060 | "tracy/tracy": "^2.4" 1061 | }, 1062 | "suggest": { 1063 | "latte/latte": "Allows using Latte in templates", 1064 | "nette/forms": "Allows to use Nette\\Application\\UI\\Form" 1065 | }, 1066 | "type": "library", 1067 | "extra": { 1068 | "branch-alias": { 1069 | "dev-master": "2.4-dev" 1070 | } 1071 | }, 1072 | "autoload": { 1073 | "classmap": [ 1074 | "src/" 1075 | ], 1076 | "files": [ 1077 | "src/compatibility.php" 1078 | ] 1079 | }, 1080 | "notification-url": "https://packagist.org/downloads/", 1081 | "license": [ 1082 | "BSD-3-Clause", 1083 | "GPL-2.0", 1084 | "GPL-3.0" 1085 | ], 1086 | "authors": [ 1087 | { 1088 | "name": "David Grudl", 1089 | "homepage": "https://davidgrudl.com" 1090 | }, 1091 | { 1092 | "name": "Nette Community", 1093 | "homepage": "https://nette.org/contributors" 1094 | } 1095 | ], 1096 | "description": "🏆 Nette Application: a full-stack component-based MVC kernel for PHP that helps you write powerful and modern web applications. Write less, have cleaner code and your work will bring you joy.", 1097 | "homepage": "https://nette.org", 1098 | "keywords": [ 1099 | "Forms", 1100 | "component-based", 1101 | "control", 1102 | "framework", 1103 | "mvc", 1104 | "mvp", 1105 | "nette", 1106 | "presenter", 1107 | "routing", 1108 | "seo" 1109 | ], 1110 | "time": "2018-05-16T09:28:51+00:00" 1111 | }, 1112 | { 1113 | "name": "nette/bootstrap", 1114 | "version": "v2.4.6", 1115 | "source": { 1116 | "type": "git", 1117 | "url": "https://github.com/nette/bootstrap.git", 1118 | "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543" 1119 | }, 1120 | "dist": { 1121 | "type": "zip", 1122 | "url": "https://api.github.com/repos/nette/bootstrap/zipball/268816e3f1bb7426c3a4ceec2bd38a036b532543", 1123 | "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543", 1124 | "shasum": "" 1125 | }, 1126 | "require": { 1127 | "nette/di": "~2.4.7", 1128 | "nette/utils": "~2.4", 1129 | "php": ">=5.6.0" 1130 | }, 1131 | "conflict": { 1132 | "nette/nette": "<2.2" 1133 | }, 1134 | "require-dev": { 1135 | "latte/latte": "~2.2", 1136 | "nette/application": "~2.3", 1137 | "nette/caching": "~2.3", 1138 | "nette/database": "~2.3", 1139 | "nette/forms": "~2.3", 1140 | "nette/http": "~2.4.0", 1141 | "nette/mail": "~2.3", 1142 | "nette/robot-loader": "^2.4.2 || ^3.0", 1143 | "nette/safe-stream": "~2.2", 1144 | "nette/security": "~2.3", 1145 | "nette/tester": "~2.0", 1146 | "tracy/tracy": "^2.4.1" 1147 | }, 1148 | "suggest": { 1149 | "nette/robot-loader": "to use Configurator::createRobotLoader()", 1150 | "tracy/tracy": "to use Configurator::enableTracy()" 1151 | }, 1152 | "type": "library", 1153 | "extra": { 1154 | "branch-alias": { 1155 | "dev-master": "2.4-dev" 1156 | } 1157 | }, 1158 | "autoload": { 1159 | "classmap": [ 1160 | "src/" 1161 | ] 1162 | }, 1163 | "notification-url": "https://packagist.org/downloads/", 1164 | "license": [ 1165 | "BSD-3-Clause", 1166 | "GPL-2.0", 1167 | "GPL-3.0" 1168 | ], 1169 | "authors": [ 1170 | { 1171 | "name": "David Grudl", 1172 | "homepage": "https://davidgrudl.com" 1173 | }, 1174 | { 1175 | "name": "Nette Community", 1176 | "homepage": "https://nette.org/contributors" 1177 | } 1178 | ], 1179 | "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.", 1180 | "homepage": "https://nette.org", 1181 | "keywords": [ 1182 | "bootstrapping", 1183 | "configurator", 1184 | "nette" 1185 | ], 1186 | "time": "2018-05-17T12:52:20+00:00" 1187 | }, 1188 | { 1189 | "name": "nette/caching", 1190 | "version": "v2.5.8", 1191 | "source": { 1192 | "type": "git", 1193 | "url": "https://github.com/nette/caching.git", 1194 | "reference": "7fba7c7ab2585fafb7b31152f2595e1551120555" 1195 | }, 1196 | "dist": { 1197 | "type": "zip", 1198 | "url": "https://api.github.com/repos/nette/caching/zipball/7fba7c7ab2585fafb7b31152f2595e1551120555", 1199 | "reference": "7fba7c7ab2585fafb7b31152f2595e1551120555", 1200 | "shasum": "" 1201 | }, 1202 | "require": { 1203 | "nette/finder": "^2.2 || ~3.0.0", 1204 | "nette/utils": "^2.4 || ~3.0.0", 1205 | "php": ">=5.6.0" 1206 | }, 1207 | "conflict": { 1208 | "nette/nette": "<2.2" 1209 | }, 1210 | "require-dev": { 1211 | "latte/latte": "^2.4", 1212 | "nette/di": "^2.4 || ~3.0.0", 1213 | "nette/tester": "^2.0", 1214 | "tracy/tracy": "^2.4" 1215 | }, 1216 | "suggest": { 1217 | "ext-pdo_sqlite": "to use SQLiteStorage or SQLiteJournal" 1218 | }, 1219 | "type": "library", 1220 | "extra": { 1221 | "branch-alias": { 1222 | "dev-master": "2.5-dev" 1223 | } 1224 | }, 1225 | "autoload": { 1226 | "classmap": [ 1227 | "src/" 1228 | ] 1229 | }, 1230 | "notification-url": "https://packagist.org/downloads/", 1231 | "license": [ 1232 | "BSD-3-Clause", 1233 | "GPL-2.0", 1234 | "GPL-3.0" 1235 | ], 1236 | "authors": [ 1237 | { 1238 | "name": "David Grudl", 1239 | "homepage": "https://davidgrudl.com" 1240 | }, 1241 | { 1242 | "name": "Nette Community", 1243 | "homepage": "https://nette.org/contributors" 1244 | } 1245 | ], 1246 | "description": "⏱ Nette Caching: library with easy-to-use API and many cache backends.", 1247 | "homepage": "https://nette.org", 1248 | "keywords": [ 1249 | "cache", 1250 | "journal", 1251 | "memcached", 1252 | "nette", 1253 | "sqlite" 1254 | ], 1255 | "time": "2018-03-21T11:04:32+00:00" 1256 | }, 1257 | { 1258 | "name": "nette/component-model", 1259 | "version": "v2.4.0", 1260 | "source": { 1261 | "type": "git", 1262 | "url": "https://github.com/nette/component-model.git", 1263 | "reference": "6e7980f5ddec31f68a39e767799b1b0be9dd1014" 1264 | }, 1265 | "dist": { 1266 | "type": "zip", 1267 | "url": "https://api.github.com/repos/nette/component-model/zipball/6e7980f5ddec31f68a39e767799b1b0be9dd1014", 1268 | "reference": "6e7980f5ddec31f68a39e767799b1b0be9dd1014", 1269 | "shasum": "" 1270 | }, 1271 | "require": { 1272 | "nette/utils": "^2.5 || ~3.0.0", 1273 | "php": ">=5.6.0" 1274 | }, 1275 | "conflict": { 1276 | "nette/application": "<2.4", 1277 | "nette/nette": "<2.2" 1278 | }, 1279 | "require-dev": { 1280 | "nette/tester": "^2.0", 1281 | "tracy/tracy": "^2.3" 1282 | }, 1283 | "type": "library", 1284 | "extra": { 1285 | "branch-alias": { 1286 | "dev-master": "2.4-dev" 1287 | } 1288 | }, 1289 | "autoload": { 1290 | "classmap": [ 1291 | "src/" 1292 | ] 1293 | }, 1294 | "notification-url": "https://packagist.org/downloads/", 1295 | "license": [ 1296 | "BSD-3-Clause", 1297 | "GPL-2.0", 1298 | "GPL-3.0" 1299 | ], 1300 | "authors": [ 1301 | { 1302 | "name": "David Grudl", 1303 | "homepage": "https://davidgrudl.com" 1304 | }, 1305 | { 1306 | "name": "Nette Community", 1307 | "homepage": "https://nette.org/contributors" 1308 | } 1309 | ], 1310 | "description": "⚛ Nette Component Model", 1311 | "homepage": "https://nette.org", 1312 | "keywords": [ 1313 | "components", 1314 | "nette" 1315 | ], 1316 | "time": "2018-03-20T16:32:50+00:00" 1317 | }, 1318 | { 1319 | "name": "nette/di", 1320 | "version": "v2.4.13", 1321 | "source": { 1322 | "type": "git", 1323 | "url": "https://github.com/nette/di.git", 1324 | "reference": "3f8f212b02d5c17feb97a7e0a39ab306f40c06ca" 1325 | }, 1326 | "dist": { 1327 | "type": "zip", 1328 | "url": "https://api.github.com/repos/nette/di/zipball/3f8f212b02d5c17feb97a7e0a39ab306f40c06ca", 1329 | "reference": "3f8f212b02d5c17feb97a7e0a39ab306f40c06ca", 1330 | "shasum": "" 1331 | }, 1332 | "require": { 1333 | "ext-tokenizer": "*", 1334 | "nette/neon": "^2.3.3 || ~3.0.0", 1335 | "nette/php-generator": "^2.6.1 || ~3.0.0", 1336 | "nette/utils": "^2.4.3 || ~3.0.0", 1337 | "php": ">=5.6.0" 1338 | }, 1339 | "conflict": { 1340 | "nette/bootstrap": "<2.4", 1341 | "nette/nette": "<2.2" 1342 | }, 1343 | "require-dev": { 1344 | "nette/tester": "^2.0", 1345 | "tracy/tracy": "^2.3" 1346 | }, 1347 | "type": "library", 1348 | "extra": { 1349 | "branch-alias": { 1350 | "dev-master": "2.4-dev" 1351 | } 1352 | }, 1353 | "autoload": { 1354 | "classmap": [ 1355 | "src/" 1356 | ] 1357 | }, 1358 | "notification-url": "https://packagist.org/downloads/", 1359 | "license": [ 1360 | "BSD-3-Clause", 1361 | "GPL-2.0", 1362 | "GPL-3.0" 1363 | ], 1364 | "authors": [ 1365 | { 1366 | "name": "David Grudl", 1367 | "homepage": "https://davidgrudl.com" 1368 | }, 1369 | { 1370 | "name": "Nette Community", 1371 | "homepage": "https://nette.org/contributors" 1372 | } 1373 | ], 1374 | "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.", 1375 | "homepage": "https://nette.org", 1376 | "keywords": [ 1377 | "compiled", 1378 | "di", 1379 | "dic", 1380 | "factory", 1381 | "ioc", 1382 | "nette", 1383 | "static" 1384 | ], 1385 | "time": "2018-06-11T08:46:01+00:00" 1386 | }, 1387 | { 1388 | "name": "nette/finder", 1389 | "version": "v2.4.2", 1390 | "source": { 1391 | "type": "git", 1392 | "url": "https://github.com/nette/finder.git", 1393 | "reference": "ee951a656cb8ac622e5dd33474a01fd2470505a0" 1394 | }, 1395 | "dist": { 1396 | "type": "zip", 1397 | "url": "https://api.github.com/repos/nette/finder/zipball/ee951a656cb8ac622e5dd33474a01fd2470505a0", 1398 | "reference": "ee951a656cb8ac622e5dd33474a01fd2470505a0", 1399 | "shasum": "" 1400 | }, 1401 | "require": { 1402 | "nette/utils": "~2.4", 1403 | "php": ">=5.6.0" 1404 | }, 1405 | "conflict": { 1406 | "nette/nette": "<2.2" 1407 | }, 1408 | "require-dev": { 1409 | "nette/tester": "~2.0", 1410 | "tracy/tracy": "^2.3" 1411 | }, 1412 | "type": "library", 1413 | "extra": { 1414 | "branch-alias": { 1415 | "dev-master": "2.4-dev" 1416 | } 1417 | }, 1418 | "autoload": { 1419 | "classmap": [ 1420 | "src/" 1421 | ] 1422 | }, 1423 | "notification-url": "https://packagist.org/downloads/", 1424 | "license": [ 1425 | "BSD-3-Clause", 1426 | "GPL-2.0", 1427 | "GPL-3.0" 1428 | ], 1429 | "authors": [ 1430 | { 1431 | "name": "David Grudl", 1432 | "homepage": "https://davidgrudl.com" 1433 | }, 1434 | { 1435 | "name": "Nette Community", 1436 | "homepage": "https://nette.org/contributors" 1437 | } 1438 | ], 1439 | "description": "🔍 Nette Finder: find files and directories with an intuitive API.", 1440 | "homepage": "https://nette.org", 1441 | "keywords": [ 1442 | "filesystem", 1443 | "glob", 1444 | "iterator", 1445 | "nette" 1446 | ], 1447 | "time": "2018-06-28T11:49:23+00:00" 1448 | }, 1449 | { 1450 | "name": "nette/http", 1451 | "version": "v2.4.10", 1452 | "source": { 1453 | "type": "git", 1454 | "url": "https://github.com/nette/http.git", 1455 | "reference": "a36e6bad0aae8bacf849c150b5e0ecacef0d9eca" 1456 | }, 1457 | "dist": { 1458 | "type": "zip", 1459 | "url": "https://api.github.com/repos/nette/http/zipball/a36e6bad0aae8bacf849c150b5e0ecacef0d9eca", 1460 | "reference": "a36e6bad0aae8bacf849c150b5e0ecacef0d9eca", 1461 | "shasum": "" 1462 | }, 1463 | "require": { 1464 | "nette/utils": "^2.4 || ~3.0.0", 1465 | "php": ">=5.6.0" 1466 | }, 1467 | "conflict": { 1468 | "nette/nette": "<2.2" 1469 | }, 1470 | "require-dev": { 1471 | "nette/di": "^2.4.8 || ~3.0.0", 1472 | "nette/tester": "^2.0", 1473 | "tracy/tracy": "^2.4" 1474 | }, 1475 | "suggest": { 1476 | "ext-fileinfo": "to detect type of uploaded files", 1477 | "nette/security": "allows use Nette\\Http\\UserStorage" 1478 | }, 1479 | "type": "library", 1480 | "extra": { 1481 | "branch-alias": { 1482 | "dev-master": "2.4-dev" 1483 | } 1484 | }, 1485 | "autoload": { 1486 | "classmap": [ 1487 | "src/" 1488 | ] 1489 | }, 1490 | "notification-url": "https://packagist.org/downloads/", 1491 | "license": [ 1492 | "BSD-3-Clause", 1493 | "GPL-2.0", 1494 | "GPL-3.0" 1495 | ], 1496 | "authors": [ 1497 | { 1498 | "name": "David Grudl", 1499 | "homepage": "https://davidgrudl.com" 1500 | }, 1501 | { 1502 | "name": "Nette Community", 1503 | "homepage": "https://nette.org/contributors" 1504 | } 1505 | ], 1506 | "description": "🌐 Nette Http: abstraction for HTTP request, response and session. Provides careful data sanitization and utility for URL and cookies manipulation.", 1507 | "homepage": "https://nette.org", 1508 | "keywords": [ 1509 | "cookies", 1510 | "http", 1511 | "nette", 1512 | "proxy", 1513 | "request", 1514 | "response", 1515 | "security", 1516 | "session", 1517 | "url" 1518 | ], 1519 | "time": "2018-09-03T19:16:55+00:00" 1520 | }, 1521 | { 1522 | "name": "nette/mail", 1523 | "version": "v2.4.5", 1524 | "source": { 1525 | "type": "git", 1526 | "url": "https://github.com/nette/mail.git", 1527 | "reference": "13312eb627d913f2630018a07a9e40cb7003dc76" 1528 | }, 1529 | "dist": { 1530 | "type": "zip", 1531 | "url": "https://api.github.com/repos/nette/mail/zipball/13312eb627d913f2630018a07a9e40cb7003dc76", 1532 | "reference": "13312eb627d913f2630018a07a9e40cb7003dc76", 1533 | "shasum": "" 1534 | }, 1535 | "require": { 1536 | "ext-iconv": "*", 1537 | "nette/utils": "^2.4 || ~3.0.0", 1538 | "php": ">=5.6.0" 1539 | }, 1540 | "conflict": { 1541 | "nette/nette": "<2.2" 1542 | }, 1543 | "require-dev": { 1544 | "nette/di": "^2.4 || ~3.0.0", 1545 | "nette/tester": "^2.0", 1546 | "tracy/tracy": "^2.4" 1547 | }, 1548 | "suggest": { 1549 | "ext-fileinfo": "to detect type of attached files" 1550 | }, 1551 | "type": "library", 1552 | "extra": { 1553 | "branch-alias": { 1554 | "dev-master": "2.4-dev" 1555 | } 1556 | }, 1557 | "autoload": { 1558 | "classmap": [ 1559 | "src/" 1560 | ] 1561 | }, 1562 | "notification-url": "https://packagist.org/downloads/", 1563 | "license": [ 1564 | "BSD-3-Clause", 1565 | "GPL-2.0", 1566 | "GPL-3.0" 1567 | ], 1568 | "authors": [ 1569 | { 1570 | "name": "David Grudl", 1571 | "homepage": "https://davidgrudl.com" 1572 | }, 1573 | { 1574 | "name": "Nette Community", 1575 | "homepage": "https://nette.org/contributors" 1576 | } 1577 | ], 1578 | "description": "📧 Nette Mail: handy email creation and transfer library for PHP with both text and MIME-compliant support.", 1579 | "homepage": "https://nette.org", 1580 | "keywords": [ 1581 | "mail", 1582 | "mailer", 1583 | "mime", 1584 | "nette", 1585 | "smtp" 1586 | ], 1587 | "time": "2018-03-18T16:30:02+00:00" 1588 | }, 1589 | { 1590 | "name": "nette/neon", 1591 | "version": "v2.4.3", 1592 | "source": { 1593 | "type": "git", 1594 | "url": "https://github.com/nette/neon.git", 1595 | "reference": "5e72b1dd3e2d34f0863c5561139a19df6a1ef398" 1596 | }, 1597 | "dist": { 1598 | "type": "zip", 1599 | "url": "https://api.github.com/repos/nette/neon/zipball/5e72b1dd3e2d34f0863c5561139a19df6a1ef398", 1600 | "reference": "5e72b1dd3e2d34f0863c5561139a19df6a1ef398", 1601 | "shasum": "" 1602 | }, 1603 | "require": { 1604 | "ext-iconv": "*", 1605 | "ext-json": "*", 1606 | "php": ">=5.6.0" 1607 | }, 1608 | "require-dev": { 1609 | "nette/tester": "~2.0", 1610 | "tracy/tracy": "^2.3" 1611 | }, 1612 | "type": "library", 1613 | "extra": { 1614 | "branch-alias": { 1615 | "dev-master": "2.4-dev" 1616 | } 1617 | }, 1618 | "autoload": { 1619 | "classmap": [ 1620 | "src/" 1621 | ] 1622 | }, 1623 | "notification-url": "https://packagist.org/downloads/", 1624 | "license": [ 1625 | "BSD-3-Clause", 1626 | "GPL-2.0", 1627 | "GPL-3.0" 1628 | ], 1629 | "authors": [ 1630 | { 1631 | "name": "David Grudl", 1632 | "homepage": "https://davidgrudl.com" 1633 | }, 1634 | { 1635 | "name": "Nette Community", 1636 | "homepage": "https://nette.org/contributors" 1637 | } 1638 | ], 1639 | "description": "🍸 Nette NEON: encodes and decodes NEON file format.", 1640 | "homepage": "http://ne-on.org", 1641 | "keywords": [ 1642 | "export", 1643 | "import", 1644 | "neon", 1645 | "nette", 1646 | "yaml" 1647 | ], 1648 | "time": "2018-03-21T12:12:21+00:00" 1649 | }, 1650 | { 1651 | "name": "nette/php-generator", 1652 | "version": "v2.6.4", 1653 | "source": { 1654 | "type": "git", 1655 | "url": "https://github.com/nette/php-generator.git", 1656 | "reference": "c1f6b2163c5471c4d94cd94b93362f12bceef183" 1657 | }, 1658 | "dist": { 1659 | "type": "zip", 1660 | "url": "https://api.github.com/repos/nette/php-generator/zipball/c1f6b2163c5471c4d94cd94b93362f12bceef183", 1661 | "reference": "c1f6b2163c5471c4d94cd94b93362f12bceef183", 1662 | "shasum": "" 1663 | }, 1664 | "require": { 1665 | "nette/utils": "^2.4.2 || ~3.0.0", 1666 | "php": ">=5.6.0" 1667 | }, 1668 | "conflict": { 1669 | "nette/nette": "<2.2" 1670 | }, 1671 | "require-dev": { 1672 | "nette/tester": "^2.0", 1673 | "tracy/tracy": "^2.3" 1674 | }, 1675 | "type": "library", 1676 | "extra": { 1677 | "branch-alias": { 1678 | "dev-master": "2.6-dev" 1679 | } 1680 | }, 1681 | "autoload": { 1682 | "classmap": [ 1683 | "src/" 1684 | ] 1685 | }, 1686 | "notification-url": "https://packagist.org/downloads/", 1687 | "license": [ 1688 | "BSD-3-Clause", 1689 | "GPL-2.0", 1690 | "GPL-3.0" 1691 | ], 1692 | "authors": [ 1693 | { 1694 | "name": "David Grudl", 1695 | "homepage": "https://davidgrudl.com" 1696 | }, 1697 | { 1698 | "name": "Nette Community", 1699 | "homepage": "https://nette.org/contributors" 1700 | } 1701 | ], 1702 | "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.1 features.", 1703 | "homepage": "https://nette.org", 1704 | "keywords": [ 1705 | "code", 1706 | "nette", 1707 | "php", 1708 | "scaffolding" 1709 | ], 1710 | "time": "2018-04-26T16:47:39+00:00" 1711 | }, 1712 | { 1713 | "name": "nette/reflection", 1714 | "version": "v2.4.2", 1715 | "source": { 1716 | "type": "git", 1717 | "url": "https://github.com/nette/reflection.git", 1718 | "reference": "b12327e98ead74e87a1315e0d48182a702adf901" 1719 | }, 1720 | "dist": { 1721 | "type": "zip", 1722 | "url": "https://api.github.com/repos/nette/reflection/zipball/b12327e98ead74e87a1315e0d48182a702adf901", 1723 | "reference": "b12327e98ead74e87a1315e0d48182a702adf901", 1724 | "shasum": "" 1725 | }, 1726 | "require": { 1727 | "ext-tokenizer": "*", 1728 | "nette/caching": "^2.2 || ^3.0", 1729 | "nette/utils": "^2.4 || ^3.0", 1730 | "php": ">=5.6.0" 1731 | }, 1732 | "conflict": { 1733 | "nette/nette": "<2.2" 1734 | }, 1735 | "require-dev": { 1736 | "nette/di": "^2.4 || ^3.0", 1737 | "nette/tester": "^2.0", 1738 | "tracy/tracy": "^2.4" 1739 | }, 1740 | "type": "library", 1741 | "extra": { 1742 | "branch-alias": { 1743 | "dev-master": "2.4-dev" 1744 | } 1745 | }, 1746 | "autoload": { 1747 | "classmap": [ 1748 | "src/" 1749 | ] 1750 | }, 1751 | "notification-url": "https://packagist.org/downloads/", 1752 | "license": [ 1753 | "BSD-3-Clause", 1754 | "GPL-2.0", 1755 | "GPL-3.0" 1756 | ], 1757 | "authors": [ 1758 | { 1759 | "name": "David Grudl", 1760 | "homepage": "https://davidgrudl.com" 1761 | }, 1762 | { 1763 | "name": "Nette Community", 1764 | "homepage": "https://nette.org/contributors" 1765 | } 1766 | ], 1767 | "description": "Nette Reflection: docblock annotations parser and common reflection classes", 1768 | "homepage": "https://nette.org", 1769 | "keywords": [ 1770 | "annotation", 1771 | "nette", 1772 | "reflection" 1773 | ], 1774 | "time": "2017-07-11T19:28:57+00:00" 1775 | }, 1776 | { 1777 | "name": "nette/robot-loader", 1778 | "version": "v2.4.4", 1779 | "source": { 1780 | "type": "git", 1781 | "url": "https://github.com/nette/robot-loader.git", 1782 | "reference": "1f7f8792ce4d94162959e6b766822d6051623bca" 1783 | }, 1784 | "dist": { 1785 | "type": "zip", 1786 | "url": "https://api.github.com/repos/nette/robot-loader/zipball/1f7f8792ce4d94162959e6b766822d6051623bca", 1787 | "reference": "1f7f8792ce4d94162959e6b766822d6051623bca", 1788 | "shasum": "" 1789 | }, 1790 | "require": { 1791 | "ext-tokenizer": "*", 1792 | "nette/caching": "~2.2", 1793 | "nette/finder": "~2.3", 1794 | "nette/utils": "~2.4", 1795 | "php": ">=5.6.0" 1796 | }, 1797 | "conflict": { 1798 | "nette/nette": "<2.2" 1799 | }, 1800 | "require-dev": { 1801 | "nette/tester": "~2.0", 1802 | "tracy/tracy": "^2.3" 1803 | }, 1804 | "type": "library", 1805 | "extra": { 1806 | "branch-alias": { 1807 | "dev-master": "2.4-dev" 1808 | } 1809 | }, 1810 | "autoload": { 1811 | "classmap": [ 1812 | "src/" 1813 | ] 1814 | }, 1815 | "notification-url": "https://packagist.org/downloads/", 1816 | "license": [ 1817 | "BSD-3-Clause", 1818 | "GPL-2.0", 1819 | "GPL-3.0" 1820 | ], 1821 | "authors": [ 1822 | { 1823 | "name": "David Grudl", 1824 | "homepage": "https://davidgrudl.com" 1825 | }, 1826 | { 1827 | "name": "Nette Community", 1828 | "homepage": "https://nette.org/contributors" 1829 | } 1830 | ], 1831 | "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", 1832 | "homepage": "https://nette.org", 1833 | "keywords": [ 1834 | "autoload", 1835 | "class", 1836 | "interface", 1837 | "nette", 1838 | "trait" 1839 | ], 1840 | "time": "2017-08-14T20:23:02+00:00" 1841 | }, 1842 | { 1843 | "name": "nette/safe-stream", 1844 | "version": "v2.3.3", 1845 | "source": { 1846 | "type": "git", 1847 | "url": "https://github.com/nette/safe-stream.git", 1848 | "reference": "0fcd45ae82be5817f4b3ad25bc8955968f355412" 1849 | }, 1850 | "dist": { 1851 | "type": "zip", 1852 | "url": "https://api.github.com/repos/nette/safe-stream/zipball/0fcd45ae82be5817f4b3ad25bc8955968f355412", 1853 | "reference": "0fcd45ae82be5817f4b3ad25bc8955968f355412", 1854 | "shasum": "" 1855 | }, 1856 | "require": { 1857 | "php": ">=5.3.1" 1858 | }, 1859 | "conflict": { 1860 | "nette/nette": "<2.2" 1861 | }, 1862 | "require-dev": { 1863 | "nette/tester": "~1.7", 1864 | "tracy/tracy": "^2.3" 1865 | }, 1866 | "type": "library", 1867 | "extra": { 1868 | "branch-alias": { 1869 | "dev-master": "2.3-dev" 1870 | } 1871 | }, 1872 | "autoload": { 1873 | "files": [ 1874 | "src/loader.php" 1875 | ] 1876 | }, 1877 | "notification-url": "https://packagist.org/downloads/", 1878 | "license": [ 1879 | "BSD-3-Clause", 1880 | "GPL-2.0", 1881 | "GPL-3.0" 1882 | ], 1883 | "authors": [ 1884 | { 1885 | "name": "David Grudl", 1886 | "homepage": "https://davidgrudl.com" 1887 | }, 1888 | { 1889 | "name": "Nette Community", 1890 | "homepage": "https://nette.org/contributors" 1891 | } 1892 | ], 1893 | "description": "Nette SafeStream: atomic and safe manipulation with files via native PHP functions.", 1894 | "homepage": "https://nette.org", 1895 | "keywords": [ 1896 | "atomic", 1897 | "filesystem", 1898 | "nette", 1899 | "safe" 1900 | ], 1901 | "time": "2017-07-13T18:20:37+00:00" 1902 | }, 1903 | { 1904 | "name": "nette/utils", 1905 | "version": "v2.5.2", 1906 | "source": { 1907 | "type": "git", 1908 | "url": "https://github.com/nette/utils.git", 1909 | "reference": "183069866dc477fcfbac393ed486aaa6d93d19a5" 1910 | }, 1911 | "dist": { 1912 | "type": "zip", 1913 | "url": "https://api.github.com/repos/nette/utils/zipball/183069866dc477fcfbac393ed486aaa6d93d19a5", 1914 | "reference": "183069866dc477fcfbac393ed486aaa6d93d19a5", 1915 | "shasum": "" 1916 | }, 1917 | "require": { 1918 | "php": ">=5.6.0" 1919 | }, 1920 | "conflict": { 1921 | "nette/nette": "<2.2" 1922 | }, 1923 | "require-dev": { 1924 | "nette/tester": "~2.0", 1925 | "tracy/tracy": "^2.3" 1926 | }, 1927 | "suggest": { 1928 | "ext-gd": "to use Image", 1929 | "ext-iconv": "to use Strings::webalize() and toAscii()", 1930 | "ext-intl": "for script transliteration in Strings::webalize() and toAscii()", 1931 | "ext-json": "to use Nette\\Utils\\Json", 1932 | "ext-mbstring": "to use Strings::lower() etc...", 1933 | "ext-xml": "to use Strings::length() etc. when mbstring is not available" 1934 | }, 1935 | "type": "library", 1936 | "extra": { 1937 | "branch-alias": { 1938 | "dev-master": "2.5-dev" 1939 | } 1940 | }, 1941 | "autoload": { 1942 | "classmap": [ 1943 | "src/" 1944 | ], 1945 | "files": [ 1946 | "src/loader.php" 1947 | ] 1948 | }, 1949 | "notification-url": "https://packagist.org/downloads/", 1950 | "license": [ 1951 | "BSD-3-Clause", 1952 | "GPL-2.0", 1953 | "GPL-3.0" 1954 | ], 1955 | "authors": [ 1956 | { 1957 | "name": "David Grudl", 1958 | "homepage": "https://davidgrudl.com" 1959 | }, 1960 | { 1961 | "name": "Nette Community", 1962 | "homepage": "https://nette.org/contributors" 1963 | } 1964 | ], 1965 | "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", 1966 | "homepage": "https://nette.org", 1967 | "keywords": [ 1968 | "array", 1969 | "core", 1970 | "datetime", 1971 | "images", 1972 | "json", 1973 | "nette", 1974 | "paginator", 1975 | "password", 1976 | "slugify", 1977 | "string", 1978 | "unicode", 1979 | "utf-8", 1980 | "utility", 1981 | "validation" 1982 | ], 1983 | "time": "2018-05-02T17:16:08+00:00" 1984 | }, 1985 | { 1986 | "name": "phpdocumentor/reflection-common", 1987 | "version": "1.0.1", 1988 | "source": { 1989 | "type": "git", 1990 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 1991 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 1992 | }, 1993 | "dist": { 1994 | "type": "zip", 1995 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 1996 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 1997 | "shasum": "" 1998 | }, 1999 | "require": { 2000 | "php": ">=5.5" 2001 | }, 2002 | "require-dev": { 2003 | "phpunit/phpunit": "^4.6" 2004 | }, 2005 | "type": "library", 2006 | "extra": { 2007 | "branch-alias": { 2008 | "dev-master": "1.0.x-dev" 2009 | } 2010 | }, 2011 | "autoload": { 2012 | "psr-4": { 2013 | "phpDocumentor\\Reflection\\": [ 2014 | "src" 2015 | ] 2016 | } 2017 | }, 2018 | "notification-url": "https://packagist.org/downloads/", 2019 | "license": [ 2020 | "MIT" 2021 | ], 2022 | "authors": [ 2023 | { 2024 | "name": "Jaap van Otterdijk", 2025 | "email": "opensource@ijaap.nl" 2026 | } 2027 | ], 2028 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 2029 | "homepage": "http://www.phpdoc.org", 2030 | "keywords": [ 2031 | "FQSEN", 2032 | "phpDocumentor", 2033 | "phpdoc", 2034 | "reflection", 2035 | "static analysis" 2036 | ], 2037 | "time": "2017-09-11T18:02:19+00:00" 2038 | }, 2039 | { 2040 | "name": "phpdocumentor/reflection-docblock", 2041 | "version": "3.3.2", 2042 | "source": { 2043 | "type": "git", 2044 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 2045 | "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" 2046 | }, 2047 | "dist": { 2048 | "type": "zip", 2049 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", 2050 | "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", 2051 | "shasum": "" 2052 | }, 2053 | "require": { 2054 | "php": "^5.6 || ^7.0", 2055 | "phpdocumentor/reflection-common": "^1.0.0", 2056 | "phpdocumentor/type-resolver": "^0.4.0", 2057 | "webmozart/assert": "^1.0" 2058 | }, 2059 | "require-dev": { 2060 | "mockery/mockery": "^0.9.4", 2061 | "phpunit/phpunit": "^4.4" 2062 | }, 2063 | "type": "library", 2064 | "autoload": { 2065 | "psr-4": { 2066 | "phpDocumentor\\Reflection\\": [ 2067 | "src/" 2068 | ] 2069 | } 2070 | }, 2071 | "notification-url": "https://packagist.org/downloads/", 2072 | "license": [ 2073 | "MIT" 2074 | ], 2075 | "authors": [ 2076 | { 2077 | "name": "Mike van Riel", 2078 | "email": "me@mikevanriel.com" 2079 | } 2080 | ], 2081 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 2082 | "time": "2017-11-10T14:09:06+00:00" 2083 | }, 2084 | { 2085 | "name": "phpdocumentor/type-resolver", 2086 | "version": "0.4.0", 2087 | "source": { 2088 | "type": "git", 2089 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 2090 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 2091 | }, 2092 | "dist": { 2093 | "type": "zip", 2094 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 2095 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 2096 | "shasum": "" 2097 | }, 2098 | "require": { 2099 | "php": "^5.5 || ^7.0", 2100 | "phpdocumentor/reflection-common": "^1.0" 2101 | }, 2102 | "require-dev": { 2103 | "mockery/mockery": "^0.9.4", 2104 | "phpunit/phpunit": "^5.2||^4.8.24" 2105 | }, 2106 | "type": "library", 2107 | "extra": { 2108 | "branch-alias": { 2109 | "dev-master": "1.0.x-dev" 2110 | } 2111 | }, 2112 | "autoload": { 2113 | "psr-4": { 2114 | "phpDocumentor\\Reflection\\": [ 2115 | "src/" 2116 | ] 2117 | } 2118 | }, 2119 | "notification-url": "https://packagist.org/downloads/", 2120 | "license": [ 2121 | "MIT" 2122 | ], 2123 | "authors": [ 2124 | { 2125 | "name": "Mike van Riel", 2126 | "email": "me@mikevanriel.com" 2127 | } 2128 | ], 2129 | "time": "2017-07-14T14:27:02+00:00" 2130 | }, 2131 | { 2132 | "name": "phpspec/prophecy", 2133 | "version": "1.8.0", 2134 | "source": { 2135 | "type": "git", 2136 | "url": "https://github.com/phpspec/prophecy.git", 2137 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" 2138 | }, 2139 | "dist": { 2140 | "type": "zip", 2141 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 2142 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 2143 | "shasum": "" 2144 | }, 2145 | "require": { 2146 | "doctrine/instantiator": "^1.0.2", 2147 | "php": "^5.3|^7.0", 2148 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 2149 | "sebastian/comparator": "^1.1|^2.0|^3.0", 2150 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 2151 | }, 2152 | "require-dev": { 2153 | "phpspec/phpspec": "^2.5|^3.2", 2154 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 2155 | }, 2156 | "type": "library", 2157 | "extra": { 2158 | "branch-alias": { 2159 | "dev-master": "1.8.x-dev" 2160 | } 2161 | }, 2162 | "autoload": { 2163 | "psr-0": { 2164 | "Prophecy\\": "src/" 2165 | } 2166 | }, 2167 | "notification-url": "https://packagist.org/downloads/", 2168 | "license": [ 2169 | "MIT" 2170 | ], 2171 | "authors": [ 2172 | { 2173 | "name": "Konstantin Kudryashov", 2174 | "email": "ever.zet@gmail.com", 2175 | "homepage": "http://everzet.com" 2176 | }, 2177 | { 2178 | "name": "Marcello Duarte", 2179 | "email": "marcello.duarte@gmail.com" 2180 | } 2181 | ], 2182 | "description": "Highly opinionated mocking framework for PHP 5.3+", 2183 | "homepage": "https://github.com/phpspec/prophecy", 2184 | "keywords": [ 2185 | "Double", 2186 | "Dummy", 2187 | "fake", 2188 | "mock", 2189 | "spy", 2190 | "stub" 2191 | ], 2192 | "time": "2018-08-05T17:53:17+00:00" 2193 | }, 2194 | { 2195 | "name": "phpunit/php-code-coverage", 2196 | "version": "4.0.8", 2197 | "source": { 2198 | "type": "git", 2199 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 2200 | "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" 2201 | }, 2202 | "dist": { 2203 | "type": "zip", 2204 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", 2205 | "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", 2206 | "shasum": "" 2207 | }, 2208 | "require": { 2209 | "ext-dom": "*", 2210 | "ext-xmlwriter": "*", 2211 | "php": "^5.6 || ^7.0", 2212 | "phpunit/php-file-iterator": "^1.3", 2213 | "phpunit/php-text-template": "^1.2", 2214 | "phpunit/php-token-stream": "^1.4.2 || ^2.0", 2215 | "sebastian/code-unit-reverse-lookup": "^1.0", 2216 | "sebastian/environment": "^1.3.2 || ^2.0", 2217 | "sebastian/version": "^1.0 || ^2.0" 2218 | }, 2219 | "require-dev": { 2220 | "ext-xdebug": "^2.1.4", 2221 | "phpunit/phpunit": "^5.7" 2222 | }, 2223 | "suggest": { 2224 | "ext-xdebug": "^2.5.1" 2225 | }, 2226 | "type": "library", 2227 | "extra": { 2228 | "branch-alias": { 2229 | "dev-master": "4.0.x-dev" 2230 | } 2231 | }, 2232 | "autoload": { 2233 | "classmap": [ 2234 | "src/" 2235 | ] 2236 | }, 2237 | "notification-url": "https://packagist.org/downloads/", 2238 | "license": [ 2239 | "BSD-3-Clause" 2240 | ], 2241 | "authors": [ 2242 | { 2243 | "name": "Sebastian Bergmann", 2244 | "email": "sb@sebastian-bergmann.de", 2245 | "role": "lead" 2246 | } 2247 | ], 2248 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2249 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2250 | "keywords": [ 2251 | "coverage", 2252 | "testing", 2253 | "xunit" 2254 | ], 2255 | "time": "2017-04-02T07:44:40+00:00" 2256 | }, 2257 | { 2258 | "name": "phpunit/php-file-iterator", 2259 | "version": "1.4.5", 2260 | "source": { 2261 | "type": "git", 2262 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2263 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" 2264 | }, 2265 | "dist": { 2266 | "type": "zip", 2267 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", 2268 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", 2269 | "shasum": "" 2270 | }, 2271 | "require": { 2272 | "php": ">=5.3.3" 2273 | }, 2274 | "type": "library", 2275 | "extra": { 2276 | "branch-alias": { 2277 | "dev-master": "1.4.x-dev" 2278 | } 2279 | }, 2280 | "autoload": { 2281 | "classmap": [ 2282 | "src/" 2283 | ] 2284 | }, 2285 | "notification-url": "https://packagist.org/downloads/", 2286 | "license": [ 2287 | "BSD-3-Clause" 2288 | ], 2289 | "authors": [ 2290 | { 2291 | "name": "Sebastian Bergmann", 2292 | "email": "sb@sebastian-bergmann.de", 2293 | "role": "lead" 2294 | } 2295 | ], 2296 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2297 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2298 | "keywords": [ 2299 | "filesystem", 2300 | "iterator" 2301 | ], 2302 | "time": "2017-11-27T13:52:08+00:00" 2303 | }, 2304 | { 2305 | "name": "phpunit/php-text-template", 2306 | "version": "1.2.1", 2307 | "source": { 2308 | "type": "git", 2309 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2310 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2311 | }, 2312 | "dist": { 2313 | "type": "zip", 2314 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2315 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2316 | "shasum": "" 2317 | }, 2318 | "require": { 2319 | "php": ">=5.3.3" 2320 | }, 2321 | "type": "library", 2322 | "autoload": { 2323 | "classmap": [ 2324 | "src/" 2325 | ] 2326 | }, 2327 | "notification-url": "https://packagist.org/downloads/", 2328 | "license": [ 2329 | "BSD-3-Clause" 2330 | ], 2331 | "authors": [ 2332 | { 2333 | "name": "Sebastian Bergmann", 2334 | "email": "sebastian@phpunit.de", 2335 | "role": "lead" 2336 | } 2337 | ], 2338 | "description": "Simple template engine.", 2339 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2340 | "keywords": [ 2341 | "template" 2342 | ], 2343 | "time": "2015-06-21T13:50:34+00:00" 2344 | }, 2345 | { 2346 | "name": "phpunit/php-timer", 2347 | "version": "1.0.9", 2348 | "source": { 2349 | "type": "git", 2350 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2351 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" 2352 | }, 2353 | "dist": { 2354 | "type": "zip", 2355 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 2356 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 2357 | "shasum": "" 2358 | }, 2359 | "require": { 2360 | "php": "^5.3.3 || ^7.0" 2361 | }, 2362 | "require-dev": { 2363 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 2364 | }, 2365 | "type": "library", 2366 | "extra": { 2367 | "branch-alias": { 2368 | "dev-master": "1.0-dev" 2369 | } 2370 | }, 2371 | "autoload": { 2372 | "classmap": [ 2373 | "src/" 2374 | ] 2375 | }, 2376 | "notification-url": "https://packagist.org/downloads/", 2377 | "license": [ 2378 | "BSD-3-Clause" 2379 | ], 2380 | "authors": [ 2381 | { 2382 | "name": "Sebastian Bergmann", 2383 | "email": "sb@sebastian-bergmann.de", 2384 | "role": "lead" 2385 | } 2386 | ], 2387 | "description": "Utility class for timing", 2388 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 2389 | "keywords": [ 2390 | "timer" 2391 | ], 2392 | "time": "2017-02-26T11:10:40+00:00" 2393 | }, 2394 | { 2395 | "name": "phpunit/php-token-stream", 2396 | "version": "1.4.12", 2397 | "source": { 2398 | "type": "git", 2399 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 2400 | "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" 2401 | }, 2402 | "dist": { 2403 | "type": "zip", 2404 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", 2405 | "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", 2406 | "shasum": "" 2407 | }, 2408 | "require": { 2409 | "ext-tokenizer": "*", 2410 | "php": ">=5.3.3" 2411 | }, 2412 | "require-dev": { 2413 | "phpunit/phpunit": "~4.2" 2414 | }, 2415 | "type": "library", 2416 | "extra": { 2417 | "branch-alias": { 2418 | "dev-master": "1.4-dev" 2419 | } 2420 | }, 2421 | "autoload": { 2422 | "classmap": [ 2423 | "src/" 2424 | ] 2425 | }, 2426 | "notification-url": "https://packagist.org/downloads/", 2427 | "license": [ 2428 | "BSD-3-Clause" 2429 | ], 2430 | "authors": [ 2431 | { 2432 | "name": "Sebastian Bergmann", 2433 | "email": "sebastian@phpunit.de" 2434 | } 2435 | ], 2436 | "description": "Wrapper around PHP's tokenizer extension.", 2437 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 2438 | "keywords": [ 2439 | "tokenizer" 2440 | ], 2441 | "time": "2017-12-04T08:55:13+00:00" 2442 | }, 2443 | { 2444 | "name": "phpunit/phpunit", 2445 | "version": "5.7.27", 2446 | "source": { 2447 | "type": "git", 2448 | "url": "https://github.com/sebastianbergmann/phpunit.git", 2449 | "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c" 2450 | }, 2451 | "dist": { 2452 | "type": "zip", 2453 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", 2454 | "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", 2455 | "shasum": "" 2456 | }, 2457 | "require": { 2458 | "ext-dom": "*", 2459 | "ext-json": "*", 2460 | "ext-libxml": "*", 2461 | "ext-mbstring": "*", 2462 | "ext-xml": "*", 2463 | "myclabs/deep-copy": "~1.3", 2464 | "php": "^5.6 || ^7.0", 2465 | "phpspec/prophecy": "^1.6.2", 2466 | "phpunit/php-code-coverage": "^4.0.4", 2467 | "phpunit/php-file-iterator": "~1.4", 2468 | "phpunit/php-text-template": "~1.2", 2469 | "phpunit/php-timer": "^1.0.6", 2470 | "phpunit/phpunit-mock-objects": "^3.2", 2471 | "sebastian/comparator": "^1.2.4", 2472 | "sebastian/diff": "^1.4.3", 2473 | "sebastian/environment": "^1.3.4 || ^2.0", 2474 | "sebastian/exporter": "~2.0", 2475 | "sebastian/global-state": "^1.1", 2476 | "sebastian/object-enumerator": "~2.0", 2477 | "sebastian/resource-operations": "~1.0", 2478 | "sebastian/version": "^1.0.6|^2.0.1", 2479 | "symfony/yaml": "~2.1|~3.0|~4.0" 2480 | }, 2481 | "conflict": { 2482 | "phpdocumentor/reflection-docblock": "3.0.2" 2483 | }, 2484 | "require-dev": { 2485 | "ext-pdo": "*" 2486 | }, 2487 | "suggest": { 2488 | "ext-xdebug": "*", 2489 | "phpunit/php-invoker": "~1.1" 2490 | }, 2491 | "bin": [ 2492 | "phpunit" 2493 | ], 2494 | "type": "library", 2495 | "extra": { 2496 | "branch-alias": { 2497 | "dev-master": "5.7.x-dev" 2498 | } 2499 | }, 2500 | "autoload": { 2501 | "classmap": [ 2502 | "src/" 2503 | ] 2504 | }, 2505 | "notification-url": "https://packagist.org/downloads/", 2506 | "license": [ 2507 | "BSD-3-Clause" 2508 | ], 2509 | "authors": [ 2510 | { 2511 | "name": "Sebastian Bergmann", 2512 | "email": "sebastian@phpunit.de", 2513 | "role": "lead" 2514 | } 2515 | ], 2516 | "description": "The PHP Unit Testing framework.", 2517 | "homepage": "https://phpunit.de/", 2518 | "keywords": [ 2519 | "phpunit", 2520 | "testing", 2521 | "xunit" 2522 | ], 2523 | "time": "2018-02-01T05:50:59+00:00" 2524 | }, 2525 | { 2526 | "name": "phpunit/phpunit-mock-objects", 2527 | "version": "3.4.4", 2528 | "source": { 2529 | "type": "git", 2530 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 2531 | "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" 2532 | }, 2533 | "dist": { 2534 | "type": "zip", 2535 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", 2536 | "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", 2537 | "shasum": "" 2538 | }, 2539 | "require": { 2540 | "doctrine/instantiator": "^1.0.2", 2541 | "php": "^5.6 || ^7.0", 2542 | "phpunit/php-text-template": "^1.2", 2543 | "sebastian/exporter": "^1.2 || ^2.0" 2544 | }, 2545 | "conflict": { 2546 | "phpunit/phpunit": "<5.4.0" 2547 | }, 2548 | "require-dev": { 2549 | "phpunit/phpunit": "^5.4" 2550 | }, 2551 | "suggest": { 2552 | "ext-soap": "*" 2553 | }, 2554 | "type": "library", 2555 | "extra": { 2556 | "branch-alias": { 2557 | "dev-master": "3.2.x-dev" 2558 | } 2559 | }, 2560 | "autoload": { 2561 | "classmap": [ 2562 | "src/" 2563 | ] 2564 | }, 2565 | "notification-url": "https://packagist.org/downloads/", 2566 | "license": [ 2567 | "BSD-3-Clause" 2568 | ], 2569 | "authors": [ 2570 | { 2571 | "name": "Sebastian Bergmann", 2572 | "email": "sb@sebastian-bergmann.de", 2573 | "role": "lead" 2574 | } 2575 | ], 2576 | "description": "Mock Object library for PHPUnit", 2577 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 2578 | "keywords": [ 2579 | "mock", 2580 | "xunit" 2581 | ], 2582 | "time": "2017-06-30T09:13:00+00:00" 2583 | }, 2584 | { 2585 | "name": "psr/log", 2586 | "version": "1.0.2", 2587 | "source": { 2588 | "type": "git", 2589 | "url": "https://github.com/php-fig/log.git", 2590 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 2591 | }, 2592 | "dist": { 2593 | "type": "zip", 2594 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 2595 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 2596 | "shasum": "" 2597 | }, 2598 | "require": { 2599 | "php": ">=5.3.0" 2600 | }, 2601 | "type": "library", 2602 | "extra": { 2603 | "branch-alias": { 2604 | "dev-master": "1.0.x-dev" 2605 | } 2606 | }, 2607 | "autoload": { 2608 | "psr-4": { 2609 | "Psr\\Log\\": "Psr/Log/" 2610 | } 2611 | }, 2612 | "notification-url": "https://packagist.org/downloads/", 2613 | "license": [ 2614 | "MIT" 2615 | ], 2616 | "authors": [ 2617 | { 2618 | "name": "PHP-FIG", 2619 | "homepage": "http://www.php-fig.org/" 2620 | } 2621 | ], 2622 | "description": "Common interface for logging libraries", 2623 | "homepage": "https://github.com/php-fig/log", 2624 | "keywords": [ 2625 | "log", 2626 | "psr", 2627 | "psr-3" 2628 | ], 2629 | "time": "2016-10-10T12:19:37+00:00" 2630 | }, 2631 | { 2632 | "name": "sebastian/code-unit-reverse-lookup", 2633 | "version": "1.0.1", 2634 | "source": { 2635 | "type": "git", 2636 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 2637 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 2638 | }, 2639 | "dist": { 2640 | "type": "zip", 2641 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2642 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2643 | "shasum": "" 2644 | }, 2645 | "require": { 2646 | "php": "^5.6 || ^7.0" 2647 | }, 2648 | "require-dev": { 2649 | "phpunit/phpunit": "^5.7 || ^6.0" 2650 | }, 2651 | "type": "library", 2652 | "extra": { 2653 | "branch-alias": { 2654 | "dev-master": "1.0.x-dev" 2655 | } 2656 | }, 2657 | "autoload": { 2658 | "classmap": [ 2659 | "src/" 2660 | ] 2661 | }, 2662 | "notification-url": "https://packagist.org/downloads/", 2663 | "license": [ 2664 | "BSD-3-Clause" 2665 | ], 2666 | "authors": [ 2667 | { 2668 | "name": "Sebastian Bergmann", 2669 | "email": "sebastian@phpunit.de" 2670 | } 2671 | ], 2672 | "description": "Looks up which function or method a line of code belongs to", 2673 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 2674 | "time": "2017-03-04T06:30:41+00:00" 2675 | }, 2676 | { 2677 | "name": "sebastian/comparator", 2678 | "version": "1.2.4", 2679 | "source": { 2680 | "type": "git", 2681 | "url": "https://github.com/sebastianbergmann/comparator.git", 2682 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" 2683 | }, 2684 | "dist": { 2685 | "type": "zip", 2686 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 2687 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 2688 | "shasum": "" 2689 | }, 2690 | "require": { 2691 | "php": ">=5.3.3", 2692 | "sebastian/diff": "~1.2", 2693 | "sebastian/exporter": "~1.2 || ~2.0" 2694 | }, 2695 | "require-dev": { 2696 | "phpunit/phpunit": "~4.4" 2697 | }, 2698 | "type": "library", 2699 | "extra": { 2700 | "branch-alias": { 2701 | "dev-master": "1.2.x-dev" 2702 | } 2703 | }, 2704 | "autoload": { 2705 | "classmap": [ 2706 | "src/" 2707 | ] 2708 | }, 2709 | "notification-url": "https://packagist.org/downloads/", 2710 | "license": [ 2711 | "BSD-3-Clause" 2712 | ], 2713 | "authors": [ 2714 | { 2715 | "name": "Jeff Welch", 2716 | "email": "whatthejeff@gmail.com" 2717 | }, 2718 | { 2719 | "name": "Volker Dusch", 2720 | "email": "github@wallbash.com" 2721 | }, 2722 | { 2723 | "name": "Bernhard Schussek", 2724 | "email": "bschussek@2bepublished.at" 2725 | }, 2726 | { 2727 | "name": "Sebastian Bergmann", 2728 | "email": "sebastian@phpunit.de" 2729 | } 2730 | ], 2731 | "description": "Provides the functionality to compare PHP values for equality", 2732 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 2733 | "keywords": [ 2734 | "comparator", 2735 | "compare", 2736 | "equality" 2737 | ], 2738 | "time": "2017-01-29T09:50:25+00:00" 2739 | }, 2740 | { 2741 | "name": "sebastian/diff", 2742 | "version": "1.4.3", 2743 | "source": { 2744 | "type": "git", 2745 | "url": "https://github.com/sebastianbergmann/diff.git", 2746 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" 2747 | }, 2748 | "dist": { 2749 | "type": "zip", 2750 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", 2751 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", 2752 | "shasum": "" 2753 | }, 2754 | "require": { 2755 | "php": "^5.3.3 || ^7.0" 2756 | }, 2757 | "require-dev": { 2758 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 2759 | }, 2760 | "type": "library", 2761 | "extra": { 2762 | "branch-alias": { 2763 | "dev-master": "1.4-dev" 2764 | } 2765 | }, 2766 | "autoload": { 2767 | "classmap": [ 2768 | "src/" 2769 | ] 2770 | }, 2771 | "notification-url": "https://packagist.org/downloads/", 2772 | "license": [ 2773 | "BSD-3-Clause" 2774 | ], 2775 | "authors": [ 2776 | { 2777 | "name": "Kore Nordmann", 2778 | "email": "mail@kore-nordmann.de" 2779 | }, 2780 | { 2781 | "name": "Sebastian Bergmann", 2782 | "email": "sebastian@phpunit.de" 2783 | } 2784 | ], 2785 | "description": "Diff implementation", 2786 | "homepage": "https://github.com/sebastianbergmann/diff", 2787 | "keywords": [ 2788 | "diff" 2789 | ], 2790 | "time": "2017-05-22T07:24:03+00:00" 2791 | }, 2792 | { 2793 | "name": "sebastian/environment", 2794 | "version": "2.0.0", 2795 | "source": { 2796 | "type": "git", 2797 | "url": "https://github.com/sebastianbergmann/environment.git", 2798 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" 2799 | }, 2800 | "dist": { 2801 | "type": "zip", 2802 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 2803 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 2804 | "shasum": "" 2805 | }, 2806 | "require": { 2807 | "php": "^5.6 || ^7.0" 2808 | }, 2809 | "require-dev": { 2810 | "phpunit/phpunit": "^5.0" 2811 | }, 2812 | "type": "library", 2813 | "extra": { 2814 | "branch-alias": { 2815 | "dev-master": "2.0.x-dev" 2816 | } 2817 | }, 2818 | "autoload": { 2819 | "classmap": [ 2820 | "src/" 2821 | ] 2822 | }, 2823 | "notification-url": "https://packagist.org/downloads/", 2824 | "license": [ 2825 | "BSD-3-Clause" 2826 | ], 2827 | "authors": [ 2828 | { 2829 | "name": "Sebastian Bergmann", 2830 | "email": "sebastian@phpunit.de" 2831 | } 2832 | ], 2833 | "description": "Provides functionality to handle HHVM/PHP environments", 2834 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2835 | "keywords": [ 2836 | "Xdebug", 2837 | "environment", 2838 | "hhvm" 2839 | ], 2840 | "time": "2016-11-26T07:53:53+00:00" 2841 | }, 2842 | { 2843 | "name": "sebastian/exporter", 2844 | "version": "2.0.0", 2845 | "source": { 2846 | "type": "git", 2847 | "url": "https://github.com/sebastianbergmann/exporter.git", 2848 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" 2849 | }, 2850 | "dist": { 2851 | "type": "zip", 2852 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 2853 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 2854 | "shasum": "" 2855 | }, 2856 | "require": { 2857 | "php": ">=5.3.3", 2858 | "sebastian/recursion-context": "~2.0" 2859 | }, 2860 | "require-dev": { 2861 | "ext-mbstring": "*", 2862 | "phpunit/phpunit": "~4.4" 2863 | }, 2864 | "type": "library", 2865 | "extra": { 2866 | "branch-alias": { 2867 | "dev-master": "2.0.x-dev" 2868 | } 2869 | }, 2870 | "autoload": { 2871 | "classmap": [ 2872 | "src/" 2873 | ] 2874 | }, 2875 | "notification-url": "https://packagist.org/downloads/", 2876 | "license": [ 2877 | "BSD-3-Clause" 2878 | ], 2879 | "authors": [ 2880 | { 2881 | "name": "Jeff Welch", 2882 | "email": "whatthejeff@gmail.com" 2883 | }, 2884 | { 2885 | "name": "Volker Dusch", 2886 | "email": "github@wallbash.com" 2887 | }, 2888 | { 2889 | "name": "Bernhard Schussek", 2890 | "email": "bschussek@2bepublished.at" 2891 | }, 2892 | { 2893 | "name": "Sebastian Bergmann", 2894 | "email": "sebastian@phpunit.de" 2895 | }, 2896 | { 2897 | "name": "Adam Harvey", 2898 | "email": "aharvey@php.net" 2899 | } 2900 | ], 2901 | "description": "Provides the functionality to export PHP variables for visualization", 2902 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 2903 | "keywords": [ 2904 | "export", 2905 | "exporter" 2906 | ], 2907 | "time": "2016-11-19T08:54:04+00:00" 2908 | }, 2909 | { 2910 | "name": "sebastian/global-state", 2911 | "version": "1.1.1", 2912 | "source": { 2913 | "type": "git", 2914 | "url": "https://github.com/sebastianbergmann/global-state.git", 2915 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 2916 | }, 2917 | "dist": { 2918 | "type": "zip", 2919 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 2920 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 2921 | "shasum": "" 2922 | }, 2923 | "require": { 2924 | "php": ">=5.3.3" 2925 | }, 2926 | "require-dev": { 2927 | "phpunit/phpunit": "~4.2" 2928 | }, 2929 | "suggest": { 2930 | "ext-uopz": "*" 2931 | }, 2932 | "type": "library", 2933 | "extra": { 2934 | "branch-alias": { 2935 | "dev-master": "1.0-dev" 2936 | } 2937 | }, 2938 | "autoload": { 2939 | "classmap": [ 2940 | "src/" 2941 | ] 2942 | }, 2943 | "notification-url": "https://packagist.org/downloads/", 2944 | "license": [ 2945 | "BSD-3-Clause" 2946 | ], 2947 | "authors": [ 2948 | { 2949 | "name": "Sebastian Bergmann", 2950 | "email": "sebastian@phpunit.de" 2951 | } 2952 | ], 2953 | "description": "Snapshotting of global state", 2954 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2955 | "keywords": [ 2956 | "global state" 2957 | ], 2958 | "time": "2015-10-12T03:26:01+00:00" 2959 | }, 2960 | { 2961 | "name": "sebastian/object-enumerator", 2962 | "version": "2.0.1", 2963 | "source": { 2964 | "type": "git", 2965 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2966 | "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" 2967 | }, 2968 | "dist": { 2969 | "type": "zip", 2970 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", 2971 | "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", 2972 | "shasum": "" 2973 | }, 2974 | "require": { 2975 | "php": ">=5.6", 2976 | "sebastian/recursion-context": "~2.0" 2977 | }, 2978 | "require-dev": { 2979 | "phpunit/phpunit": "~5" 2980 | }, 2981 | "type": "library", 2982 | "extra": { 2983 | "branch-alias": { 2984 | "dev-master": "2.0.x-dev" 2985 | } 2986 | }, 2987 | "autoload": { 2988 | "classmap": [ 2989 | "src/" 2990 | ] 2991 | }, 2992 | "notification-url": "https://packagist.org/downloads/", 2993 | "license": [ 2994 | "BSD-3-Clause" 2995 | ], 2996 | "authors": [ 2997 | { 2998 | "name": "Sebastian Bergmann", 2999 | "email": "sebastian@phpunit.de" 3000 | } 3001 | ], 3002 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 3003 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 3004 | "time": "2017-02-18T15:18:39+00:00" 3005 | }, 3006 | { 3007 | "name": "sebastian/recursion-context", 3008 | "version": "2.0.0", 3009 | "source": { 3010 | "type": "git", 3011 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 3012 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" 3013 | }, 3014 | "dist": { 3015 | "type": "zip", 3016 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", 3017 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", 3018 | "shasum": "" 3019 | }, 3020 | "require": { 3021 | "php": ">=5.3.3" 3022 | }, 3023 | "require-dev": { 3024 | "phpunit/phpunit": "~4.4" 3025 | }, 3026 | "type": "library", 3027 | "extra": { 3028 | "branch-alias": { 3029 | "dev-master": "2.0.x-dev" 3030 | } 3031 | }, 3032 | "autoload": { 3033 | "classmap": [ 3034 | "src/" 3035 | ] 3036 | }, 3037 | "notification-url": "https://packagist.org/downloads/", 3038 | "license": [ 3039 | "BSD-3-Clause" 3040 | ], 3041 | "authors": [ 3042 | { 3043 | "name": "Jeff Welch", 3044 | "email": "whatthejeff@gmail.com" 3045 | }, 3046 | { 3047 | "name": "Sebastian Bergmann", 3048 | "email": "sebastian@phpunit.de" 3049 | }, 3050 | { 3051 | "name": "Adam Harvey", 3052 | "email": "aharvey@php.net" 3053 | } 3054 | ], 3055 | "description": "Provides functionality to recursively process PHP variables", 3056 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 3057 | "time": "2016-11-19T07:33:16+00:00" 3058 | }, 3059 | { 3060 | "name": "sebastian/resource-operations", 3061 | "version": "1.0.0", 3062 | "source": { 3063 | "type": "git", 3064 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 3065 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 3066 | }, 3067 | "dist": { 3068 | "type": "zip", 3069 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3070 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3071 | "shasum": "" 3072 | }, 3073 | "require": { 3074 | "php": ">=5.6.0" 3075 | }, 3076 | "type": "library", 3077 | "extra": { 3078 | "branch-alias": { 3079 | "dev-master": "1.0.x-dev" 3080 | } 3081 | }, 3082 | "autoload": { 3083 | "classmap": [ 3084 | "src/" 3085 | ] 3086 | }, 3087 | "notification-url": "https://packagist.org/downloads/", 3088 | "license": [ 3089 | "BSD-3-Clause" 3090 | ], 3091 | "authors": [ 3092 | { 3093 | "name": "Sebastian Bergmann", 3094 | "email": "sebastian@phpunit.de" 3095 | } 3096 | ], 3097 | "description": "Provides a list of PHP built-in functions that operate on resources", 3098 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 3099 | "time": "2015-07-28T20:34:47+00:00" 3100 | }, 3101 | { 3102 | "name": "sebastian/version", 3103 | "version": "2.0.1", 3104 | "source": { 3105 | "type": "git", 3106 | "url": "https://github.com/sebastianbergmann/version.git", 3107 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 3108 | }, 3109 | "dist": { 3110 | "type": "zip", 3111 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 3112 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 3113 | "shasum": "" 3114 | }, 3115 | "require": { 3116 | "php": ">=5.6" 3117 | }, 3118 | "type": "library", 3119 | "extra": { 3120 | "branch-alias": { 3121 | "dev-master": "2.0.x-dev" 3122 | } 3123 | }, 3124 | "autoload": { 3125 | "classmap": [ 3126 | "src/" 3127 | ] 3128 | }, 3129 | "notification-url": "https://packagist.org/downloads/", 3130 | "license": [ 3131 | "BSD-3-Clause" 3132 | ], 3133 | "authors": [ 3134 | { 3135 | "name": "Sebastian Bergmann", 3136 | "email": "sebastian@phpunit.de", 3137 | "role": "lead" 3138 | } 3139 | ], 3140 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3141 | "homepage": "https://github.com/sebastianbergmann/version", 3142 | "time": "2016-10-03T07:35:21+00:00" 3143 | }, 3144 | { 3145 | "name": "seld/jsonlint", 3146 | "version": "1.7.1", 3147 | "source": { 3148 | "type": "git", 3149 | "url": "https://github.com/Seldaek/jsonlint.git", 3150 | "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38" 3151 | }, 3152 | "dist": { 3153 | "type": "zip", 3154 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/d15f59a67ff805a44c50ea0516d2341740f81a38", 3155 | "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38", 3156 | "shasum": "" 3157 | }, 3158 | "require": { 3159 | "php": "^5.3 || ^7.0" 3160 | }, 3161 | "require-dev": { 3162 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 3163 | }, 3164 | "bin": [ 3165 | "bin/jsonlint" 3166 | ], 3167 | "type": "library", 3168 | "autoload": { 3169 | "psr-4": { 3170 | "Seld\\JsonLint\\": "src/Seld/JsonLint/" 3171 | } 3172 | }, 3173 | "notification-url": "https://packagist.org/downloads/", 3174 | "license": [ 3175 | "MIT" 3176 | ], 3177 | "authors": [ 3178 | { 3179 | "name": "Jordi Boggiano", 3180 | "email": "j.boggiano@seld.be", 3181 | "homepage": "http://seld.be" 3182 | } 3183 | ], 3184 | "description": "JSON Linter", 3185 | "keywords": [ 3186 | "json", 3187 | "linter", 3188 | "parser", 3189 | "validator" 3190 | ], 3191 | "time": "2018-01-24T12:46:19+00:00" 3192 | }, 3193 | { 3194 | "name": "symfony/class-loader", 3195 | "version": "v2.8.45", 3196 | "source": { 3197 | "type": "git", 3198 | "url": "https://github.com/symfony/class-loader.git", 3199 | "reference": "f65a559906874b194eda635eacf7ffeef0fbff3d" 3200 | }, 3201 | "dist": { 3202 | "type": "zip", 3203 | "url": "https://api.github.com/repos/symfony/class-loader/zipball/f65a559906874b194eda635eacf7ffeef0fbff3d", 3204 | "reference": "f65a559906874b194eda635eacf7ffeef0fbff3d", 3205 | "shasum": "" 3206 | }, 3207 | "require": { 3208 | "php": ">=5.3.9", 3209 | "symfony/polyfill-apcu": "~1.1" 3210 | }, 3211 | "require-dev": { 3212 | "symfony/finder": "^2.0.5|~3.0.0" 3213 | }, 3214 | "type": "library", 3215 | "extra": { 3216 | "branch-alias": { 3217 | "dev-master": "2.8-dev" 3218 | } 3219 | }, 3220 | "autoload": { 3221 | "psr-4": { 3222 | "Symfony\\Component\\ClassLoader\\": "" 3223 | }, 3224 | "exclude-from-classmap": [ 3225 | "/Tests/" 3226 | ] 3227 | }, 3228 | "notification-url": "https://packagist.org/downloads/", 3229 | "license": [ 3230 | "MIT" 3231 | ], 3232 | "authors": [ 3233 | { 3234 | "name": "Fabien Potencier", 3235 | "email": "fabien@symfony.com" 3236 | }, 3237 | { 3238 | "name": "Symfony Community", 3239 | "homepage": "https://symfony.com/contributors" 3240 | } 3241 | ], 3242 | "description": "Symfony ClassLoader Component", 3243 | "homepage": "https://symfony.com", 3244 | "time": "2018-07-26T11:13:39+00:00" 3245 | }, 3246 | { 3247 | "name": "symfony/console", 3248 | "version": "v2.8.45", 3249 | "source": { 3250 | "type": "git", 3251 | "url": "https://github.com/symfony/console.git", 3252 | "reference": "0c1fcbb9afb5cff992c982ff99c0434f0146dcfc" 3253 | }, 3254 | "dist": { 3255 | "type": "zip", 3256 | "url": "https://api.github.com/repos/symfony/console/zipball/0c1fcbb9afb5cff992c982ff99c0434f0146dcfc", 3257 | "reference": "0c1fcbb9afb5cff992c982ff99c0434f0146dcfc", 3258 | "shasum": "" 3259 | }, 3260 | "require": { 3261 | "php": ">=5.3.9", 3262 | "symfony/debug": "^2.7.2|~3.0.0", 3263 | "symfony/polyfill-mbstring": "~1.0" 3264 | }, 3265 | "require-dev": { 3266 | "psr/log": "~1.0", 3267 | "symfony/event-dispatcher": "~2.1|~3.0.0", 3268 | "symfony/process": "~2.1|~3.0.0" 3269 | }, 3270 | "suggest": { 3271 | "psr/log-implementation": "For using the console logger", 3272 | "symfony/event-dispatcher": "", 3273 | "symfony/process": "" 3274 | }, 3275 | "type": "library", 3276 | "extra": { 3277 | "branch-alias": { 3278 | "dev-master": "2.8-dev" 3279 | } 3280 | }, 3281 | "autoload": { 3282 | "psr-4": { 3283 | "Symfony\\Component\\Console\\": "" 3284 | }, 3285 | "exclude-from-classmap": [ 3286 | "/Tests/" 3287 | ] 3288 | }, 3289 | "notification-url": "https://packagist.org/downloads/", 3290 | "license": [ 3291 | "MIT" 3292 | ], 3293 | "authors": [ 3294 | { 3295 | "name": "Fabien Potencier", 3296 | "email": "fabien@symfony.com" 3297 | }, 3298 | { 3299 | "name": "Symfony Community", 3300 | "homepage": "https://symfony.com/contributors" 3301 | } 3302 | ], 3303 | "description": "Symfony Console Component", 3304 | "homepage": "https://symfony.com", 3305 | "time": "2018-07-26T11:13:39+00:00" 3306 | }, 3307 | { 3308 | "name": "symfony/debug", 3309 | "version": "v3.0.9", 3310 | "source": { 3311 | "type": "git", 3312 | "url": "https://github.com/symfony/debug.git", 3313 | "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a" 3314 | }, 3315 | "dist": { 3316 | "type": "zip", 3317 | "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a", 3318 | "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a", 3319 | "shasum": "" 3320 | }, 3321 | "require": { 3322 | "php": ">=5.5.9", 3323 | "psr/log": "~1.0" 3324 | }, 3325 | "conflict": { 3326 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 3327 | }, 3328 | "require-dev": { 3329 | "symfony/class-loader": "~2.8|~3.0", 3330 | "symfony/http-kernel": "~2.8|~3.0" 3331 | }, 3332 | "type": "library", 3333 | "extra": { 3334 | "branch-alias": { 3335 | "dev-master": "3.0-dev" 3336 | } 3337 | }, 3338 | "autoload": { 3339 | "psr-4": { 3340 | "Symfony\\Component\\Debug\\": "" 3341 | }, 3342 | "exclude-from-classmap": [ 3343 | "/Tests/" 3344 | ] 3345 | }, 3346 | "notification-url": "https://packagist.org/downloads/", 3347 | "license": [ 3348 | "MIT" 3349 | ], 3350 | "authors": [ 3351 | { 3352 | "name": "Fabien Potencier", 3353 | "email": "fabien@symfony.com" 3354 | }, 3355 | { 3356 | "name": "Symfony Community", 3357 | "homepage": "https://symfony.com/contributors" 3358 | } 3359 | ], 3360 | "description": "Symfony Debug Component", 3361 | "homepage": "https://symfony.com", 3362 | "time": "2016-07-30T07:22:48+00:00" 3363 | }, 3364 | { 3365 | "name": "symfony/options-resolver", 3366 | "version": "v2.6.13", 3367 | "target-dir": "Symfony/Component/OptionsResolver", 3368 | "source": { 3369 | "type": "git", 3370 | "url": "https://github.com/symfony/options-resolver.git", 3371 | "reference": "31e56594cee489e9a235b852228b0598b52101c1" 3372 | }, 3373 | "dist": { 3374 | "type": "zip", 3375 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/31e56594cee489e9a235b852228b0598b52101c1", 3376 | "reference": "31e56594cee489e9a235b852228b0598b52101c1", 3377 | "shasum": "" 3378 | }, 3379 | "require": { 3380 | "php": ">=5.3.3" 3381 | }, 3382 | "require-dev": { 3383 | "symfony/phpunit-bridge": "~2.7" 3384 | }, 3385 | "type": "library", 3386 | "extra": { 3387 | "branch-alias": { 3388 | "dev-master": "2.6-dev" 3389 | } 3390 | }, 3391 | "autoload": { 3392 | "psr-0": { 3393 | "Symfony\\Component\\OptionsResolver\\": "" 3394 | } 3395 | }, 3396 | "notification-url": "https://packagist.org/downloads/", 3397 | "license": [ 3398 | "MIT" 3399 | ], 3400 | "authors": [ 3401 | { 3402 | "name": "Fabien Potencier", 3403 | "email": "fabien@symfony.com" 3404 | }, 3405 | { 3406 | "name": "Symfony Community", 3407 | "homepage": "https://symfony.com/contributors" 3408 | } 3409 | ], 3410 | "description": "Symfony OptionsResolver Component", 3411 | "homepage": "https://symfony.com", 3412 | "keywords": [ 3413 | "config", 3414 | "configuration", 3415 | "options" 3416 | ], 3417 | "time": "2015-05-13T11:33:56+00:00" 3418 | }, 3419 | { 3420 | "name": "symfony/polyfill-apcu", 3421 | "version": "v1.9.0", 3422 | "source": { 3423 | "type": "git", 3424 | "url": "https://github.com/symfony/polyfill-apcu.git", 3425 | "reference": "19e1b73bf255265ad0b568f81766ae2a3266d8d2" 3426 | }, 3427 | "dist": { 3428 | "type": "zip", 3429 | "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/19e1b73bf255265ad0b568f81766ae2a3266d8d2", 3430 | "reference": "19e1b73bf255265ad0b568f81766ae2a3266d8d2", 3431 | "shasum": "" 3432 | }, 3433 | "require": { 3434 | "php": ">=5.3.3" 3435 | }, 3436 | "type": "library", 3437 | "extra": { 3438 | "branch-alias": { 3439 | "dev-master": "1.9-dev" 3440 | } 3441 | }, 3442 | "autoload": { 3443 | "psr-4": { 3444 | "Symfony\\Polyfill\\Apcu\\": "" 3445 | }, 3446 | "files": [ 3447 | "bootstrap.php" 3448 | ] 3449 | }, 3450 | "notification-url": "https://packagist.org/downloads/", 3451 | "license": [ 3452 | "MIT" 3453 | ], 3454 | "authors": [ 3455 | { 3456 | "name": "Nicolas Grekas", 3457 | "email": "p@tchwork.com" 3458 | }, 3459 | { 3460 | "name": "Symfony Community", 3461 | "homepage": "https://symfony.com/contributors" 3462 | } 3463 | ], 3464 | "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions", 3465 | "homepage": "https://symfony.com", 3466 | "keywords": [ 3467 | "apcu", 3468 | "compatibility", 3469 | "polyfill", 3470 | "portable", 3471 | "shim" 3472 | ], 3473 | "time": "2018-08-06T14:22:27+00:00" 3474 | }, 3475 | { 3476 | "name": "symfony/polyfill-ctype", 3477 | "version": "v1.9.0", 3478 | "source": { 3479 | "type": "git", 3480 | "url": "https://github.com/symfony/polyfill-ctype.git", 3481 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" 3482 | }, 3483 | "dist": { 3484 | "type": "zip", 3485 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", 3486 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", 3487 | "shasum": "" 3488 | }, 3489 | "require": { 3490 | "php": ">=5.3.3" 3491 | }, 3492 | "suggest": { 3493 | "ext-ctype": "For best performance" 3494 | }, 3495 | "type": "library", 3496 | "extra": { 3497 | "branch-alias": { 3498 | "dev-master": "1.9-dev" 3499 | } 3500 | }, 3501 | "autoload": { 3502 | "psr-4": { 3503 | "Symfony\\Polyfill\\Ctype\\": "" 3504 | }, 3505 | "files": [ 3506 | "bootstrap.php" 3507 | ] 3508 | }, 3509 | "notification-url": "https://packagist.org/downloads/", 3510 | "license": [ 3511 | "MIT" 3512 | ], 3513 | "authors": [ 3514 | { 3515 | "name": "Symfony Community", 3516 | "homepage": "https://symfony.com/contributors" 3517 | }, 3518 | { 3519 | "name": "Gert de Pagter", 3520 | "email": "BackEndTea@gmail.com" 3521 | } 3522 | ], 3523 | "description": "Symfony polyfill for ctype functions", 3524 | "homepage": "https://symfony.com", 3525 | "keywords": [ 3526 | "compatibility", 3527 | "ctype", 3528 | "polyfill", 3529 | "portable" 3530 | ], 3531 | "time": "2018-08-06T14:22:27+00:00" 3532 | }, 3533 | { 3534 | "name": "symfony/polyfill-mbstring", 3535 | "version": "v1.9.0", 3536 | "source": { 3537 | "type": "git", 3538 | "url": "https://github.com/symfony/polyfill-mbstring.git", 3539 | "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" 3540 | }, 3541 | "dist": { 3542 | "type": "zip", 3543 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", 3544 | "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", 3545 | "shasum": "" 3546 | }, 3547 | "require": { 3548 | "php": ">=5.3.3" 3549 | }, 3550 | "suggest": { 3551 | "ext-mbstring": "For best performance" 3552 | }, 3553 | "type": "library", 3554 | "extra": { 3555 | "branch-alias": { 3556 | "dev-master": "1.9-dev" 3557 | } 3558 | }, 3559 | "autoload": { 3560 | "psr-4": { 3561 | "Symfony\\Polyfill\\Mbstring\\": "" 3562 | }, 3563 | "files": [ 3564 | "bootstrap.php" 3565 | ] 3566 | }, 3567 | "notification-url": "https://packagist.org/downloads/", 3568 | "license": [ 3569 | "MIT" 3570 | ], 3571 | "authors": [ 3572 | { 3573 | "name": "Nicolas Grekas", 3574 | "email": "p@tchwork.com" 3575 | }, 3576 | { 3577 | "name": "Symfony Community", 3578 | "homepage": "https://symfony.com/contributors" 3579 | } 3580 | ], 3581 | "description": "Symfony polyfill for the Mbstring extension", 3582 | "homepage": "https://symfony.com", 3583 | "keywords": [ 3584 | "compatibility", 3585 | "mbstring", 3586 | "polyfill", 3587 | "portable", 3588 | "shim" 3589 | ], 3590 | "time": "2018-08-06T14:22:27+00:00" 3591 | }, 3592 | { 3593 | "name": "symfony/yaml", 3594 | "version": "v2.8.45", 3595 | "source": { 3596 | "type": "git", 3597 | "url": "https://github.com/symfony/yaml.git", 3598 | "reference": "fbf876678e29dc634430dcf0096e216eb0004467" 3599 | }, 3600 | "dist": { 3601 | "type": "zip", 3602 | "url": "https://api.github.com/repos/symfony/yaml/zipball/fbf876678e29dc634430dcf0096e216eb0004467", 3603 | "reference": "fbf876678e29dc634430dcf0096e216eb0004467", 3604 | "shasum": "" 3605 | }, 3606 | "require": { 3607 | "php": ">=5.3.9", 3608 | "symfony/polyfill-ctype": "~1.8" 3609 | }, 3610 | "type": "library", 3611 | "extra": { 3612 | "branch-alias": { 3613 | "dev-master": "2.8-dev" 3614 | } 3615 | }, 3616 | "autoload": { 3617 | "psr-4": { 3618 | "Symfony\\Component\\Yaml\\": "" 3619 | }, 3620 | "exclude-from-classmap": [ 3621 | "/Tests/" 3622 | ] 3623 | }, 3624 | "notification-url": "https://packagist.org/downloads/", 3625 | "license": [ 3626 | "MIT" 3627 | ], 3628 | "authors": [ 3629 | { 3630 | "name": "Fabien Potencier", 3631 | "email": "fabien@symfony.com" 3632 | }, 3633 | { 3634 | "name": "Symfony Community", 3635 | "homepage": "https://symfony.com/contributors" 3636 | } 3637 | ], 3638 | "description": "Symfony Yaml Component", 3639 | "homepage": "https://symfony.com", 3640 | "time": "2018-07-26T09:03:18+00:00" 3641 | }, 3642 | { 3643 | "name": "tracy/tracy", 3644 | "version": "v2.5.2", 3645 | "source": { 3646 | "type": "git", 3647 | "url": "https://github.com/nette/tracy.git", 3648 | "reference": "93f89fbff33db4d583062104c71d6083b717371a" 3649 | }, 3650 | "dist": { 3651 | "type": "zip", 3652 | "url": "https://api.github.com/repos/nette/tracy/zipball/93f89fbff33db4d583062104c71d6083b717371a", 3653 | "reference": "93f89fbff33db4d583062104c71d6083b717371a", 3654 | "shasum": "" 3655 | }, 3656 | "require": { 3657 | "ext-json": "*", 3658 | "ext-session": "*", 3659 | "php": ">=5.4.4" 3660 | }, 3661 | "require-dev": { 3662 | "nette/di": "~2.3", 3663 | "nette/tester": "~1.7" 3664 | }, 3665 | "suggest": { 3666 | "https://nette.org/donate": "Please support Tracy via a donation" 3667 | }, 3668 | "type": "library", 3669 | "extra": { 3670 | "branch-alias": { 3671 | "dev-master": "2.5-dev" 3672 | } 3673 | }, 3674 | "autoload": { 3675 | "classmap": [ 3676 | "src" 3677 | ], 3678 | "files": [ 3679 | "src/shortcuts.php" 3680 | ] 3681 | }, 3682 | "notification-url": "https://packagist.org/downloads/", 3683 | "license": [ 3684 | "BSD-3-Clause" 3685 | ], 3686 | "authors": [ 3687 | { 3688 | "name": "David Grudl", 3689 | "homepage": "https://davidgrudl.com" 3690 | }, 3691 | { 3692 | "name": "Nette Community", 3693 | "homepage": "https://nette.org/contributors" 3694 | } 3695 | ], 3696 | "description": "😎 Tracy: the addictive tool to ease debugging PHP code for cool developers. Friendly design, logging, profiler, advanced features like debugging AJAX calls or CLI support. You will love it.", 3697 | "homepage": "https://tracy.nette.org", 3698 | "keywords": [ 3699 | "Xdebug", 3700 | "debug", 3701 | "debugger", 3702 | "nette", 3703 | "profiler" 3704 | ], 3705 | "time": "2018-08-13T16:46:17+00:00" 3706 | }, 3707 | { 3708 | "name": "webmozart/assert", 3709 | "version": "1.3.0", 3710 | "source": { 3711 | "type": "git", 3712 | "url": "https://github.com/webmozart/assert.git", 3713 | "reference": "0df1908962e7a3071564e857d86874dad1ef204a" 3714 | }, 3715 | "dist": { 3716 | "type": "zip", 3717 | "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", 3718 | "reference": "0df1908962e7a3071564e857d86874dad1ef204a", 3719 | "shasum": "" 3720 | }, 3721 | "require": { 3722 | "php": "^5.3.3 || ^7.0" 3723 | }, 3724 | "require-dev": { 3725 | "phpunit/phpunit": "^4.6", 3726 | "sebastian/version": "^1.0.1" 3727 | }, 3728 | "type": "library", 3729 | "extra": { 3730 | "branch-alias": { 3731 | "dev-master": "1.3-dev" 3732 | } 3733 | }, 3734 | "autoload": { 3735 | "psr-4": { 3736 | "Webmozart\\Assert\\": "src/" 3737 | } 3738 | }, 3739 | "notification-url": "https://packagist.org/downloads/", 3740 | "license": [ 3741 | "MIT" 3742 | ], 3743 | "authors": [ 3744 | { 3745 | "name": "Bernhard Schussek", 3746 | "email": "bschussek@gmail.com" 3747 | } 3748 | ], 3749 | "description": "Assertions to validate method input/output with nice error messages.", 3750 | "keywords": [ 3751 | "assert", 3752 | "check", 3753 | "validate" 3754 | ], 3755 | "time": "2018-01-29T19:49:41+00:00" 3756 | } 3757 | ], 3758 | "aliases": [], 3759 | "minimum-stability": "stable", 3760 | "stability-flags": [], 3761 | "prefer-stable": false, 3762 | "prefer-lowest": false, 3763 | "platform": { 3764 | "php": ">=5.6.0" 3765 | }, 3766 | "platform-dev": [] 3767 | } 3768 | -------------------------------------------------------------------------------- /examples/ItemrankImport.php: -------------------------------------------------------------------------------- 1 | getStatus(); 25 | echo($response); 26 | 27 | // set user - generate 10 users 28 | for ($u=1; $u<=10; $u++) { 29 | $response=$client->setUser($u, array('age'=>20+$u, 'gender'=>'M')); 30 | print_r($response); 31 | } 32 | 33 | // set item - generate 50 items 34 | for ($i=1; $i<=50; $i++) { 35 | $response=$client->setItem($i, array('itypes'=>array('1'))); 36 | print_r($response); 37 | } 38 | 39 | // record event - each user randomly views 10 items 40 | for ($u=1; $u<=10; $u++) { 41 | for ($count=0; $count<10; $count++) { 42 | $i = rand(1, 50); 43 | $response=$client->recordUserActionOnItem('view', $u, $i); 44 | print_r($response); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /examples/ItemrankQuery.php: -------------------------------------------------------------------------------- 1 | getStatus(); 24 | //echo $response; 25 | 26 | // Rank item 1 to 5 for each user 27 | for ($i=1; $i<=10; $i++) { 28 | $response=$client->sendQuery(array('uid'=>$i, 'iids'=>array(1,2,3,4,5))); 29 | print_r($response); 30 | } 31 | -------------------------------------------------------------------------------- /examples/SampleEvent.php: -------------------------------------------------------------------------------- 1 | getStatus(); 29 | echo($response); 30 | 31 | // set user with event time 32 | $response=$client->setUser( 33 | 9, 34 | array('age'=>10), 35 | '2014-01-01T10:20:30.400+08:00' 36 | ); 37 | print_r($response); 38 | 39 | // set user 40 | $response=$client->setUser(8, array('age'=>20, 'gender'=>'M')); 41 | print_r($response); 42 | 43 | // unset user 44 | $response=$client->unsetUser(8, array('age'=>20)); 45 | print_r($response); 46 | 47 | // delete user 48 | $response=$client->deleteUser(9); 49 | print_r($response); 50 | 51 | // set item with event time 52 | $response=$client->setItem( 53 | 3, 54 | array('itypes'=>array('1')), 55 | '2013-12-20T05:15:25.350+08:00' 56 | ); 57 | print_r($response); 58 | 59 | // set item 60 | $response=$client->setItem(2, array('itypes'=>array('1'))); 61 | print_r($response); 62 | 63 | // unset item 64 | $response=$client->unsetItem(2, array('itypes'=>array('1'))); 65 | print_r($response); 66 | 67 | // delete item 68 | $response=$client->deleteItem(3, '2000-01-01T01:01:01.001+01:00'); 69 | print_r($response); 70 | 71 | // record user action on item 72 | $response=$client->recordUserActionOnItem('view', 8, 2); 73 | print_r($response); 74 | 75 | // create event 76 | $response=$client->createEvent(array( 77 | 'event' => 'my_event', 78 | 'entityType' => 'user', 79 | 'entityId' => '8', 80 | 'properties' => array('prop1'=>1, 'prop2'=>2), 81 | )); 82 | print_r($response); 83 | 84 | // get event 85 | $response=$client->getEvent('U_7eotSbeeK0BwshqEfRFAAAAUm-8gOyjP3FR73aBFo'); 86 | print_r($response); 87 | } catch (PredictionIOAPIError $e) { 88 | echo $e->getMessage(); 89 | } 90 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | 18 | 25 | 26 | 27 | ./tests/Unit 28 | 29 | 30 | 31 | 32 | 33 | ./src 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/predictionio/BaseClient.php: -------------------------------------------------------------------------------- 1 | baseUrl = $baseUrl; 40 | $this->client = new Client([ 41 | 'base_uri' => $this->baseUrl, 42 | 'timeout' => $timeout, 43 | 'connect_timeout' => $connectTimeout 44 | ]); 45 | } 46 | 47 | /** 48 | * Get the status of the Event Server or Engine Instance 49 | * 50 | * @return string status 51 | */ 52 | public function getStatus() 53 | { 54 | return $this->client->get('/')->getBody(); 55 | } 56 | 57 | /** 58 | * Send a HTTP request to the server 59 | * 60 | * @param string $method HTTP request method 61 | * @param string $url Relative or absolute url 62 | * @param string $body HTTP request body 63 | * 64 | * @return array JSON response 65 | * @throws PredictionIOAPIError Request error 66 | */ 67 | protected function sendRequest($method, $url, $body) 68 | { 69 | $options = [ 70 | 'headers' => [ 71 | 'Accept-Encoding' => 'gzip', 72 | 'Content-Type' => 'application/json', 73 | ], 74 | 'body' => $body, 75 | ]; 76 | 77 | try { 78 | $response = $this->client->request($method, $url, $options); 79 | return json_decode($response->getBody(), true); 80 | } catch (ClientException $e) { 81 | throw new PredictionIOAPIError($e->getMessage()); 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/predictionio/EngineClient.php: -------------------------------------------------------------------------------- 1 | sendRequest("POST", "/queries.json", json_encode($query)); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/predictionio/EventClient.php: -------------------------------------------------------------------------------- 1 | accessKey = $accessKey; 49 | $this->eventUrl = "/events.json?accessKey=$this->accessKey"; 50 | } 51 | 52 | private function getEventTime($eventTime) 53 | { 54 | $result = $eventTime; 55 | if (!isset($eventTime)) { 56 | $result = (new DateTime('NOW'))->format(self::DATE_TIME_FORMAT); 57 | } 58 | 59 | return $result; 60 | } 61 | 62 | /** 63 | * Set a user entity 64 | * 65 | * @param int|string User Id 66 | * @param array Properties of the user entity to set 67 | * @param string Time of the event in ISO 8601 format 68 | * (e.g. 2014-09-09T16:17:42.937-08:00). 69 | * Default is the current time. 70 | * 71 | * @return string JSON response 72 | * 73 | * @throws PredictionIOAPIError Request error 74 | */ 75 | public function setUser($uid, array $properties=array(), $eventTime=null) 76 | { 77 | $eventTime = $this->getEventTime($eventTime); 78 | 79 | // casting to object so that an empty array would be represented as {} 80 | if (empty($properties)) { 81 | $properties = (object)$properties; 82 | } 83 | 84 | $json = json_encode([ 85 | 'event' => '$set', 86 | 'entityType' => 'user', 87 | 'entityId' => $uid, 88 | 'properties' => $properties, 89 | 'eventTime' => $eventTime, 90 | ]); 91 | 92 | return $this->sendRequest('POST', $this->eventUrl, $json); 93 | } 94 | 95 | /** 96 | * Unset a user entity 97 | * 98 | * @param int|string User Id 99 | * @param array Properties of the user entity to unset 100 | * @param string Time of the event in ISO 8601 format 101 | * (e.g. 2014-09-09T16:17:42.937-08:00). 102 | * Default is the current time. 103 | * 104 | * @return string JSON response 105 | * 106 | * @throws PredictionIOAPIError Request error 107 | */ 108 | public function unsetUser($uid, array $properties, $eventTime=null) 109 | { 110 | $eventTime = $this->getEventTime($eventTime); 111 | if (empty($properties)) { 112 | throw new PredictionIOAPIError('Specify at least one property'); 113 | } 114 | 115 | $json = json_encode([ 116 | 'event' => '$unset', 117 | 'entityType' => 'user', 118 | 'entityId' => $uid, 119 | 'properties' => $properties, 120 | 'eventTime' => $eventTime, 121 | ]); 122 | 123 | return $this->sendRequest('POST', $this->eventUrl, $json); 124 | } 125 | 126 | /** 127 | * Delete a user entity 128 | * 129 | * @param int|string User Id 130 | * @param string Time of the event in ISO 8601 format 131 | * (e.g. 2014-09-09T16:17:42.937-08:00). 132 | * Default is the current time. 133 | * 134 | * @return string JSON response 135 | * 136 | * @throws PredictionIOAPIError Request error 137 | */ 138 | public function deleteUser($uid, $eventTime=null) 139 | { 140 | $eventTime = $this->getEventTime($eventTime); 141 | 142 | $json = json_encode([ 143 | 'event' => '$delete', 144 | 'entityType' => 'user', 145 | 'entityId' => $uid, 146 | 'eventTime' => $eventTime, 147 | ]); 148 | 149 | return $this->sendRequest('POST', $this->eventUrl, $json); 150 | } 151 | 152 | /** 153 | * Set an item entity 154 | * 155 | * @param int|string Item Id 156 | * @param array Properties of the item entity to set 157 | * @param string Time of the event in ISO 8601 format 158 | * (e.g. 2014-09-09T16:17:42.937-08:00). 159 | * Default is the current time. 160 | * 161 | * @return string JSON response 162 | * 163 | * @throws PredictionIOAPIError Request error 164 | */ 165 | public function setItem($iid, array $properties=array(), $eventTime=null) 166 | { 167 | $eventTime = $this->getEventTime($eventTime); 168 | if (empty($properties)) { 169 | $properties = (object)$properties; 170 | } 171 | $json = json_encode([ 172 | 'event' => '$set', 173 | 'entityType' => 'item', 174 | 'entityId' => $iid, 175 | 'properties' => $properties, 176 | 'eventTime' => $eventTime, 177 | ]); 178 | 179 | return $this->sendRequest('POST', $this->eventUrl, $json); 180 | } 181 | 182 | /** 183 | * Unset an item entity 184 | * 185 | * @param int|string Item Id 186 | * @param array Properties of the item entity to unset 187 | * @param string Time of the event in ISO 8601 format 188 | * (e.g. 2014-09-09T16:17:42.937-08:00). 189 | * Default is the current time. 190 | * 191 | * @return string JSON response 192 | * 193 | * @throws PredictionIOAPIError Request error 194 | */ 195 | public function unsetItem($iid, array $properties, $eventTime=null) 196 | { 197 | $eventTime = $this->getEventTime($eventTime); 198 | if (empty($properties)) { 199 | throw new PredictionIOAPIError('Specify at least one property'); 200 | } 201 | $json = json_encode([ 202 | 'event' => '$unset', 203 | 'entityType' => 'item', 204 | 'entityId' => $iid, 205 | 'properties' => $properties, 206 | 'eventTime' => $eventTime, 207 | ]); 208 | 209 | return $this->sendRequest('POST', $this->eventUrl, $json); 210 | } 211 | 212 | /** 213 | * Delete an item entity 214 | * 215 | * @param int|string Item Id 216 | * @param string Time of the event in ISO 8601 format 217 | * (e.g. 2014-09-09T16:17:42.937-08:00). 218 | * Default is the current time. 219 | * 220 | * @return string JSON response 221 | * 222 | * @throws PredictionIOAPIError Request error 223 | */ 224 | public function deleteItem($iid, $eventTime=null) 225 | { 226 | $eventTime = $this->getEventTime($eventTime); 227 | 228 | $json = json_encode([ 229 | 'event' => '$delete', 230 | 'entityType' => 'item', 231 | 'entityId' => $iid, 232 | 'eventTime' => $eventTime, 233 | ]); 234 | 235 | return $this->sendRequest('POST', $this->eventUrl, $json); 236 | } 237 | 238 | /** 239 | * Record a user action on an item 240 | * 241 | * @param string Event name 242 | * @param int|string User Id 243 | * @param int|string Item Id 244 | * @param array Properties of the event 245 | * @param string Time of the event in ISO 8601 format 246 | * (e.g. 2014-09-09T16:17:42.937-08:00). 247 | * Default is the current time. 248 | * 249 | * @return string JSON response 250 | * 251 | * @throws PredictionIOAPIError Request error 252 | */ 253 | public function recordUserActionOnItem( 254 | $event, 255 | $uid, 256 | $iid, 257 | array $properties=array(), 258 | $eventTime=null 259 | ) { 260 | $eventTime = $this->getEventTime($eventTime); 261 | if (empty($properties)) { 262 | $properties = (object)$properties; 263 | } 264 | $json = json_encode([ 265 | 'event' => $event, 266 | 'entityType' => 'user', 267 | 'entityId' => $uid, 268 | 'targetEntityType' => 'item', 269 | 'targetEntityId' => $iid, 270 | 'properties' => $properties, 271 | 'eventTime' => $eventTime, 272 | ]); 273 | 274 | return $this->sendRequest('POST', $this->eventUrl, $json); 275 | } 276 | 277 | /** 278 | * Create an event 279 | * 280 | * @param array An array describing the event 281 | * 282 | * @return string JSON response 283 | * 284 | * @throws PredictionIOAPIError Request error 285 | */ 286 | public function createEvent(array $data) 287 | { 288 | $json = json_encode($data); 289 | 290 | return $this->sendRequest('POST', $this->eventUrl, $json); 291 | } 292 | 293 | /** 294 | * Retrieve an event 295 | * 296 | * @param string Event ID 297 | * 298 | * @return string JSON response 299 | * 300 | * @throws PredictionIOAPIError Request error 301 | */ 302 | public function getEvent($eventId) 303 | { 304 | return $this->sendRequest( 305 | 'GET', 306 | "/events/$eventId.json?accessKey=$this->accessKey", 307 | '' 308 | ); 309 | } 310 | } 311 | -------------------------------------------------------------------------------- /src/predictionio/Exporter.php: -------------------------------------------------------------------------------- 1 | format(\DateTime::ISO8601); 57 | 58 | $data = [ 59 | 'event' => $event, 60 | 'entityType' => $entityType, 61 | 'entityId' => $entityId, 62 | 'eventTime' => $eventTime, 63 | ]; 64 | 65 | if (isset($targetEntityType)) { 66 | $data['targetEntityType'] = $targetEntityType; 67 | } 68 | 69 | if (isset($targetEntityId)) { 70 | $data['targetEntityId'] = $targetEntityId; 71 | } 72 | 73 | if (isset($properties)) { 74 | $data['properties'] = $properties; 75 | } 76 | 77 | $json = $this->jsonEncode($data); 78 | 79 | $this->export($json); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/predictionio/FileExporter.php: -------------------------------------------------------------------------------- 1 | file = fopen($fileName, 'w'); 34 | } 35 | 36 | public function export($json) 37 | { 38 | fwrite($this->file, "$json\n"); 39 | } 40 | 41 | public function close() 42 | { 43 | fclose($this->file); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/predictionio/PredictionIOAPIError.php: -------------------------------------------------------------------------------- 1 | container); 37 | $mock=new MockHandler([new Response(200)]); 38 | $handler=HandlerStack::create($mock); 39 | $handler->push($history); 40 | $this->engineClient=new EngineClient(); 41 | $existingOptions = $this->engineClient->client->getConfig(); 42 | $existingOptions['handler'] = $handler; 43 | $mockClient=new Client($existingOptions); 44 | $this->engineClient->client = $mockClient; 45 | } 46 | 47 | public function testSendQuery() 48 | { 49 | $this->engineClient->sendQuery(array('uid'=>5, 'iids'=>array(1,2,3))); 50 | $result=array_shift($this->container); 51 | /** @var Request[] $result['request'] */ 52 | $body=json_decode($result['request']->getBody(), true); 53 | 54 | $this->assertEquals(5, $body['uid']); 55 | $this->assertEquals(array(1,2,3), $body['iids']); 56 | $this->assertEquals('POST', $result['request']->getMethod()); 57 | $this->assertEquals('http://localhost:8000/queries.json', $result['request']->getUri()); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /tests/Unit/EventClientTest.php: -------------------------------------------------------------------------------- 1 | container); 37 | $mock=new MockHandler([new Response(200)]); 38 | $handler=HandlerStack::create($mock); 39 | $handler->push($history); 40 | $this->eventClient=new EventClient( 41 | "j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O" 42 | ); 43 | $existingOptions = $this->eventClient->client->getConfig(); 44 | $existingOptions['handler'] = $handler; 45 | $mockClient=new Client($existingOptions); 46 | $this->eventClient->client = $mockClient; 47 | } 48 | 49 | public function testSetUser() 50 | { 51 | $this->eventClient->setUser(1, array('age'=>20)); 52 | $result=array_shift($this->container); 53 | /** @var Request $request */ 54 | $request=$result['request']; 55 | $body=json_decode($request->getBody(), true); 56 | 57 | $this->assertEquals('$set', $body['event']); 58 | $this->assertEquals('user', $body['entityType']); 59 | $this->assertEquals(1, $body['entityId']); 60 | $this->assertEquals(20, $body['properties']['age']); 61 | $this->assertNotNull($body['eventTime']); 62 | $this->assertEquals('POST', $request->getMethod()); 63 | $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', $request->getUri()); 64 | } 65 | 66 | public function testSetUserWithEventTime() 67 | { 68 | $eventTime='1982-09-25T01:23:45+0800'; 69 | 70 | $this->eventClient->setUser(1, array('age'=>20), $eventTime); 71 | $result=array_shift($this->container); 72 | /** @var Request $request */ 73 | $request=$result['request']; 74 | $body=json_decode($request->getBody(), true); 75 | 76 | $this->assertEquals('$set', $body['event']); 77 | $this->assertEquals($eventTime, $body['eventTime']); 78 | } 79 | 80 | public function testUnsetUser() 81 | { 82 | $this->eventClient->unsetUser(1, array('age'=>20)); 83 | $result=array_shift($this->container); 84 | /** @var Request $request */ 85 | $request=$result['request']; 86 | $body=json_decode($request->getBody(), true); 87 | 88 | $this->assertEquals('$unset', $body['event']); 89 | $this->assertEquals('user', $body['entityType']); 90 | $this->assertEquals(1, $body['entityId']); 91 | $this->assertEquals(20, $body['properties']['age']); 92 | $this->assertNotNull($body['eventTime']); 93 | $this->assertEquals('POST', $request->getMethod()); 94 | $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', $request->getUri()); 95 | } 96 | 97 | public function testUnsetUserWithEventTime() 98 | { 99 | $eventTime='1982-09-25T01:23:45+0800'; 100 | 101 | $this->eventClient->unsetUser(1, array('age'=>20), $eventTime); 102 | $result=array_shift($this->container); 103 | /** @var Request $request */ 104 | $request=$result['request']; 105 | $body=json_decode($request->getBody(), true); 106 | 107 | $this->assertEquals('$unset', $body['event']); 108 | $this->assertEquals($eventTime, $body['eventTime']); 109 | } 110 | 111 | /** 112 | * @expectedException \predictionio\PredictionIOAPIError 113 | */ 114 | public function testUnsetUserWithoutProperties() 115 | { 116 | $this->eventClient->unsetUser(1, array()); 117 | } 118 | 119 | public function testDeleteUser() 120 | { 121 | $this->eventClient->deleteUser(1); 122 | $result=array_shift($this->container); 123 | /** @var Request $request */ 124 | $request=$result['request']; 125 | $body=json_decode($request->getBody(), true); 126 | 127 | $this->assertEquals('$delete', $body['event']); 128 | $this->assertEquals('user', $body['entityType']); 129 | $this->assertEquals(1, $body['entityId']); 130 | $this->assertNotNull($body['eventTime']); 131 | $this->assertEquals('POST', $request->getMethod()); 132 | $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', $request->getUri()); 133 | } 134 | 135 | public function testDeleteUserWithEventTime() 136 | { 137 | $eventTime='1982-09-25T01:23:45+0800'; 138 | 139 | $this->eventClient->deleteUser(1, $eventTime); 140 | $result=array_shift($this->container); 141 | /** @var Request $request */ 142 | $request=$result['request']; 143 | $body=json_decode($request->getBody(), true); 144 | 145 | $this->assertEquals('$delete', $body['event']); 146 | $this->assertEquals($eventTime, $body['eventTime']); 147 | } 148 | 149 | public function testSetItem() 150 | { 151 | $this->eventClient->setItem(1, array('type'=>'book')); 152 | $result=array_shift($this->container); 153 | /** @var Request $request */ 154 | $request=$result['request']; 155 | $body=json_decode($request->getBody(), true); 156 | 157 | $this->assertEquals('$set', $body['event']); 158 | $this->assertEquals('item', $body['entityType']); 159 | $this->assertEquals(1, $body['entityId']); 160 | $this->assertEquals('book', $body['properties']['type']); 161 | $this->assertNotNull($body['eventTime']); 162 | $this->assertEquals('POST', $request->getMethod()); 163 | $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', $request->getUri()); 164 | } 165 | 166 | public function testSetItemWithEventTime() 167 | { 168 | $eventTime='1982-09-25T01:23:45+0800'; 169 | 170 | $this->eventClient->setItem(1, array('type'=>'book'), $eventTime); 171 | $result=array_shift($this->container); 172 | /** @var Request $request */ 173 | $request=$result['request']; 174 | $body=json_decode($request->getBody(), true); 175 | 176 | $this->assertEquals('$set', $body['event']); 177 | $this->assertEquals($eventTime, $body['eventTime']); 178 | } 179 | 180 | public function testUnsetItem() 181 | { 182 | $this->eventClient->unsetItem(1, array('type'=>'book')); 183 | $result=array_shift($this->container); 184 | /** @var Request $request */ 185 | $request=$result['request']; 186 | $body=json_decode($request->getBody(), true); 187 | 188 | $this->assertEquals('$unset', $body['event']); 189 | $this->assertEquals('item', $body['entityType']); 190 | $this->assertEquals(1, $body['entityId']); 191 | $this->assertEquals('book', $body['properties']['type']); 192 | $this->assertNotNull($body['eventTime']); 193 | $this->assertEquals('POST', $request->getMethod()); 194 | $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', $request->getUri()); 195 | } 196 | 197 | public function testUnsetItemWithEventTime() 198 | { 199 | $eventTime='1982-09-25T01:23:45+0800'; 200 | 201 | $this->eventClient->unsetItem(1, array('type'=>'book'), $eventTime); 202 | $result=array_shift($this->container); 203 | /** @var Request $request */ 204 | $request=$result['request']; 205 | $body=json_decode($request->getBody(), true); 206 | 207 | $this->assertEquals('$unset', $body['event']); 208 | $this->assertEquals($eventTime, $body['eventTime']); 209 | } 210 | 211 | /** 212 | * @expectedException \predictionio\PredictionIOAPIError 213 | */ 214 | public function testUnsetItemWithoutProperties() 215 | { 216 | $this->eventClient->unsetItem(1, array()); 217 | } 218 | 219 | public function testDeleteItem() 220 | { 221 | $this->eventClient->deleteItem(1); 222 | $result=array_shift($this->container); 223 | /** @var Request $request */ 224 | $request=$result['request']; 225 | $body=json_decode($request->getBody(), true); 226 | 227 | $this->assertEquals('$delete', $body['event']); 228 | $this->assertEquals('item', $body['entityType']); 229 | $this->assertEquals(1, $body['entityId']); 230 | $this->assertNotNull($body['eventTime']); 231 | $this->assertEquals('POST', $request->getMethod()); 232 | $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', $request->getUri()); 233 | } 234 | 235 | public function testDeleteItemWithEventTime() 236 | { 237 | $eventTime='1982-09-25T01:23:45+0800'; 238 | 239 | $this->eventClient->deleteItem(1, $eventTime); 240 | $result=array_shift($this->container); 241 | /** @var Request $request */ 242 | $request=$result['request']; 243 | $body=json_decode($request->getBody(), true); 244 | 245 | $this->assertEquals('$delete', $body['event']); 246 | $this->assertEquals($eventTime, $body['eventTime']); 247 | } 248 | 249 | public function testRecordAction() 250 | { 251 | $this->eventClient->recordUserActionOnItem('view', 1, 888, array('count'=>2)); 252 | $result=array_shift($this->container); 253 | /** @var Request $request */ 254 | $request=$result['request']; 255 | $body=json_decode($request->getBody(), true); 256 | 257 | $this->assertEquals('view', $body['event']); 258 | $this->assertEquals('user', $body['entityType']); 259 | $this->assertEquals(1, $body['entityId']); 260 | $this->assertEquals('item', $body['targetEntityType']); 261 | $this->assertEquals(888, $body['targetEntityId']); 262 | $this->assertEquals(2, $body['properties']['count']); 263 | $this->assertNotNull($body['eventTime']); 264 | $this->assertEquals('POST', $request->getMethod()); 265 | $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', $request->getUri()); 266 | } 267 | 268 | public function testRecordActionWithEventTime() 269 | { 270 | $eventTime='1982-09-25T01:23:45+0800'; 271 | 272 | $this->eventClient->recordUserActionOnItem('view', 1, 8, array(), $eventTime); 273 | $result=array_shift($this->container); 274 | /** @var Request $request */ 275 | $request=$result['request']; 276 | $body=json_decode($request->getBody(), true); 277 | 278 | $this->assertEquals('view', $body['event']); 279 | $this->assertEquals($eventTime, $body['eventTime']); 280 | } 281 | 282 | public function testCreateEvent() 283 | { 284 | $this->eventClient->createEvent(array( 285 | 'event' => 'my_event', 286 | 'entityType' => 'user', 287 | 'entityId' => 'uid', 288 | 'properties' => array('prop1'=>1, 289 | 'prop2'=>'value2', 290 | 'prop3'=>array(1,2,3), 291 | 'prop4'=>true, 292 | 'prop5'=>array('a','b','c'), 293 | 'prop6'=>4.56 294 | ), 295 | 'eventTime' => '2004-12-13T21:39:45.618-07:00' 296 | )); 297 | $result=array_shift($this->container); 298 | /** @var Request $request */ 299 | $request=$result['request']; 300 | $body=json_decode($request->getBody(), true); 301 | 302 | $this->assertEquals('my_event', $body['event']); 303 | $this->assertEquals('user', $body['entityType']); 304 | $this->assertEquals('uid', $body['entityId']); 305 | $this->assertEquals(1, $body['properties']['prop1']); 306 | $this->assertEquals('value2', $body['properties']['prop2']); 307 | $this->assertEquals(array(1,2,3), $body['properties']['prop3']); 308 | $this->assertEquals(true, $body['properties']['prop4']); 309 | $this->assertEquals(array('a','b','c'), $body['properties']['prop5']); 310 | $this->assertEquals(4.56, $body['properties']['prop6']); 311 | $this->assertEquals('2004-12-13T21:39:45.618-07:00', $body['eventTime']); 312 | $this->assertEquals('POST', $request->getMethod()); 313 | $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', $request->getUri()); 314 | } 315 | 316 | public function testGetEvent() 317 | { 318 | $this->eventClient->getEvent('event_id'); 319 | $result=array_shift($this->container); 320 | /** @var Request $request */ 321 | $request=$result['request']; 322 | $body=json_decode($request->getBody(), true); 323 | 324 | $this->assertEquals('GET', $request->getMethod()); 325 | $this->assertEquals( 326 | 'http://localhost:7070/events/event_id.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O', 327 | $request->getUri() 328 | ); 329 | } 330 | } 331 | -------------------------------------------------------------------------------- /tests/Unit/ExporterTest.php: -------------------------------------------------------------------------------- 1 | json = []; 34 | $this->data = []; 35 | } 36 | 37 | public function jsonEncode($data) 38 | { 39 | $this->data[] = $data; 40 | return $this->traitJsonEncode($data); 41 | } 42 | 43 | public function export($json) 44 | { 45 | $this->json[] = $json; 46 | } 47 | } 48 | 49 | class ExporterTest extends \PHPUnit_Framework_TestCase 50 | { 51 | 52 | /** @var TestExporter $exporter */ 53 | private $exporter; 54 | 55 | protected function setUp() 56 | { 57 | $this->exporter = new TestExporter(); 58 | } 59 | 60 | public function testTimeIsNow() 61 | { 62 | $time = new \DateTime(); 63 | 64 | $this->exporter->createEvent('event', 'entity-type', 'entity-id'); 65 | 66 | $this->assertEquals(1, count($this->exporter->data)); 67 | $data = $this->exporter->data[0]; 68 | $this->assertEquals(4, count($data)); 69 | $this->assertEquals('event', $data['event']); 70 | $this->assertEquals('entity-type', $data['entityType']); 71 | $this->assertEquals('entity-id', $data['entityId']); 72 | $this->assertEquals($time->format(\DateTime::ISO8601), $data['eventTime'], 'time is now', 1); 73 | 74 | $this->assertEquals(1, count($this->exporter->json)); 75 | $json = $this->exporter->json[0]; 76 | $pattern = '/^{"event":"event","entityType":"entity-type","entityId":"entity-id","eventTime":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}"}$/'; 77 | $this->assertTrue(preg_match($pattern, $json) === 1, 'json'); 78 | } 79 | 80 | public function testTimeIsString() 81 | { 82 | $time = new \DateTime('2015-04-01'); 83 | 84 | $this->exporter->createEvent('event', 'entity-type', 'entity-id', null, null, null, '2015-04-01'); 85 | 86 | $this->assertEquals(1, count($this->exporter->data)); 87 | $data = $this->exporter->data[0]; 88 | $this->assertEquals(4, count($data)); 89 | $this->assertEquals('event', $data['event']); 90 | $this->assertEquals('entity-type', $data['entityType']); 91 | $this->assertEquals('entity-id', $data['entityId']); 92 | $this->assertEquals($time->format(\DateTime::ISO8601), $data['eventTime'], 'time is string', 1); 93 | 94 | $this->assertEquals(1, count($this->exporter->json)); 95 | $json = $this->exporter->json[0]; 96 | $pattern = '/^{"event":"event","entityType":"entity-type","entityId":"entity-id","eventTime":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}"}$/'; 97 | $this->assertTrue(preg_match($pattern, $json) === 1, 'json'); 98 | } 99 | 100 | public function testTimeIsDateTime() 101 | { 102 | $time = new \DateTime('2015-04-01'); 103 | 104 | $this->exporter->createEvent('event', 'entity-type', 'entity-id', null, null, null, $time); 105 | 106 | $this->assertEquals(1, count($this->exporter->data)); 107 | $data = $this->exporter->data[0]; 108 | $this->assertEquals(4, count($data)); 109 | $this->assertEquals('event', $data['event']); 110 | $this->assertEquals('entity-type', $data['entityType']); 111 | $this->assertEquals('entity-id', $data['entityId']); 112 | $this->assertEquals($time->format(\DateTime::ISO8601), $data['eventTime'], 'time is DateTime', 1); 113 | 114 | $this->assertEquals(1, count($this->exporter->json)); 115 | $json = $this->exporter->json[0]; 116 | $pattern = '/^{"event":"event","entityType":"entity-type","entityId":"entity-id","eventTime":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}"}$/'; 117 | $this->assertTrue(preg_match($pattern, $json) === 1, 'json'); 118 | } 119 | 120 | public function testOptionalFields() 121 | { 122 | $time = new \DateTime('2015-04-01'); 123 | 124 | $this->exporter->createEvent( 125 | 'event', 126 | 'entity-type', 127 | 'entity-id', 128 | 'target-entity-type', 129 | 'target-entity-id', 130 | ['property' => true], 131 | $time 132 | ); 133 | 134 | $this->assertEquals(1, count($this->exporter->data)); 135 | $data = $this->exporter->data[0]; 136 | $this->assertEquals(7, count($data)); 137 | $this->assertEquals('event', $data['event']); 138 | $this->assertEquals('entity-type', $data['entityType']); 139 | $this->assertEquals('entity-id', $data['entityId']); 140 | $this->assertEquals($time->format(\DateTime::ISO8601), $data['eventTime'], 'time is DateTime', 1); 141 | $this->assertEquals('target-entity-type', $data['targetEntityType']); 142 | $this->assertEquals('target-entity-id', $data['targetEntityId']); 143 | $this->assertEquals(['property'=>true], $data['properties']); 144 | 145 | $this->assertEquals(1, count($this->exporter->json)); 146 | $json = $this->exporter->json[0]; 147 | $pattern = '/^{"event":"event","entityType":"entity-type","entityId":"entity-id","eventTime":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}","targetEntityType":"target-entity-type","targetEntityId":"target-entity-id","properties":{"property":true}}$/'; 148 | $this->assertTrue(preg_match($pattern, $json) === 1, 'json'); 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /tests/Unit/FileExporterTest.php: -------------------------------------------------------------------------------- 1 | createEvent( 37 | 'event-1', 38 | 'entity-type-1', 39 | 'entity-id-1', 40 | null, 41 | null, 42 | null, 43 | '2015-04-01' 44 | ); 45 | $exporter->createEvent( 46 | 'event-2', 47 | 'entity-type-2', 48 | 'entity-id-2', 49 | 'target-entity-type-2', 50 | 'target-entity-id-2', 51 | ['property' => 'blue'], 52 | '2015-04-01' 53 | ); 54 | $exporter->close(); 55 | 56 | $exported = file_get_contents('temp.file'); 57 | 58 | $date = new \DateTime('2015-04-01'); 59 | $expectedDate = $date->format(\DateTime::ISO8601); 60 | 61 | $expected =<<assertEquals($expected, $exported); 68 | } 69 | } 70 | --------------------------------------------------------------------------------