├── .editorconfig ├── .gitignore ├── .styleci.yml ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── config └── phpmd.xml ├── phpspec-coverage.yml ├── phpspec.yml ├── src ├── CodeCoverage.php ├── CodeStyleChecker.php ├── CodeStyleFixer.php ├── ComposerScriptInterface.php ├── Console │ └── ScriptArgumentsTrait.php ├── MessDetector.php ├── Process │ └── Process.php └── SpecificationTest.php └── tests └── specs ├── CodeCoverageSpec.php ├── CodeStyleCheckerSpec.php ├── CodeStyleFixerSpec.php ├── Console └── ScriptArgumentsTraitSpec.php ├── MessDetectorSpec.php ├── Process └── ProcessSpec.php └── SpecificationTestSpec.php /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | # Global 6 | 7 | [*] 8 | charset = utf-8 9 | end_of_line = lf 10 | indent_style = space 11 | indent_size = 4 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | 15 | # Languages 16 | 17 | [*.md] 18 | trim_trailing_whitespace = false 19 | 20 | [*.json] 21 | indent_style = space 22 | indent_size = 2 23 | 24 | [*.yml] 25 | indent_style = space 26 | indent_size = 2 27 | 28 | # Files 29 | 30 | [composer.json] 31 | indent_style = space 32 | indent_size = 4 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /coverage 2 | /vendor 3 | coverage.xml 4 | -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | preset: psr2 2 | 3 | risky: false 4 | 5 | finder: 6 | exclude: 7 | - "tests" 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - '7.1' 5 | - '7.2' 6 | - '7.3' 7 | 8 | before_install: 9 | - travis_retry composer self-update 10 | 11 | install: 12 | - travis_retry composer install --no-interaction --prefer-dist --no-suggest 13 | 14 | script: composer test 15 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | ## [Unreleased] 5 | ### Added 6 | - Deprecation notice in readme 7 | 8 | ## [v5.1.0] - 2020-02-21 9 | ### Added 10 | - Package to ignore final classes in tests 11 | 12 | ## [v5.0.0] - 2019-11-18 13 | ### Changed 14 | - Default coding style is now PSR-12 15 | - Default code style fixer is now `squizlabs/php_codesniffer` 16 | 17 | ### Added 18 | - Support for phpspec v5 and v6 19 | 20 | ### Removed 21 | - Support for phpspec v4 22 | 23 | ## [v4.2.0] - 2019-11-04 24 | ### Changed 25 | - Replaced package `leanphp/phpspec-code-coverage` with `friends-of-phpspec/phpspec-code-coverage` 26 | 27 | ##[v4.1.0] - 2018-09-10 28 | ### Removed 29 | - PHP 7.0 Support 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2017 karriere.at GmbH 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | 6 | Unless required by applicable law or agreed to in writing, software 7 | distributed under the License is distributed on an "AS IS" BASIS, 8 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 9 | See the License for the specific language governing permissions and 10 | limitations under the License. 11 | 12 | 13 | Apache License 14 | Version 2.0, January 2004 15 | http://www.apache.org/licenses/ 16 | 17 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 18 | 19 | 1. Definitions. 20 | 21 | "License" shall mean the terms and conditions for use, reproduction, 22 | and distribution as defined by Sections 1 through 9 of this document. 23 | 24 | "Licensor" shall mean the copyright owner or entity authorized by 25 | the copyright owner that is granting the License. 26 | 27 | "Legal Entity" shall mean the union of the acting entity and all 28 | other entities that control, are controlled by, or are under common 29 | control with that entity. For the purposes of this definition, 30 | "control" means (i) the power, direct or indirect, to cause the 31 | direction or management of such entity, whether by contract or 32 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 33 | outstanding shares, or (iii) beneficial ownership of such entity. 34 | 35 | "You" (or "Your") shall mean an individual or Legal Entity 36 | exercising permissions granted by this License. 37 | 38 | "Source" form shall mean the preferred form for making modifications, 39 | including but not limited to software source code, documentation 40 | source, and configuration files. 41 | 42 | "Object" form shall mean any form resulting from mechanical 43 | transformation or translation of a Source form, including but 44 | not limited to compiled object code, generated documentation, 45 | and conversions to other media types. 46 | 47 | "Work" shall mean the work of authorship, whether in Source or 48 | Object form, made available under the License, as indicated by a 49 | copyright notice that is included in or attached to the work 50 | (an example is provided in the Appendix below). 51 | 52 | "Derivative Works" shall mean any work, whether in Source or Object 53 | form, that is based on (or derived from) the Work and for which the 54 | editorial revisions, annotations, elaborations, or other modifications 55 | represent, as a whole, an original work of authorship. For the purposes 56 | of this License, Derivative Works shall not include works that remain 57 | separable from, or merely link (or bind by name) to the interfaces of, 58 | the Work and Derivative Works thereof. 59 | 60 | "Contribution" shall mean any work of authorship, including 61 | the original version of the Work and any modifications or additions 62 | to that Work or Derivative Works thereof, that is intentionally 63 | submitted to Licensor for inclusion in the Work by the copyright owner 64 | or by an individual or Legal Entity authorized to submit on behalf of 65 | the copyright owner. For the purposes of this definition, "submitted" 66 | means any form of electronic, verbal, or written communication sent 67 | to the Licensor or its representatives, including but not limited to 68 | communication on electronic mailing lists, source code control systems, 69 | and issue tracking systems that are managed by, or on behalf of, the 70 | Licensor for the purpose of discussing and improving the Work, but 71 | excluding communication that is conspicuously marked or otherwise 72 | designated in writing by the copyright owner as "Not a Contribution." 73 | 74 | "Contributor" shall mean Licensor and any individual or Legal Entity 75 | on behalf of whom a Contribution has been received by Licensor and 76 | subsequently incorporated within the Work. 77 | 78 | 2. Grant of Copyright License. Subject to the terms and conditions of 79 | this License, each Contributor hereby grants to You a perpetual, 80 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 81 | copyright license to reproduce, prepare Derivative Works of, 82 | publicly display, publicly perform, sublicense, and distribute the 83 | Work and such Derivative Works in Source or Object form. 84 | 85 | 3. Grant of Patent License. Subject to the terms and conditions of 86 | this License, each Contributor hereby grants to You a perpetual, 87 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 88 | (except as stated in this section) patent license to make, have made, 89 | use, offer to sell, sell, import, and otherwise transfer the Work, 90 | where such license applies only to those patent claims licensable 91 | by such Contributor that are necessarily infringed by their 92 | Contribution(s) alone or by combination of their Contribution(s) 93 | with the Work to which such Contribution(s) was submitted. If You 94 | institute patent litigation against any entity (including a 95 | cross-claim or counterclaim in a lawsuit) alleging that the Work 96 | or a Contribution incorporated within the Work constitutes direct 97 | or contributory patent infringement, then any patent licenses 98 | granted to You under this License for that Work shall terminate 99 | as of the date such litigation is filed. 100 | 101 | 4. Redistribution. You may reproduce and distribute copies of the 102 | Work or Derivative Works thereof in any medium, with or without 103 | modifications, and in Source or Object form, provided that You 104 | meet the following conditions: 105 | 106 | (a) You must give any other recipients of the Work or 107 | Derivative Works a copy of this License; and 108 | 109 | (b) You must cause any modified files to carry prominent notices 110 | stating that You changed the files; and 111 | 112 | (c) You must retain, in the Source form of any Derivative Works 113 | that You distribute, all copyright, patent, trademark, and 114 | attribution notices from the Source form of the Work, 115 | excluding those notices that do not pertain to any part of 116 | the Derivative Works; and 117 | 118 | (d) If the Work includes a "NOTICE" text file as part of its 119 | distribution, then any Derivative Works that You distribute must 120 | include a readable copy of the attribution notices contained 121 | within such NOTICE file, excluding those notices that do not 122 | pertain to any part of the Derivative Works, in at least one 123 | of the following places: within a NOTICE text file distributed 124 | as part of the Derivative Works; within the Source form or 125 | documentation, if provided along with the Derivative Works; or, 126 | within a display generated by the Derivative Works, if and 127 | wherever such third-party notices normally appear. The contents 128 | of the NOTICE file are for informational purposes only and 129 | do not modify the License. You may add Your own attribution 130 | notices within Derivative Works that You distribute, alongside 131 | or as an addendum to the NOTICE text from the Work, provided 132 | that such additional attribution notices cannot be construed 133 | as modifying the License. 134 | 135 | You may add Your own copyright statement to Your modifications and 136 | may provide additional or different license terms and conditions 137 | for use, reproduction, or distribution of Your modifications, or 138 | for any such Derivative Works as a whole, provided Your use, 139 | reproduction, and distribution of the Work otherwise complies with 140 | the conditions stated in this License. 141 | 142 | 5. Submission of Contributions. Unless You explicitly state otherwise, 143 | any Contribution intentionally submitted for inclusion in the Work 144 | by You to the Licensor shall be under the terms and conditions of 145 | this License, without any additional terms or conditions. 146 | Notwithstanding the above, nothing herein shall supersede or modify 147 | the terms of any separate license agreement you may have executed 148 | with Licensor regarding such Contributions. 149 | 150 | 6. Trademarks. This License does not grant permission to use the trade 151 | names, trademarks, service marks, or product names of the Licensor, 152 | except as required for reasonable and customary use in describing the 153 | origin of the Work and reproducing the content of the NOTICE file. 154 | 155 | 7. Disclaimer of Warranty. Unless required by applicable law or 156 | agreed to in writing, Licensor provides the Work (and each 157 | Contributor provides its Contributions) on an "AS IS" BASIS, 158 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 159 | implied, including, without limitation, any warranties or conditions 160 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 161 | PARTICULAR PURPOSE. You are solely responsible for determining the 162 | appropriateness of using or redistributing the Work and assume any 163 | risks associated with Your exercise of permissions under this License. 164 | 165 | 8. Limitation of Liability. In no event and under no legal theory, 166 | whether in tort (including negligence), contract, or otherwise, 167 | unless required by applicable law (such as deliberate and grossly 168 | negligent acts) or agreed to in writing, shall any Contributor be 169 | liable to You for damages, including any direct, indirect, special, 170 | incidental, or consequential damages of any character arising as a 171 | result of this License or out of the use or inability to use the 172 | Work (including but not limited to damages for loss of goodwill, 173 | work stoppage, computer failure or malfunction, or any and all 174 | other commercial damages or losses), even if such Contributor 175 | has been advised of the possibility of such damages. 176 | 177 | 9. Accepting Warranty or Additional Liability. While redistributing 178 | the Work or Derivative Works thereof, You may choose to offer, 179 | and charge a fee for, acceptance of support, warranty, indemnity, 180 | or other liability obligations and/or rights consistent with this 181 | License. However, in accepting such obligations, You may act only 182 | on Your own behalf and on Your sole responsibility, not on behalf 183 | of any other Contributor, and only if You agree to indemnify, 184 | defend, and hold each Contributor harmless for any liability 185 | incurred by, or claims asserted against, such Contributor by reason 186 | of your accepting any such warranty or additional liability. 187 | 188 | END OF TERMS AND CONDITIONS 189 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |     3 | [![Build Status](https://travis-ci.org/karriereat/php-code-quality.svg?branch=master)](https://travis-ci.org/karriereat/php-code-quality) 4 | [![Code Style](https://styleci.io/repos/79470259/shield)](https://styleci.io/repos/79470259) 5 | 6 | # ❗️ This package is no longer being actively developed. ❗ 7 | 8 | # Code Quality for PHP packages 9 | 10 | This package provides code quality scripts that can be run via 11 | [Composer](https://github.com/composer/composer). 12 | 13 | The scripts also work on continous integration (CI) servers like Jenkins. 14 | 15 | ## Used packages 16 | 17 | ### [phpspec/phpspec](https://github.com/phpspec/phpspec) 18 | 19 | Used for testing (SpecBDD) the code. 20 | Must be configured with a `phpspec.yml` file in your root folder. 21 | 22 | We are using the `leanphp/phpspec-code-coverage` extension for generating coverage reports. 23 | This extension requires a `phpspec-coverage.yml` file in your root folder and Xdebug enabled. 24 | 25 | ### [squizlabs/PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) 26 | 27 | Currently used for checking (linting) and fixing the code. 28 | Sniffs all files in `src` directory. 29 | 30 | ### [phpmd/phpmd](https://github.com/phpmd/phpmd) 31 | 32 | Used for mess detection. 33 | Runs the defined ruleset (`config/phpmd.xml`) on all files in `src` directory. 34 | 35 | ## Installation 36 | 37 | Run `composer require --dev karriere/code-quality` to install this package. 38 | 39 | After installing, insert the desired scripts to your `composer.json`. 40 | 41 | ```json 42 | { 43 | "scripts": { 44 | "test": "Karriere\\CodeQuality\\SpecificationTest::run", 45 | "lint": "Karriere\\CodeQuality\\CodeStyleChecker::run", 46 | "fix": "Karriere\\CodeQuality\\CodeStyleFixer::run", 47 | "coverage": "Karriere\\CodeQuality\\CodeCoverage::run", 48 | "md": "Karriere\\CodeQuality\\MessDetector::run" 49 | } 50 | } 51 | ``` 52 | 53 | ## Usage 54 | 55 | You can run a script like this: `composer {script} -- {options}`. 56 | 57 | > If you are using Git-Shell on Windows (or Git-Shell in Intellij 58 | > Terminal on Windows), call scripts like this: `composer.bat {script}`. 59 | > Otherwise colors will not work. 60 | 61 | You can disable `TTY` by adding the `--notty` flag (needed for Jenkins). 62 | On Windows platform it's disabled automatically. 63 | 64 | ``` 65 | composer {script} -- --env=jenkins --notty 66 | ``` 67 | 68 | ### Scripts 69 | 70 | #### `test` 71 | 72 | ``` 73 | Usage: 74 | test [--] [options] 75 | 76 | Options: 77 | --fail Exit with 1 if tests fail. 78 | --notty Disable TTY. 79 | --ptimeout Set process timeout (defaults to 60 seconds). 80 | -v --verbose Increase the verbosity of messages. 81 | ``` 82 | 83 | #### `coverage` 84 | 85 | ``` 86 | Usage: 87 | coverage [--] [options] 88 | 89 | Options: 90 | --env Specifiy the environment. Possible values: 91 | 'local': prints output on command-line. 92 | 'jenkins': generates a JUnit report file. 93 | --notty Disable TTY. 94 | --ptimeout Set process timeout (defaults to 60 seconds). 95 | ``` 96 | 97 | #### `lint` 98 | 99 | ``` 100 | Usage: 101 | lint [--] [options] 102 | 103 | Options: 104 | --env Specifiy the environment. Possible values: 105 | 'local': prints output on command-line. 106 | 'jenkins': generates a checkstyle report file. 107 | --fail Exit with 1 if linting fails. 108 | --notty Disable TTY. 109 | --ptimeout Set process timeout (defaults to 60 seconds). 110 | ``` 111 | 112 | #### `md` 113 | 114 | ``` 115 | Usage: 116 | lint [--] [options] 117 | 118 | Options: 119 | --env Specifiy the environment. Possible values: 120 | 'local': prints output on command-line. 121 | 'jenkins': generates a xml report file. 122 | --notty Disable TTY. 123 | --ptimeout Set process timeout (defaults to 60 seconds). 124 | ``` 125 | 126 | #### `fix` 127 | 128 | ``` 129 | Usage: 130 | fix [--] [options] 131 | 132 | Options: 133 | --notty Disable TTY. 134 | --ptimeout Set process timeout (defaults to 60 seconds). 135 | ``` 136 | 137 | ## Using custom matchers 138 | 139 | This package integrates [karriere/phpspec-matchers](https://github.com/karriereat/phpspec-matchers). 140 | In order to use the custom matchers defined in this package, 141 | please include the extension configuration in your `phpspec.yml`. 142 | 143 | ## FAQ 144 | 145 | ### Why do I have to provide two phpspec configuration files? 146 | 147 | The code-coverage-extension slows down the phpspec tests, so we excluded it from the 148 | normal configuration file. Keep tests fast! 149 | 150 | ### How do I increase the verbosity of the `test`-script output? 151 | 152 | Run `composer test -- -v`. 153 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "karriere/code-quality", 3 | "description": "Code Quality scripts that can be run via Composer.", 4 | "keywords": ["code quality", "scripts"], 5 | "license": "Apache-2.0", 6 | "authors": [ 7 | { 8 | "name": "Jakob Linskeseder", 9 | "email": "jakob.linskeseder@karriere.at", 10 | "role": "Maintainer" 11 | } 12 | ], 13 | "autoload": { 14 | "psr-4": { 15 | "Karriere\\CodeQuality\\": "src" 16 | } 17 | }, 18 | "require": { 19 | "php": ">=7.1", 20 | "dg/bypass-finals": "^1.1", 21 | "friends-of-phpspec/phpspec-code-coverage": "^4.3", 22 | "karriere/phpspec-matchers": "^3.0", 23 | "phpmd/phpmd": "^2.6", 24 | "phpspec/phpspec": "^5.1 || ^6.0", 25 | "squizlabs/php_codesniffer": "^3.3", 26 | "symfony/console": "^3.2 || ^4.0", 27 | "symfony/process": "^3.2 || ^4.0" 28 | }, 29 | "require-dev": { 30 | "composer/composer": "^1.6" 31 | }, 32 | "scripts": { 33 | "test": "Karriere\\CodeQuality\\SpecificationTest::run", 34 | "coverage": "Karriere\\CodeQuality\\CodeCoverage::run", 35 | "lint": "Karriere\\CodeQuality\\CodeStyleChecker::run", 36 | "fix": "Karriere\\CodeQuality\\CodeStyleFixer::run", 37 | "md": "Karriere\\CodeQuality\\MessDetector::run" 38 | }, 39 | "config": { 40 | "sort-packages": true 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /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": "8a07fdf756e5f962c04eb8c0bdb4990a", 8 | "packages": [ 9 | { 10 | "name": "dg/bypass-finals", 11 | "version": "v1.1.2", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/dg/bypass-finals.git", 15 | "reference": "101d0cc4b836d2a7745d745bc7b1fadcdcaf3b22" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/dg/bypass-finals/zipball/101d0cc4b836d2a7745d745bc7b1fadcdcaf3b22", 20 | "reference": "101d0cc4b836d2a7745d745bc7b1fadcdcaf3b22", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.6" 25 | }, 26 | "require-dev": { 27 | "nette/tester": "^2.0.2" 28 | }, 29 | "type": "library", 30 | "autoload": { 31 | "classmap": [ 32 | "src/" 33 | ] 34 | }, 35 | "notification-url": "https://packagist.org/downloads/", 36 | "license": [ 37 | "BSD-3-Clause", 38 | "GPL-2.0", 39 | "GPL-3.0" 40 | ], 41 | "authors": [ 42 | { 43 | "name": "David Grudl", 44 | "homepage": "https://davidgrudl.com" 45 | } 46 | ], 47 | "description": "Removes final keyword from source code on-the-fly and allows mocking of final methods and classes", 48 | "keywords": [ 49 | "finals", 50 | "mocking", 51 | "phpunit", 52 | "testing", 53 | "unit" 54 | ], 55 | "time": "2019-06-03T14:06:19+00:00" 56 | }, 57 | { 58 | "name": "doctrine/instantiator", 59 | "version": "1.3.0", 60 | "source": { 61 | "type": "git", 62 | "url": "https://github.com/doctrine/instantiator.git", 63 | "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" 64 | }, 65 | "dist": { 66 | "type": "zip", 67 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", 68 | "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", 69 | "shasum": "" 70 | }, 71 | "require": { 72 | "php": "^7.1" 73 | }, 74 | "require-dev": { 75 | "doctrine/coding-standard": "^6.0", 76 | "ext-pdo": "*", 77 | "ext-phar": "*", 78 | "phpbench/phpbench": "^0.13", 79 | "phpstan/phpstan-phpunit": "^0.11", 80 | "phpstan/phpstan-shim": "^0.11", 81 | "phpunit/phpunit": "^7.0" 82 | }, 83 | "type": "library", 84 | "extra": { 85 | "branch-alias": { 86 | "dev-master": "1.2.x-dev" 87 | } 88 | }, 89 | "autoload": { 90 | "psr-4": { 91 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 92 | } 93 | }, 94 | "notification-url": "https://packagist.org/downloads/", 95 | "license": [ 96 | "MIT" 97 | ], 98 | "authors": [ 99 | { 100 | "name": "Marco Pivetta", 101 | "email": "ocramius@gmail.com", 102 | "homepage": "http://ocramius.github.com/" 103 | } 104 | ], 105 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 106 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 107 | "keywords": [ 108 | "constructor", 109 | "instantiate" 110 | ], 111 | "time": "2019-10-21T16:45:58+00:00" 112 | }, 113 | { 114 | "name": "friends-of-phpspec/phpspec-code-coverage", 115 | "version": "v4.3.2", 116 | "source": { 117 | "type": "git", 118 | "url": "https://github.com/friends-of-phpspec/phpspec-code-coverage.git", 119 | "reference": "9a54302573094cc1b3bdca3cc78c58582130b254" 120 | }, 121 | "dist": { 122 | "type": "zip", 123 | "url": "https://api.github.com/repos/friends-of-phpspec/phpspec-code-coverage/zipball/9a54302573094cc1b3bdca3cc78c58582130b254", 124 | "reference": "9a54302573094cc1b3bdca3cc78c58582130b254", 125 | "shasum": "" 126 | }, 127 | "require": { 128 | "php": "^7.1", 129 | "phpspec/phpspec": "^4.2 || ^5.0 || ^6.0", 130 | "phpunit/php-code-coverage": "^5.0 || ^6.0 || ^7.0" 131 | }, 132 | "require-dev": { 133 | "drupol/php-conventions": "^1", 134 | "scrutinizer/ocular": "^1" 135 | }, 136 | "suggest": { 137 | "ext-pcov": "Install PCov extension to generate code coverage.", 138 | "ext-xdebug": "Install Xdebug to generate phpspec code coverage." 139 | }, 140 | "type": "library", 141 | "extra": { 142 | "branch-alias": { 143 | "dev-master": "4.x-dev" 144 | } 145 | }, 146 | "autoload": { 147 | "psr-4": { 148 | "FriendsOfPhpSpec\\PhpSpec\\CodeCoverage\\": "src/" 149 | }, 150 | "files": [ 151 | "src/bootstrap.php" 152 | ] 153 | }, 154 | "notification-url": "https://packagist.org/downloads/", 155 | "license": [ 156 | "MIT" 157 | ], 158 | "authors": [ 159 | { 160 | "name": "ek9", 161 | "email": "dev@ek9.co", 162 | "homepage": "https://ek9.co" 163 | }, 164 | { 165 | "name": "Henrik Bjornskov" 166 | }, 167 | { 168 | "name": "Stéphane Hulard", 169 | "email": "s.hulard@chstudio.fr", 170 | "homepage": "https://chstudio.fr" 171 | }, 172 | { 173 | "name": "Pol Dellaiera", 174 | "email": "pol.dellaiera@protonmail.com", 175 | "homepage": "https://not-a-number.io/" 176 | }, 177 | { 178 | "name": "Jay Linski", 179 | "homepage": "https://twitter.com/jay_linski" 180 | } 181 | ], 182 | "description": "Generate Code Coverage reports for PhpSpec tests", 183 | "homepage": "https://github.com/friends-of-phpspec/phpspec-code-coverage", 184 | "keywords": [ 185 | "code-coverage", 186 | "coverage", 187 | "phpspec", 188 | "report", 189 | "spec", 190 | "test", 191 | "tests" 192 | ], 193 | "time": "2019-11-12T10:27:45+00:00" 194 | }, 195 | { 196 | "name": "karriere/phpspec-matchers", 197 | "version": "v3.0.0", 198 | "source": { 199 | "type": "git", 200 | "url": "https://github.com/karriereat/phpspec-matchers.git", 201 | "reference": "afb10c762511b2aa40d5bc4ae0f1fb778af6cbc8" 202 | }, 203 | "dist": { 204 | "type": "zip", 205 | "url": "https://api.github.com/repos/karriereat/phpspec-matchers/zipball/afb10c762511b2aa40d5bc4ae0f1fb778af6cbc8", 206 | "reference": "afb10c762511b2aa40d5bc4ae0f1fb778af6cbc8", 207 | "shasum": "" 208 | }, 209 | "require": { 210 | "php": ">=7.1", 211 | "phpspec/phpspec": "^5.0 || ^6.0" 212 | }, 213 | "require-dev": { 214 | "friends-of-phpspec/phpspec-code-coverage": "^4.3", 215 | "squizlabs/php_codesniffer": "^3.5" 216 | }, 217 | "type": "phpspec-extension", 218 | "autoload": { 219 | "psr-4": { 220 | "Karriere\\PhpSpecMatchers\\": "src/" 221 | } 222 | }, 223 | "notification-url": "https://packagist.org/downloads/", 224 | "license": [ 225 | "Apache-2.0" 226 | ], 227 | "authors": [ 228 | { 229 | "name": "Johannes Pichler", 230 | "email": "johannes.pichler@karriere.at" 231 | } 232 | ], 233 | "description": "phpspec extension with a collection of additional matchers", 234 | "homepage": "https://github.com/karriereat/phpspec-matchers", 235 | "keywords": [ 236 | "TDD", 237 | "json", 238 | "matchers", 239 | "phpspec" 240 | ], 241 | "time": "2019-11-18T10:42:43+00:00" 242 | }, 243 | { 244 | "name": "pdepend/pdepend", 245 | "version": "2.5.2", 246 | "source": { 247 | "type": "git", 248 | "url": "https://github.com/pdepend/pdepend.git", 249 | "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239" 250 | }, 251 | "dist": { 252 | "type": "zip", 253 | "url": "https://api.github.com/repos/pdepend/pdepend/zipball/9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", 254 | "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", 255 | "shasum": "" 256 | }, 257 | "require": { 258 | "php": ">=5.3.7", 259 | "symfony/config": "^2.3.0|^3|^4", 260 | "symfony/dependency-injection": "^2.3.0|^3|^4", 261 | "symfony/filesystem": "^2.3.0|^3|^4" 262 | }, 263 | "require-dev": { 264 | "phpunit/phpunit": "^4.8|^5.7", 265 | "squizlabs/php_codesniffer": "^2.0.0" 266 | }, 267 | "bin": [ 268 | "src/bin/pdepend" 269 | ], 270 | "type": "library", 271 | "autoload": { 272 | "psr-4": { 273 | "PDepend\\": "src/main/php/PDepend" 274 | } 275 | }, 276 | "notification-url": "https://packagist.org/downloads/", 277 | "license": [ 278 | "BSD-3-Clause" 279 | ], 280 | "description": "Official version of pdepend to be handled with Composer", 281 | "time": "2017-12-13T13:21:38+00:00" 282 | }, 283 | { 284 | "name": "phpdocumentor/reflection-common", 285 | "version": "2.0.0", 286 | "source": { 287 | "type": "git", 288 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 289 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" 290 | }, 291 | "dist": { 292 | "type": "zip", 293 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", 294 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", 295 | "shasum": "" 296 | }, 297 | "require": { 298 | "php": ">=7.1" 299 | }, 300 | "require-dev": { 301 | "phpunit/phpunit": "~6" 302 | }, 303 | "type": "library", 304 | "extra": { 305 | "branch-alias": { 306 | "dev-master": "2.x-dev" 307 | } 308 | }, 309 | "autoload": { 310 | "psr-4": { 311 | "phpDocumentor\\Reflection\\": "src/" 312 | } 313 | }, 314 | "notification-url": "https://packagist.org/downloads/", 315 | "license": [ 316 | "MIT" 317 | ], 318 | "authors": [ 319 | { 320 | "name": "Jaap van Otterdijk", 321 | "email": "opensource@ijaap.nl" 322 | } 323 | ], 324 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 325 | "homepage": "http://www.phpdoc.org", 326 | "keywords": [ 327 | "FQSEN", 328 | "phpDocumentor", 329 | "phpdoc", 330 | "reflection", 331 | "static analysis" 332 | ], 333 | "time": "2018-08-07T13:53:10+00:00" 334 | }, 335 | { 336 | "name": "phpdocumentor/reflection-docblock", 337 | "version": "4.3.2", 338 | "source": { 339 | "type": "git", 340 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 341 | "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e" 342 | }, 343 | "dist": { 344 | "type": "zip", 345 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e", 346 | "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e", 347 | "shasum": "" 348 | }, 349 | "require": { 350 | "php": "^7.0", 351 | "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", 352 | "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", 353 | "webmozart/assert": "^1.0" 354 | }, 355 | "require-dev": { 356 | "doctrine/instantiator": "^1.0.5", 357 | "mockery/mockery": "^1.0", 358 | "phpunit/phpunit": "^6.4" 359 | }, 360 | "type": "library", 361 | "extra": { 362 | "branch-alias": { 363 | "dev-master": "4.x-dev" 364 | } 365 | }, 366 | "autoload": { 367 | "psr-4": { 368 | "phpDocumentor\\Reflection\\": [ 369 | "src/" 370 | ] 371 | } 372 | }, 373 | "notification-url": "https://packagist.org/downloads/", 374 | "license": [ 375 | "MIT" 376 | ], 377 | "authors": [ 378 | { 379 | "name": "Mike van Riel", 380 | "email": "me@mikevanriel.com" 381 | } 382 | ], 383 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 384 | "time": "2019-09-12T14:27:41+00:00" 385 | }, 386 | { 387 | "name": "phpdocumentor/type-resolver", 388 | "version": "1.0.1", 389 | "source": { 390 | "type": "git", 391 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 392 | "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" 393 | }, 394 | "dist": { 395 | "type": "zip", 396 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", 397 | "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", 398 | "shasum": "" 399 | }, 400 | "require": { 401 | "php": "^7.1", 402 | "phpdocumentor/reflection-common": "^2.0" 403 | }, 404 | "require-dev": { 405 | "ext-tokenizer": "^7.1", 406 | "mockery/mockery": "~1", 407 | "phpunit/phpunit": "^7.0" 408 | }, 409 | "type": "library", 410 | "extra": { 411 | "branch-alias": { 412 | "dev-master": "1.x-dev" 413 | } 414 | }, 415 | "autoload": { 416 | "psr-4": { 417 | "phpDocumentor\\Reflection\\": "src" 418 | } 419 | }, 420 | "notification-url": "https://packagist.org/downloads/", 421 | "license": [ 422 | "MIT" 423 | ], 424 | "authors": [ 425 | { 426 | "name": "Mike van Riel", 427 | "email": "me@mikevanriel.com" 428 | } 429 | ], 430 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 431 | "time": "2019-08-22T18:11:29+00:00" 432 | }, 433 | { 434 | "name": "phpmd/phpmd", 435 | "version": "2.7.0", 436 | "source": { 437 | "type": "git", 438 | "url": "https://github.com/phpmd/phpmd.git", 439 | "reference": "a05a999c644f4bc9a204846017db7bb7809fbe4c" 440 | }, 441 | "dist": { 442 | "type": "zip", 443 | "url": "https://api.github.com/repos/phpmd/phpmd/zipball/a05a999c644f4bc9a204846017db7bb7809fbe4c", 444 | "reference": "a05a999c644f4bc9a204846017db7bb7809fbe4c", 445 | "shasum": "" 446 | }, 447 | "require": { 448 | "ext-xml": "*", 449 | "pdepend/pdepend": "^2.5", 450 | "php": ">=5.3.9" 451 | }, 452 | "require-dev": { 453 | "gregwar/rst": "^1.0", 454 | "mikey179/vfsstream": "^1.6.4", 455 | "phpunit/phpunit": "^4.8.36 || ^5.7.27", 456 | "squizlabs/php_codesniffer": "^2.0" 457 | }, 458 | "bin": [ 459 | "src/bin/phpmd" 460 | ], 461 | "type": "library", 462 | "autoload": { 463 | "psr-0": { 464 | "PHPMD\\": "src/main/php" 465 | } 466 | }, 467 | "notification-url": "https://packagist.org/downloads/", 468 | "license": [ 469 | "BSD-3-Clause" 470 | ], 471 | "authors": [ 472 | { 473 | "name": "Manuel Pichler", 474 | "email": "github@manuel-pichler.de", 475 | "homepage": "https://github.com/manuelpichler", 476 | "role": "Project Founder" 477 | }, 478 | { 479 | "name": "Marc Würth", 480 | "email": "ravage@bluewin.ch", 481 | "homepage": "https://github.com/ravage84", 482 | "role": "Project Maintainer" 483 | }, 484 | { 485 | "name": "Other contributors", 486 | "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", 487 | "role": "Contributors" 488 | } 489 | ], 490 | "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", 491 | "homepage": "https://phpmd.org/", 492 | "keywords": [ 493 | "mess detection", 494 | "mess detector", 495 | "pdepend", 496 | "phpmd", 497 | "pmd" 498 | ], 499 | "time": "2019-07-30T21:13:32+00:00" 500 | }, 501 | { 502 | "name": "phpspec/php-diff", 503 | "version": "v1.1.0", 504 | "source": { 505 | "type": "git", 506 | "url": "https://github.com/phpspec/php-diff.git", 507 | "reference": "0464787bfa7cd13576c5a1e318709768798bec6a" 508 | }, 509 | "dist": { 510 | "type": "zip", 511 | "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a", 512 | "reference": "0464787bfa7cd13576c5a1e318709768798bec6a", 513 | "shasum": "" 514 | }, 515 | "type": "library", 516 | "extra": { 517 | "branch-alias": { 518 | "dev-master": "1.0.x-dev" 519 | } 520 | }, 521 | "autoload": { 522 | "psr-0": { 523 | "Diff": "lib/" 524 | } 525 | }, 526 | "notification-url": "https://packagist.org/downloads/", 527 | "license": [ 528 | "BSD-3-Clause" 529 | ], 530 | "authors": [ 531 | { 532 | "name": "Chris Boulton", 533 | "homepage": "http://github.com/chrisboulton" 534 | } 535 | ], 536 | "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", 537 | "time": "2016-04-07T12:29:16+00:00" 538 | }, 539 | { 540 | "name": "phpspec/phpspec", 541 | "version": "5.1.2", 542 | "source": { 543 | "type": "git", 544 | "url": "https://github.com/phpspec/phpspec.git", 545 | "reference": "ff4119650a76de25eb674530547f1924082d3703" 546 | }, 547 | "dist": { 548 | "type": "zip", 549 | "url": "https://api.github.com/repos/phpspec/phpspec/zipball/ff4119650a76de25eb674530547f1924082d3703", 550 | "reference": "ff4119650a76de25eb674530547f1924082d3703", 551 | "shasum": "" 552 | }, 553 | "require": { 554 | "doctrine/instantiator": "^1.0.5", 555 | "ext-tokenizer": "*", 556 | "php": "^7.1, <7.4", 557 | "phpspec/php-diff": "^1.0.0", 558 | "phpspec/prophecy": "^1.7", 559 | "sebastian/exporter": "^1.0 || ^2.0 || ^3.0", 560 | "symfony/console": "^3.4 || ^4.0", 561 | "symfony/event-dispatcher": "^3.4 || ^4.0", 562 | "symfony/finder": "^3.4 || ^4.0", 563 | "symfony/process": "^3.4 || ^4.0", 564 | "symfony/yaml": "^3.4 || ^4.0" 565 | }, 566 | "require-dev": { 567 | "behat/behat": "^3.3", 568 | "phpunit/phpunit": "^5.7 || ^6.0", 569 | "symfony/filesystem": "^3.4 || ^4.0" 570 | }, 571 | "suggest": { 572 | "phpspec/nyan-formatters": "Adds Nyan formatters" 573 | }, 574 | "bin": [ 575 | "bin/phpspec" 576 | ], 577 | "type": "library", 578 | "extra": { 579 | "branch-alias": { 580 | "dev-master": "5.1.x-dev" 581 | } 582 | }, 583 | "autoload": { 584 | "psr-0": { 585 | "PhpSpec": "src/" 586 | } 587 | }, 588 | "notification-url": "https://packagist.org/downloads/", 589 | "license": [ 590 | "MIT" 591 | ], 592 | "authors": [ 593 | { 594 | "name": "Konstantin Kudryashov", 595 | "email": "ever.zet@gmail.com", 596 | "homepage": "http://everzet.com" 597 | }, 598 | { 599 | "name": "Marcello Duarte", 600 | "homepage": "http://marcelloduarte.net/" 601 | }, 602 | { 603 | "name": "Ciaran McNulty", 604 | "homepage": "https://ciaranmcnulty.com/" 605 | } 606 | ], 607 | "description": "Specification-oriented BDD framework for PHP 7.1+", 608 | "homepage": "http://phpspec.net/", 609 | "keywords": [ 610 | "BDD", 611 | "SpecBDD", 612 | "TDD", 613 | "spec", 614 | "specification", 615 | "testing", 616 | "tests" 617 | ], 618 | "time": "2019-10-02T09:45:39+00:00" 619 | }, 620 | { 621 | "name": "phpspec/prophecy", 622 | "version": "1.9.0", 623 | "source": { 624 | "type": "git", 625 | "url": "https://github.com/phpspec/prophecy.git", 626 | "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203" 627 | }, 628 | "dist": { 629 | "type": "zip", 630 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203", 631 | "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203", 632 | "shasum": "" 633 | }, 634 | "require": { 635 | "doctrine/instantiator": "^1.0.2", 636 | "php": "^5.3|^7.0", 637 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", 638 | "sebastian/comparator": "^1.1|^2.0|^3.0", 639 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 640 | }, 641 | "require-dev": { 642 | "phpspec/phpspec": "^2.5|^3.2", 643 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 644 | }, 645 | "type": "library", 646 | "extra": { 647 | "branch-alias": { 648 | "dev-master": "1.8.x-dev" 649 | } 650 | }, 651 | "autoload": { 652 | "psr-4": { 653 | "Prophecy\\": "src/Prophecy" 654 | } 655 | }, 656 | "notification-url": "https://packagist.org/downloads/", 657 | "license": [ 658 | "MIT" 659 | ], 660 | "authors": [ 661 | { 662 | "name": "Konstantin Kudryashov", 663 | "email": "ever.zet@gmail.com", 664 | "homepage": "http://everzet.com" 665 | }, 666 | { 667 | "name": "Marcello Duarte", 668 | "email": "marcello.duarte@gmail.com" 669 | } 670 | ], 671 | "description": "Highly opinionated mocking framework for PHP 5.3+", 672 | "homepage": "https://github.com/phpspec/prophecy", 673 | "keywords": [ 674 | "Double", 675 | "Dummy", 676 | "fake", 677 | "mock", 678 | "spy", 679 | "stub" 680 | ], 681 | "time": "2019-10-03T11:07:50+00:00" 682 | }, 683 | { 684 | "name": "phpunit/php-code-coverage", 685 | "version": "6.1.4", 686 | "source": { 687 | "type": "git", 688 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 689 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" 690 | }, 691 | "dist": { 692 | "type": "zip", 693 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 694 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 695 | "shasum": "" 696 | }, 697 | "require": { 698 | "ext-dom": "*", 699 | "ext-xmlwriter": "*", 700 | "php": "^7.1", 701 | "phpunit/php-file-iterator": "^2.0", 702 | "phpunit/php-text-template": "^1.2.1", 703 | "phpunit/php-token-stream": "^3.0", 704 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 705 | "sebastian/environment": "^3.1 || ^4.0", 706 | "sebastian/version": "^2.0.1", 707 | "theseer/tokenizer": "^1.1" 708 | }, 709 | "require-dev": { 710 | "phpunit/phpunit": "^7.0" 711 | }, 712 | "suggest": { 713 | "ext-xdebug": "^2.6.0" 714 | }, 715 | "type": "library", 716 | "extra": { 717 | "branch-alias": { 718 | "dev-master": "6.1-dev" 719 | } 720 | }, 721 | "autoload": { 722 | "classmap": [ 723 | "src/" 724 | ] 725 | }, 726 | "notification-url": "https://packagist.org/downloads/", 727 | "license": [ 728 | "BSD-3-Clause" 729 | ], 730 | "authors": [ 731 | { 732 | "name": "Sebastian Bergmann", 733 | "email": "sebastian@phpunit.de", 734 | "role": "lead" 735 | } 736 | ], 737 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 738 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 739 | "keywords": [ 740 | "coverage", 741 | "testing", 742 | "xunit" 743 | ], 744 | "time": "2018-10-31T16:06:48+00:00" 745 | }, 746 | { 747 | "name": "phpunit/php-file-iterator", 748 | "version": "2.0.2", 749 | "source": { 750 | "type": "git", 751 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 752 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 753 | }, 754 | "dist": { 755 | "type": "zip", 756 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 757 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 758 | "shasum": "" 759 | }, 760 | "require": { 761 | "php": "^7.1" 762 | }, 763 | "require-dev": { 764 | "phpunit/phpunit": "^7.1" 765 | }, 766 | "type": "library", 767 | "extra": { 768 | "branch-alias": { 769 | "dev-master": "2.0.x-dev" 770 | } 771 | }, 772 | "autoload": { 773 | "classmap": [ 774 | "src/" 775 | ] 776 | }, 777 | "notification-url": "https://packagist.org/downloads/", 778 | "license": [ 779 | "BSD-3-Clause" 780 | ], 781 | "authors": [ 782 | { 783 | "name": "Sebastian Bergmann", 784 | "email": "sebastian@phpunit.de", 785 | "role": "lead" 786 | } 787 | ], 788 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 789 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 790 | "keywords": [ 791 | "filesystem", 792 | "iterator" 793 | ], 794 | "time": "2018-09-13T20:33:42+00:00" 795 | }, 796 | { 797 | "name": "phpunit/php-text-template", 798 | "version": "1.2.1", 799 | "source": { 800 | "type": "git", 801 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 802 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 803 | }, 804 | "dist": { 805 | "type": "zip", 806 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 807 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 808 | "shasum": "" 809 | }, 810 | "require": { 811 | "php": ">=5.3.3" 812 | }, 813 | "type": "library", 814 | "autoload": { 815 | "classmap": [ 816 | "src/" 817 | ] 818 | }, 819 | "notification-url": "https://packagist.org/downloads/", 820 | "license": [ 821 | "BSD-3-Clause" 822 | ], 823 | "authors": [ 824 | { 825 | "name": "Sebastian Bergmann", 826 | "email": "sebastian@phpunit.de", 827 | "role": "lead" 828 | } 829 | ], 830 | "description": "Simple template engine.", 831 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 832 | "keywords": [ 833 | "template" 834 | ], 835 | "time": "2015-06-21T13:50:34+00:00" 836 | }, 837 | { 838 | "name": "phpunit/php-token-stream", 839 | "version": "3.1.1", 840 | "source": { 841 | "type": "git", 842 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 843 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" 844 | }, 845 | "dist": { 846 | "type": "zip", 847 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", 848 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", 849 | "shasum": "" 850 | }, 851 | "require": { 852 | "ext-tokenizer": "*", 853 | "php": "^7.1" 854 | }, 855 | "require-dev": { 856 | "phpunit/phpunit": "^7.0" 857 | }, 858 | "type": "library", 859 | "extra": { 860 | "branch-alias": { 861 | "dev-master": "3.1-dev" 862 | } 863 | }, 864 | "autoload": { 865 | "classmap": [ 866 | "src/" 867 | ] 868 | }, 869 | "notification-url": "https://packagist.org/downloads/", 870 | "license": [ 871 | "BSD-3-Clause" 872 | ], 873 | "authors": [ 874 | { 875 | "name": "Sebastian Bergmann", 876 | "email": "sebastian@phpunit.de" 877 | } 878 | ], 879 | "description": "Wrapper around PHP's tokenizer extension.", 880 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 881 | "keywords": [ 882 | "tokenizer" 883 | ], 884 | "time": "2019-09-17T06:23:10+00:00" 885 | }, 886 | { 887 | "name": "psr/container", 888 | "version": "1.0.0", 889 | "source": { 890 | "type": "git", 891 | "url": "https://github.com/php-fig/container.git", 892 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 893 | }, 894 | "dist": { 895 | "type": "zip", 896 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 897 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 898 | "shasum": "" 899 | }, 900 | "require": { 901 | "php": ">=5.3.0" 902 | }, 903 | "type": "library", 904 | "extra": { 905 | "branch-alias": { 906 | "dev-master": "1.0.x-dev" 907 | } 908 | }, 909 | "autoload": { 910 | "psr-4": { 911 | "Psr\\Container\\": "src/" 912 | } 913 | }, 914 | "notification-url": "https://packagist.org/downloads/", 915 | "license": [ 916 | "MIT" 917 | ], 918 | "authors": [ 919 | { 920 | "name": "PHP-FIG", 921 | "homepage": "http://www.php-fig.org/" 922 | } 923 | ], 924 | "description": "Common Container Interface (PHP FIG PSR-11)", 925 | "homepage": "https://github.com/php-fig/container", 926 | "keywords": [ 927 | "PSR-11", 928 | "container", 929 | "container-interface", 930 | "container-interop", 931 | "psr" 932 | ], 933 | "time": "2017-02-14T16:28:37+00:00" 934 | }, 935 | { 936 | "name": "sebastian/code-unit-reverse-lookup", 937 | "version": "1.0.1", 938 | "source": { 939 | "type": "git", 940 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 941 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 942 | }, 943 | "dist": { 944 | "type": "zip", 945 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 946 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 947 | "shasum": "" 948 | }, 949 | "require": { 950 | "php": "^5.6 || ^7.0" 951 | }, 952 | "require-dev": { 953 | "phpunit/phpunit": "^5.7 || ^6.0" 954 | }, 955 | "type": "library", 956 | "extra": { 957 | "branch-alias": { 958 | "dev-master": "1.0.x-dev" 959 | } 960 | }, 961 | "autoload": { 962 | "classmap": [ 963 | "src/" 964 | ] 965 | }, 966 | "notification-url": "https://packagist.org/downloads/", 967 | "license": [ 968 | "BSD-3-Clause" 969 | ], 970 | "authors": [ 971 | { 972 | "name": "Sebastian Bergmann", 973 | "email": "sebastian@phpunit.de" 974 | } 975 | ], 976 | "description": "Looks up which function or method a line of code belongs to", 977 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 978 | "time": "2017-03-04T06:30:41+00:00" 979 | }, 980 | { 981 | "name": "sebastian/comparator", 982 | "version": "3.0.2", 983 | "source": { 984 | "type": "git", 985 | "url": "https://github.com/sebastianbergmann/comparator.git", 986 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 987 | }, 988 | "dist": { 989 | "type": "zip", 990 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 991 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 992 | "shasum": "" 993 | }, 994 | "require": { 995 | "php": "^7.1", 996 | "sebastian/diff": "^3.0", 997 | "sebastian/exporter": "^3.1" 998 | }, 999 | "require-dev": { 1000 | "phpunit/phpunit": "^7.1" 1001 | }, 1002 | "type": "library", 1003 | "extra": { 1004 | "branch-alias": { 1005 | "dev-master": "3.0-dev" 1006 | } 1007 | }, 1008 | "autoload": { 1009 | "classmap": [ 1010 | "src/" 1011 | ] 1012 | }, 1013 | "notification-url": "https://packagist.org/downloads/", 1014 | "license": [ 1015 | "BSD-3-Clause" 1016 | ], 1017 | "authors": [ 1018 | { 1019 | "name": "Jeff Welch", 1020 | "email": "whatthejeff@gmail.com" 1021 | }, 1022 | { 1023 | "name": "Volker Dusch", 1024 | "email": "github@wallbash.com" 1025 | }, 1026 | { 1027 | "name": "Bernhard Schussek", 1028 | "email": "bschussek@2bepublished.at" 1029 | }, 1030 | { 1031 | "name": "Sebastian Bergmann", 1032 | "email": "sebastian@phpunit.de" 1033 | } 1034 | ], 1035 | "description": "Provides the functionality to compare PHP values for equality", 1036 | "homepage": "https://github.com/sebastianbergmann/comparator", 1037 | "keywords": [ 1038 | "comparator", 1039 | "compare", 1040 | "equality" 1041 | ], 1042 | "time": "2018-07-12T15:12:46+00:00" 1043 | }, 1044 | { 1045 | "name": "sebastian/diff", 1046 | "version": "3.0.2", 1047 | "source": { 1048 | "type": "git", 1049 | "url": "https://github.com/sebastianbergmann/diff.git", 1050 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" 1051 | }, 1052 | "dist": { 1053 | "type": "zip", 1054 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 1055 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 1056 | "shasum": "" 1057 | }, 1058 | "require": { 1059 | "php": "^7.1" 1060 | }, 1061 | "require-dev": { 1062 | "phpunit/phpunit": "^7.5 || ^8.0", 1063 | "symfony/process": "^2 || ^3.3 || ^4" 1064 | }, 1065 | "type": "library", 1066 | "extra": { 1067 | "branch-alias": { 1068 | "dev-master": "3.0-dev" 1069 | } 1070 | }, 1071 | "autoload": { 1072 | "classmap": [ 1073 | "src/" 1074 | ] 1075 | }, 1076 | "notification-url": "https://packagist.org/downloads/", 1077 | "license": [ 1078 | "BSD-3-Clause" 1079 | ], 1080 | "authors": [ 1081 | { 1082 | "name": "Kore Nordmann", 1083 | "email": "mail@kore-nordmann.de" 1084 | }, 1085 | { 1086 | "name": "Sebastian Bergmann", 1087 | "email": "sebastian@phpunit.de" 1088 | } 1089 | ], 1090 | "description": "Diff implementation", 1091 | "homepage": "https://github.com/sebastianbergmann/diff", 1092 | "keywords": [ 1093 | "diff", 1094 | "udiff", 1095 | "unidiff", 1096 | "unified diff" 1097 | ], 1098 | "time": "2019-02-04T06:01:07+00:00" 1099 | }, 1100 | { 1101 | "name": "sebastian/environment", 1102 | "version": "4.2.2", 1103 | "source": { 1104 | "type": "git", 1105 | "url": "https://github.com/sebastianbergmann/environment.git", 1106 | "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404" 1107 | }, 1108 | "dist": { 1109 | "type": "zip", 1110 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/f2a2c8e1c97c11ace607a7a667d73d47c19fe404", 1111 | "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404", 1112 | "shasum": "" 1113 | }, 1114 | "require": { 1115 | "php": "^7.1" 1116 | }, 1117 | "require-dev": { 1118 | "phpunit/phpunit": "^7.5" 1119 | }, 1120 | "suggest": { 1121 | "ext-posix": "*" 1122 | }, 1123 | "type": "library", 1124 | "extra": { 1125 | "branch-alias": { 1126 | "dev-master": "4.2-dev" 1127 | } 1128 | }, 1129 | "autoload": { 1130 | "classmap": [ 1131 | "src/" 1132 | ] 1133 | }, 1134 | "notification-url": "https://packagist.org/downloads/", 1135 | "license": [ 1136 | "BSD-3-Clause" 1137 | ], 1138 | "authors": [ 1139 | { 1140 | "name": "Sebastian Bergmann", 1141 | "email": "sebastian@phpunit.de" 1142 | } 1143 | ], 1144 | "description": "Provides functionality to handle HHVM/PHP environments", 1145 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1146 | "keywords": [ 1147 | "Xdebug", 1148 | "environment", 1149 | "hhvm" 1150 | ], 1151 | "time": "2019-05-05T09:05:15+00:00" 1152 | }, 1153 | { 1154 | "name": "sebastian/exporter", 1155 | "version": "3.1.2", 1156 | "source": { 1157 | "type": "git", 1158 | "url": "https://github.com/sebastianbergmann/exporter.git", 1159 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" 1160 | }, 1161 | "dist": { 1162 | "type": "zip", 1163 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", 1164 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", 1165 | "shasum": "" 1166 | }, 1167 | "require": { 1168 | "php": "^7.0", 1169 | "sebastian/recursion-context": "^3.0" 1170 | }, 1171 | "require-dev": { 1172 | "ext-mbstring": "*", 1173 | "phpunit/phpunit": "^6.0" 1174 | }, 1175 | "type": "library", 1176 | "extra": { 1177 | "branch-alias": { 1178 | "dev-master": "3.1.x-dev" 1179 | } 1180 | }, 1181 | "autoload": { 1182 | "classmap": [ 1183 | "src/" 1184 | ] 1185 | }, 1186 | "notification-url": "https://packagist.org/downloads/", 1187 | "license": [ 1188 | "BSD-3-Clause" 1189 | ], 1190 | "authors": [ 1191 | { 1192 | "name": "Sebastian Bergmann", 1193 | "email": "sebastian@phpunit.de" 1194 | }, 1195 | { 1196 | "name": "Jeff Welch", 1197 | "email": "whatthejeff@gmail.com" 1198 | }, 1199 | { 1200 | "name": "Volker Dusch", 1201 | "email": "github@wallbash.com" 1202 | }, 1203 | { 1204 | "name": "Adam Harvey", 1205 | "email": "aharvey@php.net" 1206 | }, 1207 | { 1208 | "name": "Bernhard Schussek", 1209 | "email": "bschussek@gmail.com" 1210 | } 1211 | ], 1212 | "description": "Provides the functionality to export PHP variables for visualization", 1213 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1214 | "keywords": [ 1215 | "export", 1216 | "exporter" 1217 | ], 1218 | "time": "2019-09-14T09:02:43+00:00" 1219 | }, 1220 | { 1221 | "name": "sebastian/recursion-context", 1222 | "version": "3.0.0", 1223 | "source": { 1224 | "type": "git", 1225 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1226 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 1227 | }, 1228 | "dist": { 1229 | "type": "zip", 1230 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1231 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1232 | "shasum": "" 1233 | }, 1234 | "require": { 1235 | "php": "^7.0" 1236 | }, 1237 | "require-dev": { 1238 | "phpunit/phpunit": "^6.0" 1239 | }, 1240 | "type": "library", 1241 | "extra": { 1242 | "branch-alias": { 1243 | "dev-master": "3.0.x-dev" 1244 | } 1245 | }, 1246 | "autoload": { 1247 | "classmap": [ 1248 | "src/" 1249 | ] 1250 | }, 1251 | "notification-url": "https://packagist.org/downloads/", 1252 | "license": [ 1253 | "BSD-3-Clause" 1254 | ], 1255 | "authors": [ 1256 | { 1257 | "name": "Jeff Welch", 1258 | "email": "whatthejeff@gmail.com" 1259 | }, 1260 | { 1261 | "name": "Sebastian Bergmann", 1262 | "email": "sebastian@phpunit.de" 1263 | }, 1264 | { 1265 | "name": "Adam Harvey", 1266 | "email": "aharvey@php.net" 1267 | } 1268 | ], 1269 | "description": "Provides functionality to recursively process PHP variables", 1270 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1271 | "time": "2017-03-03T06:23:57+00:00" 1272 | }, 1273 | { 1274 | "name": "sebastian/version", 1275 | "version": "2.0.1", 1276 | "source": { 1277 | "type": "git", 1278 | "url": "https://github.com/sebastianbergmann/version.git", 1279 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1280 | }, 1281 | "dist": { 1282 | "type": "zip", 1283 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1284 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1285 | "shasum": "" 1286 | }, 1287 | "require": { 1288 | "php": ">=5.6" 1289 | }, 1290 | "type": "library", 1291 | "extra": { 1292 | "branch-alias": { 1293 | "dev-master": "2.0.x-dev" 1294 | } 1295 | }, 1296 | "autoload": { 1297 | "classmap": [ 1298 | "src/" 1299 | ] 1300 | }, 1301 | "notification-url": "https://packagist.org/downloads/", 1302 | "license": [ 1303 | "BSD-3-Clause" 1304 | ], 1305 | "authors": [ 1306 | { 1307 | "name": "Sebastian Bergmann", 1308 | "email": "sebastian@phpunit.de", 1309 | "role": "lead" 1310 | } 1311 | ], 1312 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1313 | "homepage": "https://github.com/sebastianbergmann/version", 1314 | "time": "2016-10-03T07:35:21+00:00" 1315 | }, 1316 | { 1317 | "name": "squizlabs/php_codesniffer", 1318 | "version": "3.5.2", 1319 | "source": { 1320 | "type": "git", 1321 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 1322 | "reference": "65b12cdeaaa6cd276d4c3033a95b9b88b12701e7" 1323 | }, 1324 | "dist": { 1325 | "type": "zip", 1326 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/65b12cdeaaa6cd276d4c3033a95b9b88b12701e7", 1327 | "reference": "65b12cdeaaa6cd276d4c3033a95b9b88b12701e7", 1328 | "shasum": "" 1329 | }, 1330 | "require": { 1331 | "ext-simplexml": "*", 1332 | "ext-tokenizer": "*", 1333 | "ext-xmlwriter": "*", 1334 | "php": ">=5.4.0" 1335 | }, 1336 | "require-dev": { 1337 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 1338 | }, 1339 | "bin": [ 1340 | "bin/phpcs", 1341 | "bin/phpcbf" 1342 | ], 1343 | "type": "library", 1344 | "extra": { 1345 | "branch-alias": { 1346 | "dev-master": "3.x-dev" 1347 | } 1348 | }, 1349 | "notification-url": "https://packagist.org/downloads/", 1350 | "license": [ 1351 | "BSD-3-Clause" 1352 | ], 1353 | "authors": [ 1354 | { 1355 | "name": "Greg Sherwood", 1356 | "role": "lead" 1357 | } 1358 | ], 1359 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 1360 | "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", 1361 | "keywords": [ 1362 | "phpcs", 1363 | "standards" 1364 | ], 1365 | "time": "2019-10-28T04:36:32+00:00" 1366 | }, 1367 | { 1368 | "name": "symfony/config", 1369 | "version": "v4.3.8", 1370 | "source": { 1371 | "type": "git", 1372 | "url": "https://github.com/symfony/config.git", 1373 | "reference": "8267214841c44d315a55242ea867684eb43c42ce" 1374 | }, 1375 | "dist": { 1376 | "type": "zip", 1377 | "url": "https://api.github.com/repos/symfony/config/zipball/8267214841c44d315a55242ea867684eb43c42ce", 1378 | "reference": "8267214841c44d315a55242ea867684eb43c42ce", 1379 | "shasum": "" 1380 | }, 1381 | "require": { 1382 | "php": "^7.1.3", 1383 | "symfony/filesystem": "~3.4|~4.0", 1384 | "symfony/polyfill-ctype": "~1.8" 1385 | }, 1386 | "conflict": { 1387 | "symfony/finder": "<3.4" 1388 | }, 1389 | "require-dev": { 1390 | "symfony/dependency-injection": "~3.4|~4.0", 1391 | "symfony/event-dispatcher": "~3.4|~4.0", 1392 | "symfony/finder": "~3.4|~4.0", 1393 | "symfony/messenger": "~4.1", 1394 | "symfony/yaml": "~3.4|~4.0" 1395 | }, 1396 | "suggest": { 1397 | "symfony/yaml": "To use the yaml reference dumper" 1398 | }, 1399 | "type": "library", 1400 | "extra": { 1401 | "branch-alias": { 1402 | "dev-master": "4.3-dev" 1403 | } 1404 | }, 1405 | "autoload": { 1406 | "psr-4": { 1407 | "Symfony\\Component\\Config\\": "" 1408 | }, 1409 | "exclude-from-classmap": [ 1410 | "/Tests/" 1411 | ] 1412 | }, 1413 | "notification-url": "https://packagist.org/downloads/", 1414 | "license": [ 1415 | "MIT" 1416 | ], 1417 | "authors": [ 1418 | { 1419 | "name": "Fabien Potencier", 1420 | "email": "fabien@symfony.com" 1421 | }, 1422 | { 1423 | "name": "Symfony Community", 1424 | "homepage": "https://symfony.com/contributors" 1425 | } 1426 | ], 1427 | "description": "Symfony Config Component", 1428 | "homepage": "https://symfony.com", 1429 | "time": "2019-11-08T08:31:27+00:00" 1430 | }, 1431 | { 1432 | "name": "symfony/console", 1433 | "version": "v4.3.8", 1434 | "source": { 1435 | "type": "git", 1436 | "url": "https://github.com/symfony/console.git", 1437 | "reference": "831424efae0a1fe6642784bd52aae14ece6538e6" 1438 | }, 1439 | "dist": { 1440 | "type": "zip", 1441 | "url": "https://api.github.com/repos/symfony/console/zipball/831424efae0a1fe6642784bd52aae14ece6538e6", 1442 | "reference": "831424efae0a1fe6642784bd52aae14ece6538e6", 1443 | "shasum": "" 1444 | }, 1445 | "require": { 1446 | "php": "^7.1.3", 1447 | "symfony/polyfill-mbstring": "~1.0", 1448 | "symfony/polyfill-php73": "^1.8", 1449 | "symfony/service-contracts": "^1.1" 1450 | }, 1451 | "conflict": { 1452 | "symfony/dependency-injection": "<3.4", 1453 | "symfony/event-dispatcher": "<4.3", 1454 | "symfony/process": "<3.3" 1455 | }, 1456 | "provide": { 1457 | "psr/log-implementation": "1.0" 1458 | }, 1459 | "require-dev": { 1460 | "psr/log": "~1.0", 1461 | "symfony/config": "~3.4|~4.0", 1462 | "symfony/dependency-injection": "~3.4|~4.0", 1463 | "symfony/event-dispatcher": "^4.3", 1464 | "symfony/lock": "~3.4|~4.0", 1465 | "symfony/process": "~3.4|~4.0", 1466 | "symfony/var-dumper": "^4.3" 1467 | }, 1468 | "suggest": { 1469 | "psr/log": "For using the console logger", 1470 | "symfony/event-dispatcher": "", 1471 | "symfony/lock": "", 1472 | "symfony/process": "" 1473 | }, 1474 | "type": "library", 1475 | "extra": { 1476 | "branch-alias": { 1477 | "dev-master": "4.3-dev" 1478 | } 1479 | }, 1480 | "autoload": { 1481 | "psr-4": { 1482 | "Symfony\\Component\\Console\\": "" 1483 | }, 1484 | "exclude-from-classmap": [ 1485 | "/Tests/" 1486 | ] 1487 | }, 1488 | "notification-url": "https://packagist.org/downloads/", 1489 | "license": [ 1490 | "MIT" 1491 | ], 1492 | "authors": [ 1493 | { 1494 | "name": "Fabien Potencier", 1495 | "email": "fabien@symfony.com" 1496 | }, 1497 | { 1498 | "name": "Symfony Community", 1499 | "homepage": "https://symfony.com/contributors" 1500 | } 1501 | ], 1502 | "description": "Symfony Console Component", 1503 | "homepage": "https://symfony.com", 1504 | "time": "2019-11-13T07:29:07+00:00" 1505 | }, 1506 | { 1507 | "name": "symfony/dependency-injection", 1508 | "version": "v4.3.8", 1509 | "source": { 1510 | "type": "git", 1511 | "url": "https://github.com/symfony/dependency-injection.git", 1512 | "reference": "80c6d9e19467dfbba14f830ed478eb592ce51b64" 1513 | }, 1514 | "dist": { 1515 | "type": "zip", 1516 | "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/80c6d9e19467dfbba14f830ed478eb592ce51b64", 1517 | "reference": "80c6d9e19467dfbba14f830ed478eb592ce51b64", 1518 | "shasum": "" 1519 | }, 1520 | "require": { 1521 | "php": "^7.1.3", 1522 | "psr/container": "^1.0", 1523 | "symfony/service-contracts": "^1.1.6" 1524 | }, 1525 | "conflict": { 1526 | "symfony/config": "<4.3", 1527 | "symfony/finder": "<3.4", 1528 | "symfony/proxy-manager-bridge": "<3.4", 1529 | "symfony/yaml": "<3.4" 1530 | }, 1531 | "provide": { 1532 | "psr/container-implementation": "1.0", 1533 | "symfony/service-implementation": "1.0" 1534 | }, 1535 | "require-dev": { 1536 | "symfony/config": "^4.3", 1537 | "symfony/expression-language": "~3.4|~4.0", 1538 | "symfony/yaml": "~3.4|~4.0" 1539 | }, 1540 | "suggest": { 1541 | "symfony/config": "", 1542 | "symfony/expression-language": "For using expressions in service container configuration", 1543 | "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", 1544 | "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", 1545 | "symfony/yaml": "" 1546 | }, 1547 | "type": "library", 1548 | "extra": { 1549 | "branch-alias": { 1550 | "dev-master": "4.3-dev" 1551 | } 1552 | }, 1553 | "autoload": { 1554 | "psr-4": { 1555 | "Symfony\\Component\\DependencyInjection\\": "" 1556 | }, 1557 | "exclude-from-classmap": [ 1558 | "/Tests/" 1559 | ] 1560 | }, 1561 | "notification-url": "https://packagist.org/downloads/", 1562 | "license": [ 1563 | "MIT" 1564 | ], 1565 | "authors": [ 1566 | { 1567 | "name": "Fabien Potencier", 1568 | "email": "fabien@symfony.com" 1569 | }, 1570 | { 1571 | "name": "Symfony Community", 1572 | "homepage": "https://symfony.com/contributors" 1573 | } 1574 | ], 1575 | "description": "Symfony DependencyInjection Component", 1576 | "homepage": "https://symfony.com", 1577 | "time": "2019-11-08T16:22:27+00:00" 1578 | }, 1579 | { 1580 | "name": "symfony/event-dispatcher", 1581 | "version": "v4.3.8", 1582 | "source": { 1583 | "type": "git", 1584 | "url": "https://github.com/symfony/event-dispatcher.git", 1585 | "reference": "0df002fd4f500392eabd243c2947061a50937287" 1586 | }, 1587 | "dist": { 1588 | "type": "zip", 1589 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0df002fd4f500392eabd243c2947061a50937287", 1590 | "reference": "0df002fd4f500392eabd243c2947061a50937287", 1591 | "shasum": "" 1592 | }, 1593 | "require": { 1594 | "php": "^7.1.3", 1595 | "symfony/event-dispatcher-contracts": "^1.1" 1596 | }, 1597 | "conflict": { 1598 | "symfony/dependency-injection": "<3.4" 1599 | }, 1600 | "provide": { 1601 | "psr/event-dispatcher-implementation": "1.0", 1602 | "symfony/event-dispatcher-implementation": "1.1" 1603 | }, 1604 | "require-dev": { 1605 | "psr/log": "~1.0", 1606 | "symfony/config": "~3.4|~4.0", 1607 | "symfony/dependency-injection": "~3.4|~4.0", 1608 | "symfony/expression-language": "~3.4|~4.0", 1609 | "symfony/http-foundation": "^3.4|^4.0", 1610 | "symfony/service-contracts": "^1.1", 1611 | "symfony/stopwatch": "~3.4|~4.0" 1612 | }, 1613 | "suggest": { 1614 | "symfony/dependency-injection": "", 1615 | "symfony/http-kernel": "" 1616 | }, 1617 | "type": "library", 1618 | "extra": { 1619 | "branch-alias": { 1620 | "dev-master": "4.3-dev" 1621 | } 1622 | }, 1623 | "autoload": { 1624 | "psr-4": { 1625 | "Symfony\\Component\\EventDispatcher\\": "" 1626 | }, 1627 | "exclude-from-classmap": [ 1628 | "/Tests/" 1629 | ] 1630 | }, 1631 | "notification-url": "https://packagist.org/downloads/", 1632 | "license": [ 1633 | "MIT" 1634 | ], 1635 | "authors": [ 1636 | { 1637 | "name": "Fabien Potencier", 1638 | "email": "fabien@symfony.com" 1639 | }, 1640 | { 1641 | "name": "Symfony Community", 1642 | "homepage": "https://symfony.com/contributors" 1643 | } 1644 | ], 1645 | "description": "Symfony EventDispatcher Component", 1646 | "homepage": "https://symfony.com", 1647 | "time": "2019-11-03T09:04:05+00:00" 1648 | }, 1649 | { 1650 | "name": "symfony/event-dispatcher-contracts", 1651 | "version": "v1.1.7", 1652 | "source": { 1653 | "type": "git", 1654 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 1655 | "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18" 1656 | }, 1657 | "dist": { 1658 | "type": "zip", 1659 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18", 1660 | "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18", 1661 | "shasum": "" 1662 | }, 1663 | "require": { 1664 | "php": "^7.1.3" 1665 | }, 1666 | "suggest": { 1667 | "psr/event-dispatcher": "", 1668 | "symfony/event-dispatcher-implementation": "" 1669 | }, 1670 | "type": "library", 1671 | "extra": { 1672 | "branch-alias": { 1673 | "dev-master": "1.1-dev" 1674 | } 1675 | }, 1676 | "autoload": { 1677 | "psr-4": { 1678 | "Symfony\\Contracts\\EventDispatcher\\": "" 1679 | } 1680 | }, 1681 | "notification-url": "https://packagist.org/downloads/", 1682 | "license": [ 1683 | "MIT" 1684 | ], 1685 | "authors": [ 1686 | { 1687 | "name": "Nicolas Grekas", 1688 | "email": "p@tchwork.com" 1689 | }, 1690 | { 1691 | "name": "Symfony Community", 1692 | "homepage": "https://symfony.com/contributors" 1693 | } 1694 | ], 1695 | "description": "Generic abstractions related to dispatching event", 1696 | "homepage": "https://symfony.com", 1697 | "keywords": [ 1698 | "abstractions", 1699 | "contracts", 1700 | "decoupling", 1701 | "interfaces", 1702 | "interoperability", 1703 | "standards" 1704 | ], 1705 | "time": "2019-09-17T09:54:03+00:00" 1706 | }, 1707 | { 1708 | "name": "symfony/filesystem", 1709 | "version": "v4.3.8", 1710 | "source": { 1711 | "type": "git", 1712 | "url": "https://github.com/symfony/filesystem.git", 1713 | "reference": "9abbb7ef96a51f4d7e69627bc6f63307994e4263" 1714 | }, 1715 | "dist": { 1716 | "type": "zip", 1717 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/9abbb7ef96a51f4d7e69627bc6f63307994e4263", 1718 | "reference": "9abbb7ef96a51f4d7e69627bc6f63307994e4263", 1719 | "shasum": "" 1720 | }, 1721 | "require": { 1722 | "php": "^7.1.3", 1723 | "symfony/polyfill-ctype": "~1.8" 1724 | }, 1725 | "type": "library", 1726 | "extra": { 1727 | "branch-alias": { 1728 | "dev-master": "4.3-dev" 1729 | } 1730 | }, 1731 | "autoload": { 1732 | "psr-4": { 1733 | "Symfony\\Component\\Filesystem\\": "" 1734 | }, 1735 | "exclude-from-classmap": [ 1736 | "/Tests/" 1737 | ] 1738 | }, 1739 | "notification-url": "https://packagist.org/downloads/", 1740 | "license": [ 1741 | "MIT" 1742 | ], 1743 | "authors": [ 1744 | { 1745 | "name": "Fabien Potencier", 1746 | "email": "fabien@symfony.com" 1747 | }, 1748 | { 1749 | "name": "Symfony Community", 1750 | "homepage": "https://symfony.com/contributors" 1751 | } 1752 | ], 1753 | "description": "Symfony Filesystem Component", 1754 | "homepage": "https://symfony.com", 1755 | "time": "2019-08-20T14:07:54+00:00" 1756 | }, 1757 | { 1758 | "name": "symfony/finder", 1759 | "version": "v4.3.8", 1760 | "source": { 1761 | "type": "git", 1762 | "url": "https://github.com/symfony/finder.git", 1763 | "reference": "72a068f77e317ae77c0a0495236ad292cfb5ce6f" 1764 | }, 1765 | "dist": { 1766 | "type": "zip", 1767 | "url": "https://api.github.com/repos/symfony/finder/zipball/72a068f77e317ae77c0a0495236ad292cfb5ce6f", 1768 | "reference": "72a068f77e317ae77c0a0495236ad292cfb5ce6f", 1769 | "shasum": "" 1770 | }, 1771 | "require": { 1772 | "php": "^7.1.3" 1773 | }, 1774 | "type": "library", 1775 | "extra": { 1776 | "branch-alias": { 1777 | "dev-master": "4.3-dev" 1778 | } 1779 | }, 1780 | "autoload": { 1781 | "psr-4": { 1782 | "Symfony\\Component\\Finder\\": "" 1783 | }, 1784 | "exclude-from-classmap": [ 1785 | "/Tests/" 1786 | ] 1787 | }, 1788 | "notification-url": "https://packagist.org/downloads/", 1789 | "license": [ 1790 | "MIT" 1791 | ], 1792 | "authors": [ 1793 | { 1794 | "name": "Fabien Potencier", 1795 | "email": "fabien@symfony.com" 1796 | }, 1797 | { 1798 | "name": "Symfony Community", 1799 | "homepage": "https://symfony.com/contributors" 1800 | } 1801 | ], 1802 | "description": "Symfony Finder Component", 1803 | "homepage": "https://symfony.com", 1804 | "time": "2019-10-30T12:53:54+00:00" 1805 | }, 1806 | { 1807 | "name": "symfony/polyfill-ctype", 1808 | "version": "v1.12.0", 1809 | "source": { 1810 | "type": "git", 1811 | "url": "https://github.com/symfony/polyfill-ctype.git", 1812 | "reference": "550ebaac289296ce228a706d0867afc34687e3f4" 1813 | }, 1814 | "dist": { 1815 | "type": "zip", 1816 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", 1817 | "reference": "550ebaac289296ce228a706d0867afc34687e3f4", 1818 | "shasum": "" 1819 | }, 1820 | "require": { 1821 | "php": ">=5.3.3" 1822 | }, 1823 | "suggest": { 1824 | "ext-ctype": "For best performance" 1825 | }, 1826 | "type": "library", 1827 | "extra": { 1828 | "branch-alias": { 1829 | "dev-master": "1.12-dev" 1830 | } 1831 | }, 1832 | "autoload": { 1833 | "psr-4": { 1834 | "Symfony\\Polyfill\\Ctype\\": "" 1835 | }, 1836 | "files": [ 1837 | "bootstrap.php" 1838 | ] 1839 | }, 1840 | "notification-url": "https://packagist.org/downloads/", 1841 | "license": [ 1842 | "MIT" 1843 | ], 1844 | "authors": [ 1845 | { 1846 | "name": "Gert de Pagter", 1847 | "email": "BackEndTea@gmail.com" 1848 | }, 1849 | { 1850 | "name": "Symfony Community", 1851 | "homepage": "https://symfony.com/contributors" 1852 | } 1853 | ], 1854 | "description": "Symfony polyfill for ctype functions", 1855 | "homepage": "https://symfony.com", 1856 | "keywords": [ 1857 | "compatibility", 1858 | "ctype", 1859 | "polyfill", 1860 | "portable" 1861 | ], 1862 | "time": "2019-08-06T08:03:45+00:00" 1863 | }, 1864 | { 1865 | "name": "symfony/polyfill-mbstring", 1866 | "version": "v1.12.0", 1867 | "source": { 1868 | "type": "git", 1869 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1870 | "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17" 1871 | }, 1872 | "dist": { 1873 | "type": "zip", 1874 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17", 1875 | "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17", 1876 | "shasum": "" 1877 | }, 1878 | "require": { 1879 | "php": ">=5.3.3" 1880 | }, 1881 | "suggest": { 1882 | "ext-mbstring": "For best performance" 1883 | }, 1884 | "type": "library", 1885 | "extra": { 1886 | "branch-alias": { 1887 | "dev-master": "1.12-dev" 1888 | } 1889 | }, 1890 | "autoload": { 1891 | "psr-4": { 1892 | "Symfony\\Polyfill\\Mbstring\\": "" 1893 | }, 1894 | "files": [ 1895 | "bootstrap.php" 1896 | ] 1897 | }, 1898 | "notification-url": "https://packagist.org/downloads/", 1899 | "license": [ 1900 | "MIT" 1901 | ], 1902 | "authors": [ 1903 | { 1904 | "name": "Nicolas Grekas", 1905 | "email": "p@tchwork.com" 1906 | }, 1907 | { 1908 | "name": "Symfony Community", 1909 | "homepage": "https://symfony.com/contributors" 1910 | } 1911 | ], 1912 | "description": "Symfony polyfill for the Mbstring extension", 1913 | "homepage": "https://symfony.com", 1914 | "keywords": [ 1915 | "compatibility", 1916 | "mbstring", 1917 | "polyfill", 1918 | "portable", 1919 | "shim" 1920 | ], 1921 | "time": "2019-08-06T08:03:45+00:00" 1922 | }, 1923 | { 1924 | "name": "symfony/polyfill-php73", 1925 | "version": "v1.12.0", 1926 | "source": { 1927 | "type": "git", 1928 | "url": "https://github.com/symfony/polyfill-php73.git", 1929 | "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188" 1930 | }, 1931 | "dist": { 1932 | "type": "zip", 1933 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/2ceb49eaccb9352bff54d22570276bb75ba4a188", 1934 | "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188", 1935 | "shasum": "" 1936 | }, 1937 | "require": { 1938 | "php": ">=5.3.3" 1939 | }, 1940 | "type": "library", 1941 | "extra": { 1942 | "branch-alias": { 1943 | "dev-master": "1.12-dev" 1944 | } 1945 | }, 1946 | "autoload": { 1947 | "psr-4": { 1948 | "Symfony\\Polyfill\\Php73\\": "" 1949 | }, 1950 | "files": [ 1951 | "bootstrap.php" 1952 | ], 1953 | "classmap": [ 1954 | "Resources/stubs" 1955 | ] 1956 | }, 1957 | "notification-url": "https://packagist.org/downloads/", 1958 | "license": [ 1959 | "MIT" 1960 | ], 1961 | "authors": [ 1962 | { 1963 | "name": "Nicolas Grekas", 1964 | "email": "p@tchwork.com" 1965 | }, 1966 | { 1967 | "name": "Symfony Community", 1968 | "homepage": "https://symfony.com/contributors" 1969 | } 1970 | ], 1971 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 1972 | "homepage": "https://symfony.com", 1973 | "keywords": [ 1974 | "compatibility", 1975 | "polyfill", 1976 | "portable", 1977 | "shim" 1978 | ], 1979 | "time": "2019-08-06T08:03:45+00:00" 1980 | }, 1981 | { 1982 | "name": "symfony/process", 1983 | "version": "v4.3.8", 1984 | "source": { 1985 | "type": "git", 1986 | "url": "https://github.com/symfony/process.git", 1987 | "reference": "3b2e0cb029afbb0395034509291f21191d1a4db0" 1988 | }, 1989 | "dist": { 1990 | "type": "zip", 1991 | "url": "https://api.github.com/repos/symfony/process/zipball/3b2e0cb029afbb0395034509291f21191d1a4db0", 1992 | "reference": "3b2e0cb029afbb0395034509291f21191d1a4db0", 1993 | "shasum": "" 1994 | }, 1995 | "require": { 1996 | "php": "^7.1.3" 1997 | }, 1998 | "type": "library", 1999 | "extra": { 2000 | "branch-alias": { 2001 | "dev-master": "4.3-dev" 2002 | } 2003 | }, 2004 | "autoload": { 2005 | "psr-4": { 2006 | "Symfony\\Component\\Process\\": "" 2007 | }, 2008 | "exclude-from-classmap": [ 2009 | "/Tests/" 2010 | ] 2011 | }, 2012 | "notification-url": "https://packagist.org/downloads/", 2013 | "license": [ 2014 | "MIT" 2015 | ], 2016 | "authors": [ 2017 | { 2018 | "name": "Fabien Potencier", 2019 | "email": "fabien@symfony.com" 2020 | }, 2021 | { 2022 | "name": "Symfony Community", 2023 | "homepage": "https://symfony.com/contributors" 2024 | } 2025 | ], 2026 | "description": "Symfony Process Component", 2027 | "homepage": "https://symfony.com", 2028 | "time": "2019-10-28T17:07:32+00:00" 2029 | }, 2030 | { 2031 | "name": "symfony/service-contracts", 2032 | "version": "v1.1.8", 2033 | "source": { 2034 | "type": "git", 2035 | "url": "https://github.com/symfony/service-contracts.git", 2036 | "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf" 2037 | }, 2038 | "dist": { 2039 | "type": "zip", 2040 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf", 2041 | "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf", 2042 | "shasum": "" 2043 | }, 2044 | "require": { 2045 | "php": "^7.1.3", 2046 | "psr/container": "^1.0" 2047 | }, 2048 | "suggest": { 2049 | "symfony/service-implementation": "" 2050 | }, 2051 | "type": "library", 2052 | "extra": { 2053 | "branch-alias": { 2054 | "dev-master": "1.1-dev" 2055 | } 2056 | }, 2057 | "autoload": { 2058 | "psr-4": { 2059 | "Symfony\\Contracts\\Service\\": "" 2060 | } 2061 | }, 2062 | "notification-url": "https://packagist.org/downloads/", 2063 | "license": [ 2064 | "MIT" 2065 | ], 2066 | "authors": [ 2067 | { 2068 | "name": "Nicolas Grekas", 2069 | "email": "p@tchwork.com" 2070 | }, 2071 | { 2072 | "name": "Symfony Community", 2073 | "homepage": "https://symfony.com/contributors" 2074 | } 2075 | ], 2076 | "description": "Generic abstractions related to writing services", 2077 | "homepage": "https://symfony.com", 2078 | "keywords": [ 2079 | "abstractions", 2080 | "contracts", 2081 | "decoupling", 2082 | "interfaces", 2083 | "interoperability", 2084 | "standards" 2085 | ], 2086 | "time": "2019-10-14T12:27:06+00:00" 2087 | }, 2088 | { 2089 | "name": "symfony/yaml", 2090 | "version": "v4.3.8", 2091 | "source": { 2092 | "type": "git", 2093 | "url": "https://github.com/symfony/yaml.git", 2094 | "reference": "324cf4b19c345465fad14f3602050519e09e361d" 2095 | }, 2096 | "dist": { 2097 | "type": "zip", 2098 | "url": "https://api.github.com/repos/symfony/yaml/zipball/324cf4b19c345465fad14f3602050519e09e361d", 2099 | "reference": "324cf4b19c345465fad14f3602050519e09e361d", 2100 | "shasum": "" 2101 | }, 2102 | "require": { 2103 | "php": "^7.1.3", 2104 | "symfony/polyfill-ctype": "~1.8" 2105 | }, 2106 | "conflict": { 2107 | "symfony/console": "<3.4" 2108 | }, 2109 | "require-dev": { 2110 | "symfony/console": "~3.4|~4.0" 2111 | }, 2112 | "suggest": { 2113 | "symfony/console": "For validating YAML files using the lint command" 2114 | }, 2115 | "type": "library", 2116 | "extra": { 2117 | "branch-alias": { 2118 | "dev-master": "4.3-dev" 2119 | } 2120 | }, 2121 | "autoload": { 2122 | "psr-4": { 2123 | "Symfony\\Component\\Yaml\\": "" 2124 | }, 2125 | "exclude-from-classmap": [ 2126 | "/Tests/" 2127 | ] 2128 | }, 2129 | "notification-url": "https://packagist.org/downloads/", 2130 | "license": [ 2131 | "MIT" 2132 | ], 2133 | "authors": [ 2134 | { 2135 | "name": "Fabien Potencier", 2136 | "email": "fabien@symfony.com" 2137 | }, 2138 | { 2139 | "name": "Symfony Community", 2140 | "homepage": "https://symfony.com/contributors" 2141 | } 2142 | ], 2143 | "description": "Symfony Yaml Component", 2144 | "homepage": "https://symfony.com", 2145 | "time": "2019-10-30T12:58:49+00:00" 2146 | }, 2147 | { 2148 | "name": "theseer/tokenizer", 2149 | "version": "1.1.3", 2150 | "source": { 2151 | "type": "git", 2152 | "url": "https://github.com/theseer/tokenizer.git", 2153 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" 2154 | }, 2155 | "dist": { 2156 | "type": "zip", 2157 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 2158 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 2159 | "shasum": "" 2160 | }, 2161 | "require": { 2162 | "ext-dom": "*", 2163 | "ext-tokenizer": "*", 2164 | "ext-xmlwriter": "*", 2165 | "php": "^7.0" 2166 | }, 2167 | "type": "library", 2168 | "autoload": { 2169 | "classmap": [ 2170 | "src/" 2171 | ] 2172 | }, 2173 | "notification-url": "https://packagist.org/downloads/", 2174 | "license": [ 2175 | "BSD-3-Clause" 2176 | ], 2177 | "authors": [ 2178 | { 2179 | "name": "Arne Blankerts", 2180 | "email": "arne@blankerts.de", 2181 | "role": "Developer" 2182 | } 2183 | ], 2184 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2185 | "time": "2019-06-13T22:48:21+00:00" 2186 | }, 2187 | { 2188 | "name": "webmozart/assert", 2189 | "version": "1.5.0", 2190 | "source": { 2191 | "type": "git", 2192 | "url": "https://github.com/webmozart/assert.git", 2193 | "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4" 2194 | }, 2195 | "dist": { 2196 | "type": "zip", 2197 | "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4", 2198 | "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4", 2199 | "shasum": "" 2200 | }, 2201 | "require": { 2202 | "php": "^5.3.3 || ^7.0", 2203 | "symfony/polyfill-ctype": "^1.8" 2204 | }, 2205 | "require-dev": { 2206 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 2207 | }, 2208 | "type": "library", 2209 | "extra": { 2210 | "branch-alias": { 2211 | "dev-master": "1.3-dev" 2212 | } 2213 | }, 2214 | "autoload": { 2215 | "psr-4": { 2216 | "Webmozart\\Assert\\": "src/" 2217 | } 2218 | }, 2219 | "notification-url": "https://packagist.org/downloads/", 2220 | "license": [ 2221 | "MIT" 2222 | ], 2223 | "authors": [ 2224 | { 2225 | "name": "Bernhard Schussek", 2226 | "email": "bschussek@gmail.com" 2227 | } 2228 | ], 2229 | "description": "Assertions to validate method input/output with nice error messages.", 2230 | "keywords": [ 2231 | "assert", 2232 | "check", 2233 | "validate" 2234 | ], 2235 | "time": "2019-08-24T08:43:50+00:00" 2236 | } 2237 | ], 2238 | "packages-dev": [ 2239 | { 2240 | "name": "composer/ca-bundle", 2241 | "version": "1.2.4", 2242 | "source": { 2243 | "type": "git", 2244 | "url": "https://github.com/composer/ca-bundle.git", 2245 | "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527" 2246 | }, 2247 | "dist": { 2248 | "type": "zip", 2249 | "url": "https://api.github.com/repos/composer/ca-bundle/zipball/10bb96592168a0f8e8f6dcde3532d9fa50b0b527", 2250 | "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527", 2251 | "shasum": "" 2252 | }, 2253 | "require": { 2254 | "ext-openssl": "*", 2255 | "ext-pcre": "*", 2256 | "php": "^5.3.2 || ^7.0 || ^8.0" 2257 | }, 2258 | "require-dev": { 2259 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", 2260 | "psr/log": "^1.0", 2261 | "symfony/process": "^2.5 || ^3.0 || ^4.0" 2262 | }, 2263 | "type": "library", 2264 | "extra": { 2265 | "branch-alias": { 2266 | "dev-master": "1.x-dev" 2267 | } 2268 | }, 2269 | "autoload": { 2270 | "psr-4": { 2271 | "Composer\\CaBundle\\": "src" 2272 | } 2273 | }, 2274 | "notification-url": "https://packagist.org/downloads/", 2275 | "license": [ 2276 | "MIT" 2277 | ], 2278 | "authors": [ 2279 | { 2280 | "name": "Jordi Boggiano", 2281 | "email": "j.boggiano@seld.be", 2282 | "homepage": "http://seld.be" 2283 | } 2284 | ], 2285 | "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", 2286 | "keywords": [ 2287 | "cabundle", 2288 | "cacert", 2289 | "certificate", 2290 | "ssl", 2291 | "tls" 2292 | ], 2293 | "time": "2019-08-30T08:44:50+00:00" 2294 | }, 2295 | { 2296 | "name": "composer/composer", 2297 | "version": "1.9.1", 2298 | "source": { 2299 | "type": "git", 2300 | "url": "https://github.com/composer/composer.git", 2301 | "reference": "bb01f2180df87ce7992b8331a68904f80439dd2f" 2302 | }, 2303 | "dist": { 2304 | "type": "zip", 2305 | "url": "https://api.github.com/repos/composer/composer/zipball/bb01f2180df87ce7992b8331a68904f80439dd2f", 2306 | "reference": "bb01f2180df87ce7992b8331a68904f80439dd2f", 2307 | "shasum": "" 2308 | }, 2309 | "require": { 2310 | "composer/ca-bundle": "^1.0", 2311 | "composer/semver": "^1.0", 2312 | "composer/spdx-licenses": "^1.2", 2313 | "composer/xdebug-handler": "^1.1", 2314 | "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", 2315 | "php": "^5.3.2 || ^7.0", 2316 | "psr/log": "^1.0", 2317 | "seld/jsonlint": "^1.4", 2318 | "seld/phar-utils": "^1.0", 2319 | "symfony/console": "^2.7 || ^3.0 || ^4.0", 2320 | "symfony/filesystem": "^2.7 || ^3.0 || ^4.0", 2321 | "symfony/finder": "^2.7 || ^3.0 || ^4.0", 2322 | "symfony/process": "^2.7 || ^3.0 || ^4.0" 2323 | }, 2324 | "conflict": { 2325 | "symfony/console": "2.8.38" 2326 | }, 2327 | "require-dev": { 2328 | "phpunit/phpunit": "^4.8.35 || ^5.7", 2329 | "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" 2330 | }, 2331 | "suggest": { 2332 | "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", 2333 | "ext-zip": "Enabling the zip extension allows you to unzip archives", 2334 | "ext-zlib": "Allow gzip compression of HTTP requests" 2335 | }, 2336 | "bin": [ 2337 | "bin/composer" 2338 | ], 2339 | "type": "library", 2340 | "extra": { 2341 | "branch-alias": { 2342 | "dev-master": "1.9-dev" 2343 | } 2344 | }, 2345 | "autoload": { 2346 | "psr-4": { 2347 | "Composer\\": "src/Composer" 2348 | } 2349 | }, 2350 | "notification-url": "https://packagist.org/downloads/", 2351 | "license": [ 2352 | "MIT" 2353 | ], 2354 | "authors": [ 2355 | { 2356 | "name": "Nils Adermann", 2357 | "email": "naderman@naderman.de", 2358 | "homepage": "http://www.naderman.de" 2359 | }, 2360 | { 2361 | "name": "Jordi Boggiano", 2362 | "email": "j.boggiano@seld.be", 2363 | "homepage": "http://seld.be" 2364 | } 2365 | ], 2366 | "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", 2367 | "homepage": "https://getcomposer.org/", 2368 | "keywords": [ 2369 | "autoload", 2370 | "dependency", 2371 | "package" 2372 | ], 2373 | "time": "2019-11-01T16:20:17+00:00" 2374 | }, 2375 | { 2376 | "name": "composer/semver", 2377 | "version": "1.5.0", 2378 | "source": { 2379 | "type": "git", 2380 | "url": "https://github.com/composer/semver.git", 2381 | "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e" 2382 | }, 2383 | "dist": { 2384 | "type": "zip", 2385 | "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e", 2386 | "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e", 2387 | "shasum": "" 2388 | }, 2389 | "require": { 2390 | "php": "^5.3.2 || ^7.0" 2391 | }, 2392 | "require-dev": { 2393 | "phpunit/phpunit": "^4.5 || ^5.0.5", 2394 | "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" 2395 | }, 2396 | "type": "library", 2397 | "extra": { 2398 | "branch-alias": { 2399 | "dev-master": "1.x-dev" 2400 | } 2401 | }, 2402 | "autoload": { 2403 | "psr-4": { 2404 | "Composer\\Semver\\": "src" 2405 | } 2406 | }, 2407 | "notification-url": "https://packagist.org/downloads/", 2408 | "license": [ 2409 | "MIT" 2410 | ], 2411 | "authors": [ 2412 | { 2413 | "name": "Nils Adermann", 2414 | "email": "naderman@naderman.de", 2415 | "homepage": "http://www.naderman.de" 2416 | }, 2417 | { 2418 | "name": "Jordi Boggiano", 2419 | "email": "j.boggiano@seld.be", 2420 | "homepage": "http://seld.be" 2421 | }, 2422 | { 2423 | "name": "Rob Bast", 2424 | "email": "rob.bast@gmail.com", 2425 | "homepage": "http://robbast.nl" 2426 | } 2427 | ], 2428 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 2429 | "keywords": [ 2430 | "semantic", 2431 | "semver", 2432 | "validation", 2433 | "versioning" 2434 | ], 2435 | "time": "2019-03-19T17:25:45+00:00" 2436 | }, 2437 | { 2438 | "name": "composer/spdx-licenses", 2439 | "version": "1.5.2", 2440 | "source": { 2441 | "type": "git", 2442 | "url": "https://github.com/composer/spdx-licenses.git", 2443 | "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5" 2444 | }, 2445 | "dist": { 2446 | "type": "zip", 2447 | "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/7ac1e6aec371357df067f8a688c3d6974df68fa5", 2448 | "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5", 2449 | "shasum": "" 2450 | }, 2451 | "require": { 2452 | "php": "^5.3.2 || ^7.0 || ^8.0" 2453 | }, 2454 | "require-dev": { 2455 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" 2456 | }, 2457 | "type": "library", 2458 | "extra": { 2459 | "branch-alias": { 2460 | "dev-master": "1.x-dev" 2461 | } 2462 | }, 2463 | "autoload": { 2464 | "psr-4": { 2465 | "Composer\\Spdx\\": "src" 2466 | } 2467 | }, 2468 | "notification-url": "https://packagist.org/downloads/", 2469 | "license": [ 2470 | "MIT" 2471 | ], 2472 | "authors": [ 2473 | { 2474 | "name": "Nils Adermann", 2475 | "email": "naderman@naderman.de", 2476 | "homepage": "http://www.naderman.de" 2477 | }, 2478 | { 2479 | "name": "Jordi Boggiano", 2480 | "email": "j.boggiano@seld.be", 2481 | "homepage": "http://seld.be" 2482 | }, 2483 | { 2484 | "name": "Rob Bast", 2485 | "email": "rob.bast@gmail.com", 2486 | "homepage": "http://robbast.nl" 2487 | } 2488 | ], 2489 | "description": "SPDX licenses list and validation library.", 2490 | "keywords": [ 2491 | "license", 2492 | "spdx", 2493 | "validator" 2494 | ], 2495 | "time": "2019-07-29T10:31:59+00:00" 2496 | }, 2497 | { 2498 | "name": "composer/xdebug-handler", 2499 | "version": "1.4.0", 2500 | "source": { 2501 | "type": "git", 2502 | "url": "https://github.com/composer/xdebug-handler.git", 2503 | "reference": "cbe23383749496fe0f373345208b79568e4bc248" 2504 | }, 2505 | "dist": { 2506 | "type": "zip", 2507 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", 2508 | "reference": "cbe23383749496fe0f373345208b79568e4bc248", 2509 | "shasum": "" 2510 | }, 2511 | "require": { 2512 | "php": "^5.3.2 || ^7.0 || ^8.0", 2513 | "psr/log": "^1.0" 2514 | }, 2515 | "require-dev": { 2516 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" 2517 | }, 2518 | "type": "library", 2519 | "autoload": { 2520 | "psr-4": { 2521 | "Composer\\XdebugHandler\\": "src" 2522 | } 2523 | }, 2524 | "notification-url": "https://packagist.org/downloads/", 2525 | "license": [ 2526 | "MIT" 2527 | ], 2528 | "authors": [ 2529 | { 2530 | "name": "John Stevenson", 2531 | "email": "john-stevenson@blueyonder.co.uk" 2532 | } 2533 | ], 2534 | "description": "Restarts a process without Xdebug.", 2535 | "keywords": [ 2536 | "Xdebug", 2537 | "performance" 2538 | ], 2539 | "time": "2019-11-06T16:40:04+00:00" 2540 | }, 2541 | { 2542 | "name": "justinrainbow/json-schema", 2543 | "version": "5.2.9", 2544 | "source": { 2545 | "type": "git", 2546 | "url": "https://github.com/justinrainbow/json-schema.git", 2547 | "reference": "44c6787311242a979fa15c704327c20e7221a0e4" 2548 | }, 2549 | "dist": { 2550 | "type": "zip", 2551 | "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4", 2552 | "reference": "44c6787311242a979fa15c704327c20e7221a0e4", 2553 | "shasum": "" 2554 | }, 2555 | "require": { 2556 | "php": ">=5.3.3" 2557 | }, 2558 | "require-dev": { 2559 | "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", 2560 | "json-schema/json-schema-test-suite": "1.2.0", 2561 | "phpunit/phpunit": "^4.8.35" 2562 | }, 2563 | "bin": [ 2564 | "bin/validate-json" 2565 | ], 2566 | "type": "library", 2567 | "extra": { 2568 | "branch-alias": { 2569 | "dev-master": "5.0.x-dev" 2570 | } 2571 | }, 2572 | "autoload": { 2573 | "psr-4": { 2574 | "JsonSchema\\": "src/JsonSchema/" 2575 | } 2576 | }, 2577 | "notification-url": "https://packagist.org/downloads/", 2578 | "license": [ 2579 | "MIT" 2580 | ], 2581 | "authors": [ 2582 | { 2583 | "name": "Bruno Prieto Reis", 2584 | "email": "bruno.p.reis@gmail.com" 2585 | }, 2586 | { 2587 | "name": "Justin Rainbow", 2588 | "email": "justin.rainbow@gmail.com" 2589 | }, 2590 | { 2591 | "name": "Igor Wiedler", 2592 | "email": "igor@wiedler.ch" 2593 | }, 2594 | { 2595 | "name": "Robert Schönthal", 2596 | "email": "seroscho@googlemail.com" 2597 | } 2598 | ], 2599 | "description": "A library to validate a json schema.", 2600 | "homepage": "https://github.com/justinrainbow/json-schema", 2601 | "keywords": [ 2602 | "json", 2603 | "schema" 2604 | ], 2605 | "time": "2019-09-25T14:49:45+00:00" 2606 | }, 2607 | { 2608 | "name": "psr/log", 2609 | "version": "1.1.2", 2610 | "source": { 2611 | "type": "git", 2612 | "url": "https://github.com/php-fig/log.git", 2613 | "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" 2614 | }, 2615 | "dist": { 2616 | "type": "zip", 2617 | "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", 2618 | "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", 2619 | "shasum": "" 2620 | }, 2621 | "require": { 2622 | "php": ">=5.3.0" 2623 | }, 2624 | "type": "library", 2625 | "extra": { 2626 | "branch-alias": { 2627 | "dev-master": "1.1.x-dev" 2628 | } 2629 | }, 2630 | "autoload": { 2631 | "psr-4": { 2632 | "Psr\\Log\\": "Psr/Log/" 2633 | } 2634 | }, 2635 | "notification-url": "https://packagist.org/downloads/", 2636 | "license": [ 2637 | "MIT" 2638 | ], 2639 | "authors": [ 2640 | { 2641 | "name": "PHP-FIG", 2642 | "homepage": "http://www.php-fig.org/" 2643 | } 2644 | ], 2645 | "description": "Common interface for logging libraries", 2646 | "homepage": "https://github.com/php-fig/log", 2647 | "keywords": [ 2648 | "log", 2649 | "psr", 2650 | "psr-3" 2651 | ], 2652 | "time": "2019-11-01T11:05:21+00:00" 2653 | }, 2654 | { 2655 | "name": "seld/jsonlint", 2656 | "version": "1.7.2", 2657 | "source": { 2658 | "type": "git", 2659 | "url": "https://github.com/Seldaek/jsonlint.git", 2660 | "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" 2661 | }, 2662 | "dist": { 2663 | "type": "zip", 2664 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", 2665 | "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", 2666 | "shasum": "" 2667 | }, 2668 | "require": { 2669 | "php": "^5.3 || ^7.0" 2670 | }, 2671 | "require-dev": { 2672 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 2673 | }, 2674 | "bin": [ 2675 | "bin/jsonlint" 2676 | ], 2677 | "type": "library", 2678 | "autoload": { 2679 | "psr-4": { 2680 | "Seld\\JsonLint\\": "src/Seld/JsonLint/" 2681 | } 2682 | }, 2683 | "notification-url": "https://packagist.org/downloads/", 2684 | "license": [ 2685 | "MIT" 2686 | ], 2687 | "authors": [ 2688 | { 2689 | "name": "Jordi Boggiano", 2690 | "email": "j.boggiano@seld.be", 2691 | "homepage": "http://seld.be" 2692 | } 2693 | ], 2694 | "description": "JSON Linter", 2695 | "keywords": [ 2696 | "json", 2697 | "linter", 2698 | "parser", 2699 | "validator" 2700 | ], 2701 | "time": "2019-10-24T14:27:39+00:00" 2702 | }, 2703 | { 2704 | "name": "seld/phar-utils", 2705 | "version": "1.0.1", 2706 | "source": { 2707 | "type": "git", 2708 | "url": "https://github.com/Seldaek/phar-utils.git", 2709 | "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a" 2710 | }, 2711 | "dist": { 2712 | "type": "zip", 2713 | "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a", 2714 | "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a", 2715 | "shasum": "" 2716 | }, 2717 | "require": { 2718 | "php": ">=5.3" 2719 | }, 2720 | "type": "library", 2721 | "extra": { 2722 | "branch-alias": { 2723 | "dev-master": "1.x-dev" 2724 | } 2725 | }, 2726 | "autoload": { 2727 | "psr-4": { 2728 | "Seld\\PharUtils\\": "src/" 2729 | } 2730 | }, 2731 | "notification-url": "https://packagist.org/downloads/", 2732 | "license": [ 2733 | "MIT" 2734 | ], 2735 | "authors": [ 2736 | { 2737 | "name": "Jordi Boggiano", 2738 | "email": "j.boggiano@seld.be" 2739 | } 2740 | ], 2741 | "description": "PHAR file format utilities, for when PHP phars you up", 2742 | "keywords": [ 2743 | "phra" 2744 | ], 2745 | "time": "2015-10-13T18:44:15+00:00" 2746 | } 2747 | ], 2748 | "aliases": [], 2749 | "minimum-stability": "stable", 2750 | "stability-flags": [], 2751 | "prefer-stable": false, 2752 | "prefer-lowest": false, 2753 | "platform": { 2754 | "php": ">=7.1" 2755 | }, 2756 | "platform-dev": [] 2757 | } 2758 | -------------------------------------------------------------------------------- /config/phpmd.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | karriere.at custom ruleset for phpmd 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /phpspec-coverage.yml: -------------------------------------------------------------------------------- 1 | suites: 2 | main: 3 | namespace: Karriere\CodeQuality 4 | psr4_prefix: Karriere\CodeQuality 5 | src_path: src 6 | spec_prefix: tests\specs 7 | 8 | extensions: 9 | FriendsOfPhpSpec\PhpSpec\CodeCoverage\CodeCoverageExtension: 10 | format: 11 | - html 12 | - clover 13 | output: 14 | html: coverage 15 | clover: coverage.xml 16 | -------------------------------------------------------------------------------- /phpspec.yml: -------------------------------------------------------------------------------- 1 | suites: 2 | main: 3 | namespace: Karriere\CodeQuality 4 | psr4_prefix: Karriere\CodeQuality 5 | src_path: src 6 | spec_prefix: tests\specs 7 | -------------------------------------------------------------------------------- /src/CodeCoverage.php: -------------------------------------------------------------------------------- 1 | 'phpspec run --config phpspec-coverage.yml', 15 | 'jenkins' => 'phpspec run --config phpspec-coverage.yml --format=junit > junit.xml' 16 | ]; 17 | 18 | public static function run(Event $event) 19 | { 20 | $eventArguments = self::getComposerScriptArguments($event->getArguments()); 21 | 22 | $command = self::getArrayValueByEventArguments(self::$commands, $eventArguments, 'env'); 23 | 24 | $composerIO = $event->getIO(); 25 | $composerIO->write('Running ' . $command . ''); 26 | 27 | $process = new Process($command); 28 | $process->setTtyByArguments($eventArguments); 29 | $process->setProcessTimeoutByArguments($eventArguments); 30 | $process->run(); 31 | 32 | return $process->getExitCode(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/CodeStyleChecker.php: -------------------------------------------------------------------------------- 1 | 'phpcs src --standard=PSR12 --colors', 21 | 'jenkins' => 'phpcs src --standard=PSR12 --report=checkstyle --report-file=checkstyle.xml' 22 | ]; 23 | 24 | public static function run(Event $event) 25 | { 26 | $eventArguments = self::getComposerScriptArguments($event->getArguments()); 27 | 28 | $command = self::getArrayValueByEventArguments(self::$commands, $eventArguments, 'env'); 29 | 30 | $composerIO = $event->getIO(); 31 | $composerIO->write('Running ' . $command . ''); 32 | 33 | $process = new Process($command); 34 | $process->setTtyByArguments($eventArguments); 35 | $process->setProcessTimeoutByArguments($eventArguments); 36 | $process->run(); 37 | 38 | $composerIO->write($process->getOutput()); 39 | 40 | $exitCode = $process->getExitCode(); 41 | 42 | if ($exitCode === ComposerScriptInterface::EXIT_CODE_OK) { 43 | $composerIO->write('Finished without errors!'); 44 | } elseif (self::hasParameterOption(ComposerScriptInterface::FLAG_FAIL, $eventArguments)) { 45 | throw new \Exception('Failed with exit code ' . $exitCode . '.'); 46 | } 47 | 48 | return $exitCode; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/CodeStyleFixer.php: -------------------------------------------------------------------------------- 1 | getArguments()); 24 | 25 | $composerIO = $event->getIO(); 26 | $composerIO->write('Running ' . self::$command . ''); 27 | 28 | $process = new Process(self::$command); 29 | $process->setTtyByArguments($eventArguments); 30 | $process->setProcessTimeoutByArguments($eventArguments); 31 | $process->run(); 32 | 33 | $composerIO->write($process->getOutput()); 34 | 35 | // PHPCBF exit codes: 36 | // 0 = Nothing was fixed by PHPCBF. 37 | // 1 = PHPCBF fixed all fixable errors. 38 | // 2 = PHPCBF fixed some fixable errors, but others failed to fix. 39 | return $process->getExitCode(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/ComposerScriptInterface.php: -------------------------------------------------------------------------------- 1 | getArguments() 13 | * @return array 14 | */ 15 | public static function getComposerScriptArguments(array $arguments) 16 | { 17 | $keyValueArguments = array(); 18 | 19 | foreach ($arguments as $argument) { 20 | list($argKey, $argValue) = (strpos($argument, '=') !== false) ? explode('=', $argument) : [$argument, null]; 21 | $keyValueArguments[trim($argKey, '-')] = $argValue; 22 | } 23 | 24 | return $keyValueArguments; 25 | } 26 | 27 | /** 28 | * Gets a value from array, depending on event arguments. 29 | * If no match is found, the first item of $array is returned. 30 | * 31 | * @param array $array Array to be searched 32 | * @param array $eventArgs Event arguments from self::getComposerScriptArguments() 33 | * @param string $key Get value by a specific key. 34 | * @param bool $verbose Whether to print verbose information to console. 35 | * @return string Array value 36 | */ 37 | public static function getArrayValueByEventArguments(array $array, array $eventArgs, $key = '', $verbose = true) 38 | { 39 | if ($key === '') { 40 | $matching = array_intersect_key($array, $eventArgs); 41 | $arrayValue = (count($matching) > 0) ? reset($matching) : reset($array); 42 | } elseif (array_key_exists($key, $eventArgs) && array_key_exists($eventArgs[$key], $array)) { 43 | $arrayValue = $array[$eventArgs[$key]]; 44 | } elseif (array_key_exists($key, $eventArgs)) { 45 | $arrayValue = reset($array); 46 | 47 | if ($verbose) { 48 | $consoleOutput = new ConsoleOutput(); 49 | $consoleOutput->writeln( 50 | 'Value ' . 51 | $eventArgs[$key] . 52 | ' is not defined. Using ' . 53 | key($array) . '.' 54 | ); 55 | } 56 | } else { 57 | $arrayValue = reset($array); 58 | } 59 | 60 | return $arrayValue; 61 | } 62 | 63 | /** 64 | * Check if a parameter was supplied with command. 65 | * 66 | * @param string $parameter 67 | * @param array $eventArguments 68 | * @return bool 69 | */ 70 | public static function hasParameterOption($parameter, array $eventArguments) 71 | { 72 | return array_key_exists($parameter, $eventArguments); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/MessDetector.php: -------------------------------------------------------------------------------- 1 | 'phpmd src text ' . __DIR__ . '/../config/phpmd.xml', 15 | 'jenkins' => 'phpmd src xml ' . __DIR__ . '/../config/phpmd.xml --reportfile phpmd.xml' 16 | ]; 17 | 18 | public static function run(Event $event) 19 | { 20 | $eventArguments = self::getComposerScriptArguments($event->getArguments()); 21 | 22 | $command = self::getArrayValueByEventArguments(self::$commands, $eventArguments, 'env'); 23 | 24 | $composerIO = $event->getIO(); 25 | $composerIO->write('Running ' . $command . ''); 26 | 27 | $process = new Process($command); 28 | $process->setTtyByArguments($eventArguments); 29 | $process->setProcessTimeoutByArguments($eventArguments); 30 | $process->run(); 31 | 32 | return $process->getExitCode(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Process/Process.php: -------------------------------------------------------------------------------- 1 | setTty(false); 42 | } else { 43 | // We have to try, because enabling TTY on an environment without TTY support will throw an exception. 44 | // This can be changed to `Process::isTtySupported()` if we only support symfony/process v4.1 and upwards. 45 | try { 46 | $this->setTty(true); 47 | } catch (RuntimeException $e) { 48 | return false; 49 | } 50 | } 51 | 52 | return true; 53 | } 54 | 55 | /** 56 | * Check if the process was started with a 'ptimeout' flag, if not, use default 60s timeout 57 | * 58 | * @param array $eventArguments 59 | * @return bool 60 | */ 61 | public function setProcessTimeoutByArguments($eventArguments) 62 | { 63 | if (self::hasParameterOption(self::PROCESS_TIMEOUT, $eventArguments)) { 64 | $this->setTimeout($eventArguments[self::PROCESS_TIMEOUT]); 65 | } 66 | 67 | return true; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/SpecificationTest.php: -------------------------------------------------------------------------------- 1 | 'phpspec run', 20 | 'verbose' => 'phpspec run -v', 21 | 'v' => 'phpspec run -v' 22 | ]; 23 | 24 | public static function run(Event $event) 25 | { 26 | $eventArguments = self::getComposerScriptArguments($event->getArguments()); 27 | 28 | $command = self::getArrayValueByEventArguments(self::$commands, $eventArguments); 29 | 30 | $composerIO = $event->getIO(); 31 | $composerIO->write('Running ' . $command . ''); 32 | 33 | $process = new Process($command); 34 | $process->setTtyByArguments($eventArguments); 35 | $process->setProcessTimeoutByArguments($eventArguments); 36 | $process->run(); 37 | 38 | $composerIO->write($process->getOutput()); 39 | 40 | $exitCode = $process->getExitCode(); 41 | 42 | $fail = self::hasParameterOption(ComposerScriptInterface::FLAG_FAIL, $eventArguments); 43 | 44 | if ($exitCode !== ComposerScriptInterface::EXIT_CODE_OK && $fail) { 45 | throw new \Exception('Failed with exit code ' . $exitCode . '.'); 46 | } 47 | 48 | return $exitCode; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /tests/specs/CodeCoverageSpec.php: -------------------------------------------------------------------------------- 1 | shouldHaveType('Karriere\CodeQuality\CodeCoverage'); 13 | } 14 | 15 | function it_implements_the_correct_interface() 16 | { 17 | $this->shouldImplement('Karriere\CodeQuality\ComposerScriptInterface'); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tests/specs/CodeStyleCheckerSpec.php: -------------------------------------------------------------------------------- 1 | shouldHaveType('Karriere\CodeQuality\CodeStyleChecker'); 13 | } 14 | 15 | function it_implements_the_correct_interface() 16 | { 17 | $this->shouldImplement('Karriere\CodeQuality\ComposerScriptInterface'); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tests/specs/CodeStyleFixerSpec.php: -------------------------------------------------------------------------------- 1 | shouldHaveType('Karriere\CodeQuality\CodeStyleFixer'); 15 | } 16 | 17 | function it_implements_the_correct_interface() 18 | { 19 | $this->shouldImplement('Karriere\CodeQuality\ComposerScriptInterface'); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/specs/Console/ScriptArgumentsTraitSpec.php: -------------------------------------------------------------------------------- 1 | beAnInstanceOf('tests\specs\Karriere\CodeQuality\Console\ScriptArgumentsTraitStub'); 14 | } 15 | 16 | function it_returns_an_empty_array() 17 | { 18 | self::getComposerScriptArguments(array()) 19 | ->shouldReturn(array()); 20 | } 21 | 22 | function it_returns_a_key_value_array() 23 | { 24 | self::getComposerScriptArguments(array('--foo')) 25 | ->shouldReturn(array('foo' => null)); 26 | 27 | self::getComposerScriptArguments(array('--foo=bar')) 28 | ->shouldReturn(array('foo' => 'bar')); 29 | 30 | self::getComposerScriptArguments(array('--foo=bar foo')) 31 | ->shouldReturn(array('foo' => 'bar foo')); 32 | 33 | self::getComposerScriptArguments(array('--foo', '--bar')) 34 | ->shouldReturn(array('foo' => null, 'bar' => null)); 35 | 36 | self::getComposerScriptArguments(array('--foo=bar', '--bar=foo')) 37 | ->shouldReturn(array('foo' => 'bar', 'bar' => 'foo')); 38 | 39 | self::getComposerScriptArguments(array('--foo=bar', '--bar=foo')) 40 | ->shouldReturn(array('foo' => 'bar', 'bar' => 'foo')); 41 | } 42 | 43 | function it_returns_a_default_command() 44 | { 45 | self::getArrayValueByEventArguments( 46 | [ 47 | 'foo' => 'command foo', 48 | 'bar' => 'command bar' 49 | ], 50 | ['env' => 'novalidenv'], 51 | 'env', 52 | false 53 | )->shouldReturn('command foo'); 54 | 55 | self::getArrayValueByEventArguments( 56 | ['foo' => 'bar'], 57 | ['bar' => 'foo'], 58 | 'env', 59 | false 60 | )->shouldReturn('bar'); 61 | 62 | self::getArrayValueByEventArguments( 63 | ['foo' => 'bar'], 64 | [], 65 | 'env', 66 | false 67 | )->shouldReturn('bar'); 68 | 69 | self::getArrayValueByEventArguments( 70 | [ 71 | 'default' => 'command default', 72 | 'verbose' => 'command verbose' 73 | ], 74 | [], 75 | '', 76 | false 77 | )->shouldReturn('command default'); 78 | } 79 | 80 | function it_returns_a_command() 81 | { 82 | self::getArrayValueByEventArguments( 83 | [ 84 | 'foo' => 'command foo', 85 | 'bar' => 'command bar' 86 | ], 87 | ['env' => 'foo'], 88 | 'env' 89 | )->shouldReturn('command foo'); 90 | 91 | self::getArrayValueByEventArguments( 92 | [ 93 | 'foo' => 'command foo', 94 | 'bar' => 'command bar' 95 | ], 96 | ['env' => 'bar'], 97 | 'env' 98 | )->shouldReturn('command bar'); 99 | 100 | self::getArrayValueByEventArguments( 101 | [ 102 | 'foo' => 'command foo', 103 | 'bar' => 'command bar' 104 | ], 105 | [ 106 | 'env' => 'bar', 107 | 'foo' => 'bar' 108 | ], 109 | 'env' 110 | )->shouldReturn('command bar'); 111 | 112 | self::getArrayValueByEventArguments( 113 | [ 114 | 'default' => 'command default', 115 | 'verbose' => 'command verbose' 116 | ], 117 | ['verbose' => null] 118 | )->shouldReturn('command verbose'); 119 | } 120 | 121 | function it_returns_if_argument_exists() 122 | { 123 | self::hasParameterOption('foo', array('foo' => null)) 124 | ->shouldReturn(true); 125 | 126 | self::hasParameterOption('foo', array('bar' => null)) 127 | ->shouldReturn(false); 128 | 129 | self::hasParameterOption('foo', array('foo' => 'bar')) 130 | ->shouldReturn(true); 131 | 132 | self::hasParameterOption('foo', array('bar' => 'foo')) 133 | ->shouldReturn(false); 134 | 135 | self::hasParameterOption('foo', array('foo' => 'bar', 'bar' => 'foo')) 136 | ->shouldReturn(true); 137 | } 138 | } 139 | 140 | class ScriptArgumentsTraitStub 141 | { 142 | use ScriptArgumentsTrait; 143 | } 144 | -------------------------------------------------------------------------------- /tests/specs/MessDetectorSpec.php: -------------------------------------------------------------------------------- 1 | shouldHaveType('Karriere\CodeQuality\MessDetector'); 15 | } 16 | 17 | function it_implements_the_correct_interface() 18 | { 19 | $this->shouldImplement('Karriere\CodeQuality\ComposerScriptInterface'); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/specs/Process/ProcessSpec.php: -------------------------------------------------------------------------------- 1 | beConstructedWith('foo'); 14 | } 15 | 16 | function it_is_initializable() 17 | { 18 | $this->shouldHaveType('Karriere\CodeQuality\Process\Process'); 19 | } 20 | 21 | function it_extends_a_base_class() 22 | { 23 | $this->shouldBeAnInstanceOf('Symfony\Component\Process\Process'); 24 | } 25 | 26 | function its_tty_mode_can_be_set() 27 | { 28 | $this->setTtyByArguments(array(Process::NO_TTY_FLAG => null))->shouldReturn(true); 29 | $this->shouldNotBeTty(); 30 | 31 | // Since we have no TTY mode on Windows, we have to adapt our spec according to the current OS. 32 | if ('\\' === DIRECTORY_SEPARATOR) { 33 | // Windows platform 34 | $this->setTtyByArguments(array('foo' => 'bar'))->shouldReturn(false); 35 | $this->shouldNotBeTty(); 36 | } else { 37 | // We could test for Unix here, but Unix environments can have TTY or not. 38 | // Testing for `true` or `false` doesn't make sense, so we skip this test. 39 | } 40 | } 41 | 42 | function its_process_timeout_can_be_set() 43 | { 44 | $this->setProcessTimeoutByArguments(array(Process::PROCESS_TIMEOUT => 3600))->shouldReturn(true); 45 | 46 | $this->getTimeout()->shouldReturn((double) 3600); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tests/specs/SpecificationTestSpec.php: -------------------------------------------------------------------------------- 1 | shouldHaveType('Karriere\CodeQuality\SpecificationTest'); 13 | } 14 | 15 | function it_implements_the_correct_interface() 16 | { 17 | $this->shouldImplement('Karriere\CodeQuality\ComposerScriptInterface'); 18 | } 19 | } 20 | --------------------------------------------------------------------------------