├── .github └── workflows │ └── default.yml ├── .phplint.yml ├── CHANGELOG.md ├── Dockerfile ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── docker-compose.yml ├── phpspec.yml ├── phpstan.neon ├── resources ├── example.conf └── invalid.conf └── src ├── Configuration.php ├── Exception ├── LoaderException.php └── WriterException.php ├── Loader ├── AbstractLoader.php ├── FlysystemLoader.php ├── IniFileLoader.php ├── IniStringLoader.php └── LoaderInterface.php ├── Section ├── Base.php ├── EventListener.php ├── FcgiProgram.php ├── GenericSection.php ├── Group.php ├── Includes.php ├── InetHttpServer.php ├── Named.php ├── Program.php ├── RpcInterface.php ├── SectionData.php ├── SectionInterface.php ├── Supervisorctl.php ├── Supervisord.php └── UnixHttpServer.php ├── Util.php ├── Writer ├── AbstractWriter.php ├── FlysystemWriter.php ├── IniFileWriter.php └── WriterInterface.php └── functions.php /.github/workflows/default.yml: -------------------------------------------------------------------------------- 1 | name: Test Suite 2 | 3 | on: 4 | push: 5 | branches-ignore: 6 | - 'analysis-*' 7 | pull_request: 8 | branches-ignore: 9 | - 'analysis-*' 10 | 11 | jobs: 12 | test: 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | matrix: 17 | php: ['7.3', '7.4'] 18 | steps: 19 | - uses: actions/checkout@v2 20 | 21 | - name: Set up PHP 22 | uses: shivammathur/setup-php@v2 23 | with: 24 | php-version: ${{ matrix.php }} 25 | coverage: xdebug 26 | tools: composer 27 | 28 | - name: Install Supervisor 29 | run: | 30 | sudo apt-get install -y --no-install-recommends supervisor 31 | 32 | - name: Run CI Tests 33 | run: composer run ci 34 | -------------------------------------------------------------------------------- /.phplint.yml: -------------------------------------------------------------------------------- 1 | path: ./ 2 | jobs: 10 3 | cache: /tmp/phplint.cache 4 | extensions: 5 | - php 6 | exclude: 7 | - vendor 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 0.3.0 - 2020-07-04 4 | 5 | ### Added 6 | 7 | - Re-added `IniFileLoader` and `IniFileWriter` that have no Flysystem dependency. 8 | 9 | ### Changed 10 | 11 | - Minimum PHP version updated to 7.3 12 | - Methods now have typed parameters and return types 13 | - League/Flysystem is now a suggested, but not required, library. 14 | - Moved `Loader` interface to `Loader/LoaderInterface` 15 | - Moved `Writer` interface to `Writer/WriterInterface` 16 | - Moved `Section` interface to `Section/SectionInterface` 17 | - Loaders now inherit from a `Loader/AbstractLoader` class 18 | - Writers now inherit from a `Writer/AbstractWriter` class 19 | - Moved from Travis CI and Scrutinizer to GitHub Actions 20 | 21 | ## 0.2.0 - 2015-01-04 22 | 23 | ### Changed 24 | 25 | - Updated to use [indigophp/ini](https://github.com/indigophp/ini) 26 | - Renamed Parser to Loader 27 | - Renamed Filesystem Loader to IniFileLoader 28 | - Renamed Filesystem Writer to IniFileWriter 29 | - Renamed Text Loader to IniStringLoader 30 | - Moved everything under one namespace 31 | - Renamed exceptions according to their usage 32 | - Moved section mapping from loader to configuration 33 | 34 | 35 | ### Removed 36 | 37 | - Renderer 38 | - File Loader (Parser previously) 39 | - File Writer 40 | - Unused stubs 41 | 42 | 43 | ## 0.1.0 - 2014-01-04 44 | 45 | ### Added 46 | 47 | - Created split from the main repository 48 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:7.4-cli-alpine 2 | 3 | RUN apk add --no-cache zip git curl supervisor 4 | 5 | RUN docker-php-ext-install pcntl 6 | 7 | RUN apk add --no-cache --virtual .build-deps autoconf build-base \ 8 | && pecl install xdebug-2.8.1 \ 9 | && docker-php-ext-enable xdebug \ 10 | && apk del .build-deps 11 | 12 | RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer 13 | 14 | RUN mkdir /app 15 | WORKDIR /app 16 | 17 | CMD ["composer", "run", "ci"] 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Márk Sági-Kazár 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is furnished 8 | to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Supervisor Configuration 2 | 3 | [![Latest Version](https://img.shields.io/github/release/supervisorphp/configuration.svg?style=flat-square)](https://github.com/supervisorphp/configuration/releases) 4 | [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE) 5 | [![Total Downloads](https://img.shields.io/packagist/dt/supervisorphp/configuration.svg?style=flat-square)](https://packagist.org/packages/supervisorphp/configuration) 6 | [![Test Suite](https://github.com/supervisorphp/configuration/workflows/Test%20Suite/badge.svg?event=push)](https://github.com/supervisorphp/configuration/actions) 7 | 8 | **Manage Supervisor configuration in PHP.** 9 | 10 | 11 | ## Install 12 | 13 | Via Composer 14 | 15 | ```bash 16 | composer require supervisorphp/configuration 17 | ``` 18 | 19 | ## Usage 20 | 21 | Create a configuration using the builder. 22 | 23 | ```php 24 | $config = new \Supervisor\Configuration\Configuration; 25 | $renderer = new \Indigo\Ini\Renderer; 26 | 27 | $section = new \Supervisor\Configuration\Section\Supervisord(['identifier' => 'supervisor']); 28 | $config->addSection($section); 29 | 30 | $section = new \Supervisor\Configuration\Section\Program('test', ['command' => 'cat']); 31 | $config->addSection($section); 32 | 33 | echo $renderer->render($config->toArray()); 34 | ``` 35 | 36 | The following sections are available in this package: 37 | 38 | - _Supervisord_ 39 | - _Supervisorctl_ 40 | - _UnixHttpServer_ 41 | - _InetHttpServer_ 42 | - _Includes_** 43 | - _Group_* 44 | - _Program_* 45 | - _EventListener_* 46 | - _FcgiProgram_* 47 | 48 | 49 | *__Note:__ These sections has to be instantiated with a name and optionally a properties array: 50 | 51 | ```php 52 | $section = new \Supervisor\Configuration\Section\Program('test', ['command' => 'cat']); 53 | ``` 54 | 55 | **__Note:__ The keyword `include` is reserved in PHP, so the class name is `Includes`, but the section name is still `include`. 56 | 57 | 58 | ### Existing configuration 59 | 60 | You can parse your existing configuration, and use it as a `Configuration` object. 61 | 62 | ```php 63 | $loader = new \Supervisor\Configuration\Loader\IniFileLoader('/etc/supervisor/supervisord.conf'); 64 | $configuration = $loader->load(); 65 | ``` 66 | 67 | Available loaders: 68 | 69 | - `IniFileLoader` 70 | - `FlysystemLoader` (Using [league/flysystem](https://github.com/thephpleague/flysystem)) 71 | - `IniStringLoader` 72 | 73 | ### Writing configuration 74 | 75 | You can use `Writer`s to write configuration to various destinations. 76 | 77 | ```php 78 | $configuration = new \Supervisor\Configuration\Configuration; 79 | 80 | // Modify configuration... 81 | 82 | $writer = new \Supervisor\Configuration\Writer\IniFileWriter('/etc/supervisor/supervisord.conf'); 83 | $writer->write($configuration); 84 | ``` 85 | 86 | Available writers: 87 | 88 | - `IniFileWriter` 89 | - `FlysystemWriter` (Using [league/flysystem](https://github.com/thephpleague/flysystem)) 90 | 91 | 92 | You can find detailed info about properties for each section here: 93 | [http://supervisord.org/configuration.html](http://supervisord.org/configuration.html) 94 | 95 | 96 | ## Testing 97 | 98 | ```bash 99 | composer ci 100 | ``` 101 | 102 | 103 | ## Contributing 104 | 105 | Please see [CONTRIBUTING](CONTRIBUTING.md) for details. 106 | 107 | 108 | ## Credits 109 | 110 | - [Márk Sági-Kazár](https://github.com/sagikazarmark) 111 | - [All Contributors](https://github.com/supervisorphp/configuration/contributors) 112 | 113 | 114 | ## License 115 | 116 | The MIT License (MIT). Please see [License File](LICENSE) for more information. 117 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "supervisorphp/configuration", 3 | "description": "Manage Supervisor configuration in PHP", 4 | "license": "MIT", 5 | "keywords": ["supervisor", "configuration"], 6 | "homepage": "http://supervisorphp.com", 7 | "authors": [ 8 | { 9 | "name": "Márk Sági-Kazár", 10 | "email": "mark.sagikazar@gmail.com" 11 | }, 12 | { 13 | "name": "Buster Neece", 14 | "email": "buster@busterneece.com" 15 | } 16 | ], 17 | "require": { 18 | "php": ">=7.3", 19 | "indigophp/ini": "^0.2", 20 | "symfony/options-resolver": "^2.6|^3.0|^4.0|^5.0" 21 | }, 22 | "require-dev": { 23 | "league/flysystem": "^1.0", 24 | "overtrue/phplint": "^2.0", 25 | "phpspec/phpspec": "^6.2", 26 | "phpstan/phpstan": "^0.12.32", 27 | "phpstan/phpstan-strict-rules": "^0.12.2", 28 | "roave/security-advisories": "dev-master" 29 | }, 30 | "suggest": { 31 | "league/flysystem": "Allows reading and writing to many filesystems." 32 | }, 33 | "autoload": { 34 | "psr-4": { 35 | "Supervisor\\Configuration\\": "src/" 36 | }, 37 | "files": ["src/functions.php"] 38 | }, 39 | "autoload-dev": { 40 | "psr-4": { 41 | "spec\\Supervisor\\Configuration\\": "spec/" 42 | } 43 | }, 44 | "scripts": { 45 | "ci": [ 46 | "@composer install --prefer-dist --no-progress --no-suggest", 47 | "@phplint", 48 | "@phpstan", 49 | "@phpspec" 50 | ], 51 | "phplint": "phplint", 52 | "phpstan": "phpstan analyze", 53 | "phpspec": "phpspec run" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /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": "010469ff1c0ecf4100de1ce41994685f", 8 | "packages": [ 9 | { 10 | "name": "indigophp/ini", 11 | "version": "v0.2.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/indigophp/ini.git", 15 | "reference": "182167ee30280b8f875aac252d6c8334f4d9aec2" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/indigophp/ini/zipball/182167ee30280b8f875aac252d6c8334f4d9aec2", 20 | "reference": "182167ee30280b8f875aac252d6c8334f4d9aec2", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.4.5" 25 | }, 26 | "require-dev": { 27 | "coduo/phpspec-data-provider-extension": "^1.0", 28 | "henrikbjorn/phpspec-code-coverage": "^1.0", 29 | "phpspec/phpspec": "^2.4" 30 | }, 31 | "type": "library", 32 | "extra": { 33 | "branch-alias": { 34 | "dev-master": "0.3-dev" 35 | } 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "Indigo\\Ini\\": "src/" 40 | } 41 | }, 42 | "notification-url": "https://packagist.org/downloads/", 43 | "license": [ 44 | "MIT" 45 | ], 46 | "authors": [ 47 | { 48 | "name": "Márk Sági-Kazár", 49 | "email": "mark.sagikazar@gmail.com" 50 | } 51 | ], 52 | "description": "Provides better INI parsing and rendering", 53 | "homepage": "http://indigophp.com", 54 | "keywords": [ 55 | "ini", 56 | "parser", 57 | "renderer" 58 | ], 59 | "time": "2016-01-04T01:21:08+00:00" 60 | }, 61 | { 62 | "name": "symfony/deprecation-contracts", 63 | "version": "v2.1.2", 64 | "source": { 65 | "type": "git", 66 | "url": "https://github.com/symfony/deprecation-contracts.git", 67 | "reference": "dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337" 68 | }, 69 | "dist": { 70 | "type": "zip", 71 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337", 72 | "reference": "dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337", 73 | "shasum": "" 74 | }, 75 | "require": { 76 | "php": ">=7.1" 77 | }, 78 | "type": "library", 79 | "extra": { 80 | "branch-alias": { 81 | "dev-master": "2.1-dev" 82 | } 83 | }, 84 | "autoload": { 85 | "files": [ 86 | "function.php" 87 | ] 88 | }, 89 | "notification-url": "https://packagist.org/downloads/", 90 | "license": [ 91 | "MIT" 92 | ], 93 | "authors": [ 94 | { 95 | "name": "Nicolas Grekas", 96 | "email": "p@tchwork.com" 97 | }, 98 | { 99 | "name": "Symfony Community", 100 | "homepage": "https://symfony.com/contributors" 101 | } 102 | ], 103 | "description": "A generic function and convention to trigger deprecation notices", 104 | "homepage": "https://symfony.com", 105 | "funding": [ 106 | { 107 | "url": "https://symfony.com/sponsor", 108 | "type": "custom" 109 | }, 110 | { 111 | "url": "https://github.com/fabpot", 112 | "type": "github" 113 | }, 114 | { 115 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 116 | "type": "tidelift" 117 | } 118 | ], 119 | "time": "2020-05-27T08:34:37+00:00" 120 | }, 121 | { 122 | "name": "symfony/options-resolver", 123 | "version": "v5.1.2", 124 | "source": { 125 | "type": "git", 126 | "url": "https://github.com/symfony/options-resolver.git", 127 | "reference": "663f5dd5e14057d1954fe721f9709d35837f2447" 128 | }, 129 | "dist": { 130 | "type": "zip", 131 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/663f5dd5e14057d1954fe721f9709d35837f2447", 132 | "reference": "663f5dd5e14057d1954fe721f9709d35837f2447", 133 | "shasum": "" 134 | }, 135 | "require": { 136 | "php": ">=7.2.5", 137 | "symfony/deprecation-contracts": "^2.1", 138 | "symfony/polyfill-php80": "^1.15" 139 | }, 140 | "type": "library", 141 | "extra": { 142 | "branch-alias": { 143 | "dev-master": "5.1-dev" 144 | } 145 | }, 146 | "autoload": { 147 | "psr-4": { 148 | "Symfony\\Component\\OptionsResolver\\": "" 149 | }, 150 | "exclude-from-classmap": [ 151 | "/Tests/" 152 | ] 153 | }, 154 | "notification-url": "https://packagist.org/downloads/", 155 | "license": [ 156 | "MIT" 157 | ], 158 | "authors": [ 159 | { 160 | "name": "Fabien Potencier", 161 | "email": "fabien@symfony.com" 162 | }, 163 | { 164 | "name": "Symfony Community", 165 | "homepage": "https://symfony.com/contributors" 166 | } 167 | ], 168 | "description": "Symfony OptionsResolver Component", 169 | "homepage": "https://symfony.com", 170 | "keywords": [ 171 | "config", 172 | "configuration", 173 | "options" 174 | ], 175 | "funding": [ 176 | { 177 | "url": "https://symfony.com/sponsor", 178 | "type": "custom" 179 | }, 180 | { 181 | "url": "https://github.com/fabpot", 182 | "type": "github" 183 | }, 184 | { 185 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 186 | "type": "tidelift" 187 | } 188 | ], 189 | "time": "2020-05-23T13:08:13+00:00" 190 | }, 191 | { 192 | "name": "symfony/polyfill-php80", 193 | "version": "v1.17.1", 194 | "source": { 195 | "type": "git", 196 | "url": "https://github.com/symfony/polyfill-php80.git", 197 | "reference": "4a5b6bba3259902e386eb80dd1956181ee90b5b2" 198 | }, 199 | "dist": { 200 | "type": "zip", 201 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4a5b6bba3259902e386eb80dd1956181ee90b5b2", 202 | "reference": "4a5b6bba3259902e386eb80dd1956181ee90b5b2", 203 | "shasum": "" 204 | }, 205 | "require": { 206 | "php": ">=7.0.8" 207 | }, 208 | "type": "library", 209 | "extra": { 210 | "branch-alias": { 211 | "dev-master": "1.17-dev" 212 | }, 213 | "thanks": { 214 | "name": "symfony/polyfill", 215 | "url": "https://github.com/symfony/polyfill" 216 | } 217 | }, 218 | "autoload": { 219 | "psr-4": { 220 | "Symfony\\Polyfill\\Php80\\": "" 221 | }, 222 | "files": [ 223 | "bootstrap.php" 224 | ], 225 | "classmap": [ 226 | "Resources/stubs" 227 | ] 228 | }, 229 | "notification-url": "https://packagist.org/downloads/", 230 | "license": [ 231 | "MIT" 232 | ], 233 | "authors": [ 234 | { 235 | "name": "Ion Bazan", 236 | "email": "ion.bazan@gmail.com" 237 | }, 238 | { 239 | "name": "Nicolas Grekas", 240 | "email": "p@tchwork.com" 241 | }, 242 | { 243 | "name": "Symfony Community", 244 | "homepage": "https://symfony.com/contributors" 245 | } 246 | ], 247 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 248 | "homepage": "https://symfony.com", 249 | "keywords": [ 250 | "compatibility", 251 | "polyfill", 252 | "portable", 253 | "shim" 254 | ], 255 | "funding": [ 256 | { 257 | "url": "https://symfony.com/sponsor", 258 | "type": "custom" 259 | }, 260 | { 261 | "url": "https://github.com/fabpot", 262 | "type": "github" 263 | }, 264 | { 265 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 266 | "type": "tidelift" 267 | } 268 | ], 269 | "time": "2020-06-06T08:46:27+00:00" 270 | } 271 | ], 272 | "packages-dev": [ 273 | { 274 | "name": "doctrine/instantiator", 275 | "version": "1.3.1", 276 | "source": { 277 | "type": "git", 278 | "url": "https://github.com/doctrine/instantiator.git", 279 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" 280 | }, 281 | "dist": { 282 | "type": "zip", 283 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", 284 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", 285 | "shasum": "" 286 | }, 287 | "require": { 288 | "php": "^7.1 || ^8.0" 289 | }, 290 | "require-dev": { 291 | "doctrine/coding-standard": "^6.0", 292 | "ext-pdo": "*", 293 | "ext-phar": "*", 294 | "phpbench/phpbench": "^0.13", 295 | "phpstan/phpstan-phpunit": "^0.11", 296 | "phpstan/phpstan-shim": "^0.11", 297 | "phpunit/phpunit": "^7.0" 298 | }, 299 | "type": "library", 300 | "extra": { 301 | "branch-alias": { 302 | "dev-master": "1.2.x-dev" 303 | } 304 | }, 305 | "autoload": { 306 | "psr-4": { 307 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 308 | } 309 | }, 310 | "notification-url": "https://packagist.org/downloads/", 311 | "license": [ 312 | "MIT" 313 | ], 314 | "authors": [ 315 | { 316 | "name": "Marco Pivetta", 317 | "email": "ocramius@gmail.com", 318 | "homepage": "http://ocramius.github.com/" 319 | } 320 | ], 321 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 322 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 323 | "keywords": [ 324 | "constructor", 325 | "instantiate" 326 | ], 327 | "funding": [ 328 | { 329 | "url": "https://www.doctrine-project.org/sponsorship.html", 330 | "type": "custom" 331 | }, 332 | { 333 | "url": "https://www.patreon.com/phpdoctrine", 334 | "type": "patreon" 335 | }, 336 | { 337 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 338 | "type": "tidelift" 339 | } 340 | ], 341 | "time": "2020-05-29T17:27:14+00:00" 342 | }, 343 | { 344 | "name": "league/flysystem", 345 | "version": "1.0.69", 346 | "source": { 347 | "type": "git", 348 | "url": "https://github.com/thephpleague/flysystem.git", 349 | "reference": "7106f78428a344bc4f643c233a94e48795f10967" 350 | }, 351 | "dist": { 352 | "type": "zip", 353 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7106f78428a344bc4f643c233a94e48795f10967", 354 | "reference": "7106f78428a344bc4f643c233a94e48795f10967", 355 | "shasum": "" 356 | }, 357 | "require": { 358 | "ext-fileinfo": "*", 359 | "php": ">=5.5.9" 360 | }, 361 | "conflict": { 362 | "league/flysystem-sftp": "<1.0.6" 363 | }, 364 | "require-dev": { 365 | "phpspec/phpspec": "^3.4", 366 | "phpunit/phpunit": "^5.7.26" 367 | }, 368 | "suggest": { 369 | "ext-fileinfo": "Required for MimeType", 370 | "ext-ftp": "Allows you to use FTP server storage", 371 | "ext-openssl": "Allows you to use FTPS server storage", 372 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 373 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 374 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 375 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 376 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 377 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 378 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 379 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 380 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", 381 | "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", 382 | "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" 383 | }, 384 | "type": "library", 385 | "extra": { 386 | "branch-alias": { 387 | "dev-master": "1.1-dev" 388 | } 389 | }, 390 | "autoload": { 391 | "psr-4": { 392 | "League\\Flysystem\\": "src/" 393 | } 394 | }, 395 | "notification-url": "https://packagist.org/downloads/", 396 | "license": [ 397 | "MIT" 398 | ], 399 | "authors": [ 400 | { 401 | "name": "Frank de Jonge", 402 | "email": "info@frenky.net" 403 | } 404 | ], 405 | "description": "Filesystem abstraction: Many filesystems, one API.", 406 | "keywords": [ 407 | "Cloud Files", 408 | "WebDAV", 409 | "abstraction", 410 | "aws", 411 | "cloud", 412 | "copy.com", 413 | "dropbox", 414 | "file systems", 415 | "files", 416 | "filesystem", 417 | "filesystems", 418 | "ftp", 419 | "rackspace", 420 | "remote", 421 | "s3", 422 | "sftp", 423 | "storage" 424 | ], 425 | "funding": [ 426 | { 427 | "url": "https://offset.earth/frankdejonge", 428 | "type": "other" 429 | } 430 | ], 431 | "time": "2020-05-18T15:13:39+00:00" 432 | }, 433 | { 434 | "name": "n98/junit-xml", 435 | "version": "1.0.0", 436 | "source": { 437 | "type": "git", 438 | "url": "https://github.com/cmuench/junit-xml.git", 439 | "reference": "7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46" 440 | }, 441 | "dist": { 442 | "type": "zip", 443 | "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46", 444 | "reference": "7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46", 445 | "shasum": "" 446 | }, 447 | "require-dev": { 448 | "phpunit/phpunit": "3.7.*" 449 | }, 450 | "type": "library", 451 | "autoload": { 452 | "psr-0": { 453 | "N98\\JUnitXml": "src/" 454 | } 455 | }, 456 | "notification-url": "https://packagist.org/downloads/", 457 | "license": [ 458 | "MIT" 459 | ], 460 | "authors": [ 461 | { 462 | "name": "Christian Münch", 463 | "email": "c.muench@netz98.de" 464 | } 465 | ], 466 | "description": "JUnit XML Document generation library", 467 | "time": "2013-11-23T13:11:26+00:00" 468 | }, 469 | { 470 | "name": "overtrue/phplint", 471 | "version": "2.0.2", 472 | "source": { 473 | "type": "git", 474 | "url": "https://github.com/overtrue/phplint.git", 475 | "reference": "8b1e27094c82ad861ff7728cf50d349500c39fe2" 476 | }, 477 | "dist": { 478 | "type": "zip", 479 | "url": "https://api.github.com/repos/overtrue/phplint/zipball/8b1e27094c82ad861ff7728cf50d349500c39fe2", 480 | "reference": "8b1e27094c82ad861ff7728cf50d349500c39fe2", 481 | "shasum": "" 482 | }, 483 | "require": { 484 | "ext-json": "*", 485 | "n98/junit-xml": "1.0.0", 486 | "php": ">=5.5.9", 487 | "symfony/console": "^3.2|^4.0|^5.0", 488 | "symfony/finder": "^3.0|^4.0|^5.0", 489 | "symfony/process": "^3.0|^4.0|^5.0", 490 | "symfony/yaml": "^3.0|^4.0|^5.0" 491 | }, 492 | "require-dev": { 493 | "brainmaestro/composer-git-hooks": "^2.7", 494 | "friendsofphp/php-cs-fixer": "^2.16", 495 | "jakub-onderka/php-console-highlighter": "^0.3.2 || ^0.4" 496 | }, 497 | "bin": [ 498 | "bin/phplint" 499 | ], 500 | "type": "library", 501 | "extra": { 502 | "hooks": { 503 | "pre-commit": [ 504 | "composer fix-style" 505 | ], 506 | "pre-push": [ 507 | "composer check-style" 508 | ] 509 | } 510 | }, 511 | "autoload": { 512 | "psr-4": { 513 | "Overtrue\\PHPLint\\": "src/" 514 | } 515 | }, 516 | "notification-url": "https://packagist.org/downloads/", 517 | "license": [ 518 | "MIT" 519 | ], 520 | "authors": [ 521 | { 522 | "name": "overtrue", 523 | "email": "anzhengchao@gmail.com" 524 | } 525 | ], 526 | "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.", 527 | "keywords": [ 528 | "check", 529 | "lint", 530 | "phplint", 531 | "syntax" 532 | ], 533 | "time": "2020-04-23T02:04:34+00:00" 534 | }, 535 | { 536 | "name": "phpdocumentor/reflection-common", 537 | "version": "2.2.0", 538 | "source": { 539 | "type": "git", 540 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 541 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 542 | }, 543 | "dist": { 544 | "type": "zip", 545 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 546 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 547 | "shasum": "" 548 | }, 549 | "require": { 550 | "php": "^7.2 || ^8.0" 551 | }, 552 | "type": "library", 553 | "extra": { 554 | "branch-alias": { 555 | "dev-2.x": "2.x-dev" 556 | } 557 | }, 558 | "autoload": { 559 | "psr-4": { 560 | "phpDocumentor\\Reflection\\": "src/" 561 | } 562 | }, 563 | "notification-url": "https://packagist.org/downloads/", 564 | "license": [ 565 | "MIT" 566 | ], 567 | "authors": [ 568 | { 569 | "name": "Jaap van Otterdijk", 570 | "email": "opensource@ijaap.nl" 571 | } 572 | ], 573 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 574 | "homepage": "http://www.phpdoc.org", 575 | "keywords": [ 576 | "FQSEN", 577 | "phpDocumentor", 578 | "phpdoc", 579 | "reflection", 580 | "static analysis" 581 | ], 582 | "time": "2020-06-27T09:03:43+00:00" 583 | }, 584 | { 585 | "name": "phpdocumentor/reflection-docblock", 586 | "version": "5.1.0", 587 | "source": { 588 | "type": "git", 589 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 590 | "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" 591 | }, 592 | "dist": { 593 | "type": "zip", 594 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", 595 | "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", 596 | "shasum": "" 597 | }, 598 | "require": { 599 | "ext-filter": "^7.1", 600 | "php": "^7.2", 601 | "phpdocumentor/reflection-common": "^2.0", 602 | "phpdocumentor/type-resolver": "^1.0", 603 | "webmozart/assert": "^1" 604 | }, 605 | "require-dev": { 606 | "doctrine/instantiator": "^1", 607 | "mockery/mockery": "^1" 608 | }, 609 | "type": "library", 610 | "extra": { 611 | "branch-alias": { 612 | "dev-master": "5.x-dev" 613 | } 614 | }, 615 | "autoload": { 616 | "psr-4": { 617 | "phpDocumentor\\Reflection\\": "src" 618 | } 619 | }, 620 | "notification-url": "https://packagist.org/downloads/", 621 | "license": [ 622 | "MIT" 623 | ], 624 | "authors": [ 625 | { 626 | "name": "Mike van Riel", 627 | "email": "me@mikevanriel.com" 628 | }, 629 | { 630 | "name": "Jaap van Otterdijk", 631 | "email": "account@ijaap.nl" 632 | } 633 | ], 634 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 635 | "time": "2020-02-22T12:28:44+00:00" 636 | }, 637 | { 638 | "name": "phpdocumentor/type-resolver", 639 | "version": "1.3.0", 640 | "source": { 641 | "type": "git", 642 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 643 | "reference": "e878a14a65245fbe78f8080eba03b47c3b705651" 644 | }, 645 | "dist": { 646 | "type": "zip", 647 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651", 648 | "reference": "e878a14a65245fbe78f8080eba03b47c3b705651", 649 | "shasum": "" 650 | }, 651 | "require": { 652 | "php": "^7.2 || ^8.0", 653 | "phpdocumentor/reflection-common": "^2.0" 654 | }, 655 | "require-dev": { 656 | "ext-tokenizer": "*" 657 | }, 658 | "type": "library", 659 | "extra": { 660 | "branch-alias": { 661 | "dev-1.x": "1.x-dev" 662 | } 663 | }, 664 | "autoload": { 665 | "psr-4": { 666 | "phpDocumentor\\Reflection\\": "src" 667 | } 668 | }, 669 | "notification-url": "https://packagist.org/downloads/", 670 | "license": [ 671 | "MIT" 672 | ], 673 | "authors": [ 674 | { 675 | "name": "Mike van Riel", 676 | "email": "me@mikevanriel.com" 677 | } 678 | ], 679 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 680 | "time": "2020-06-27T10:12:23+00:00" 681 | }, 682 | { 683 | "name": "phpspec/php-diff", 684 | "version": "v1.1.0", 685 | "source": { 686 | "type": "git", 687 | "url": "https://github.com/phpspec/php-diff.git", 688 | "reference": "0464787bfa7cd13576c5a1e318709768798bec6a" 689 | }, 690 | "dist": { 691 | "type": "zip", 692 | "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a", 693 | "reference": "0464787bfa7cd13576c5a1e318709768798bec6a", 694 | "shasum": "" 695 | }, 696 | "type": "library", 697 | "extra": { 698 | "branch-alias": { 699 | "dev-master": "1.0.x-dev" 700 | } 701 | }, 702 | "autoload": { 703 | "psr-0": { 704 | "Diff": "lib/" 705 | } 706 | }, 707 | "notification-url": "https://packagist.org/downloads/", 708 | "license": [ 709 | "BSD-3-Clause" 710 | ], 711 | "authors": [ 712 | { 713 | "name": "Chris Boulton", 714 | "homepage": "http://github.com/chrisboulton" 715 | } 716 | ], 717 | "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", 718 | "time": "2016-04-07T12:29:16+00:00" 719 | }, 720 | { 721 | "name": "phpspec/phpspec", 722 | "version": "6.2.0", 723 | "source": { 724 | "type": "git", 725 | "url": "https://github.com/phpspec/phpspec.git", 726 | "reference": "763c4e3abbf590ef8009effd295b71aed11dd595" 727 | }, 728 | "dist": { 729 | "type": "zip", 730 | "url": "https://api.github.com/repos/phpspec/phpspec/zipball/763c4e3abbf590ef8009effd295b71aed11dd595", 731 | "reference": "763c4e3abbf590ef8009effd295b71aed11dd595", 732 | "shasum": "" 733 | }, 734 | "require": { 735 | "doctrine/instantiator": "^1.0.5", 736 | "ext-tokenizer": "*", 737 | "php": "^7.2, <7.5", 738 | "phpspec/php-diff": "^1.0.0", 739 | "phpspec/prophecy": "^1.9", 740 | "sebastian/exporter": "^1.0 || ^2.0 || ^3.0 || ^4.0", 741 | "symfony/console": "^3.4 || ^4.0 || ^5.0", 742 | "symfony/event-dispatcher": "^3.4 || ^4.0 || ^5.0", 743 | "symfony/finder": "^3.4 || ^4.0 || ^5.0", 744 | "symfony/process": "^3.4 || ^4.0 || ^5.0", 745 | "symfony/yaml": "^3.4 || ^4.0 || ^5.0" 746 | }, 747 | "conflict": { 748 | "sebastian/comparator": "<1.2.4" 749 | }, 750 | "require-dev": { 751 | "behat/behat": "^3.3", 752 | "phpunit/phpunit": "^7.0", 753 | "symfony/filesystem": "^3.4 || ^4.0 || ^5.0" 754 | }, 755 | "suggest": { 756 | "phpspec/nyan-formatters": "Adds Nyan formatters" 757 | }, 758 | "bin": [ 759 | "bin/phpspec" 760 | ], 761 | "type": "library", 762 | "extra": { 763 | "branch-alias": { 764 | "dev-master": "6.2.x-dev" 765 | } 766 | }, 767 | "autoload": { 768 | "psr-0": { 769 | "PhpSpec": "src/" 770 | } 771 | }, 772 | "notification-url": "https://packagist.org/downloads/", 773 | "license": [ 774 | "MIT" 775 | ], 776 | "authors": [ 777 | { 778 | "name": "Konstantin Kudryashov", 779 | "email": "ever.zet@gmail.com", 780 | "homepage": "http://everzet.com" 781 | }, 782 | { 783 | "name": "Marcello Duarte", 784 | "homepage": "http://marcelloduarte.net/" 785 | }, 786 | { 787 | "name": "Ciaran McNulty", 788 | "homepage": "https://ciaranmcnulty.com/" 789 | } 790 | ], 791 | "description": "Specification-oriented BDD framework for PHP 7.1+", 792 | "homepage": "http://phpspec.net/", 793 | "keywords": [ 794 | "BDD", 795 | "SpecBDD", 796 | "TDD", 797 | "spec", 798 | "specification", 799 | "testing", 800 | "tests" 801 | ], 802 | "time": "2020-06-16T20:05:07+00:00" 803 | }, 804 | { 805 | "name": "phpspec/prophecy", 806 | "version": "v1.10.3", 807 | "source": { 808 | "type": "git", 809 | "url": "https://github.com/phpspec/prophecy.git", 810 | "reference": "451c3cd1418cf640de218914901e51b064abb093" 811 | }, 812 | "dist": { 813 | "type": "zip", 814 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", 815 | "reference": "451c3cd1418cf640de218914901e51b064abb093", 816 | "shasum": "" 817 | }, 818 | "require": { 819 | "doctrine/instantiator": "^1.0.2", 820 | "php": "^5.3|^7.0", 821 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", 822 | "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", 823 | "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" 824 | }, 825 | "require-dev": { 826 | "phpspec/phpspec": "^2.5 || ^3.2", 827 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 828 | }, 829 | "type": "library", 830 | "extra": { 831 | "branch-alias": { 832 | "dev-master": "1.10.x-dev" 833 | } 834 | }, 835 | "autoload": { 836 | "psr-4": { 837 | "Prophecy\\": "src/Prophecy" 838 | } 839 | }, 840 | "notification-url": "https://packagist.org/downloads/", 841 | "license": [ 842 | "MIT" 843 | ], 844 | "authors": [ 845 | { 846 | "name": "Konstantin Kudryashov", 847 | "email": "ever.zet@gmail.com", 848 | "homepage": "http://everzet.com" 849 | }, 850 | { 851 | "name": "Marcello Duarte", 852 | "email": "marcello.duarte@gmail.com" 853 | } 854 | ], 855 | "description": "Highly opinionated mocking framework for PHP 5.3+", 856 | "homepage": "https://github.com/phpspec/prophecy", 857 | "keywords": [ 858 | "Double", 859 | "Dummy", 860 | "fake", 861 | "mock", 862 | "spy", 863 | "stub" 864 | ], 865 | "time": "2020-03-05T15:02:03+00:00" 866 | }, 867 | { 868 | "name": "phpstan/phpstan", 869 | "version": "0.12.32", 870 | "source": { 871 | "type": "git", 872 | "url": "https://github.com/phpstan/phpstan.git", 873 | "reference": "d03863f504c8432b3de4d1881f73f6acb8c0e67c" 874 | }, 875 | "dist": { 876 | "type": "zip", 877 | "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d03863f504c8432b3de4d1881f73f6acb8c0e67c", 878 | "reference": "d03863f504c8432b3de4d1881f73f6acb8c0e67c", 879 | "shasum": "" 880 | }, 881 | "require": { 882 | "php": "^7.1" 883 | }, 884 | "conflict": { 885 | "phpstan/phpstan-shim": "*" 886 | }, 887 | "bin": [ 888 | "phpstan", 889 | "phpstan.phar" 890 | ], 891 | "type": "library", 892 | "extra": { 893 | "branch-alias": { 894 | "dev-master": "0.12-dev" 895 | } 896 | }, 897 | "autoload": { 898 | "files": [ 899 | "bootstrap.php" 900 | ] 901 | }, 902 | "notification-url": "https://packagist.org/downloads/", 903 | "license": [ 904 | "MIT" 905 | ], 906 | "description": "PHPStan - PHP Static Analysis Tool", 907 | "funding": [ 908 | { 909 | "url": "https://github.com/ondrejmirtes", 910 | "type": "github" 911 | }, 912 | { 913 | "url": "https://www.patreon.com/phpstan", 914 | "type": "patreon" 915 | }, 916 | { 917 | "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", 918 | "type": "tidelift" 919 | } 920 | ], 921 | "time": "2020-07-01T11:57:52+00:00" 922 | }, 923 | { 924 | "name": "phpstan/phpstan-strict-rules", 925 | "version": "0.12.2", 926 | "source": { 927 | "type": "git", 928 | "url": "https://github.com/phpstan/phpstan-strict-rules.git", 929 | "reference": "a670a59aff7cf96f75d21b974860ada10e25b2ee" 930 | }, 931 | "dist": { 932 | "type": "zip", 933 | "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/a670a59aff7cf96f75d21b974860ada10e25b2ee", 934 | "reference": "a670a59aff7cf96f75d21b974860ada10e25b2ee", 935 | "shasum": "" 936 | }, 937 | "require": { 938 | "php": "~7.1", 939 | "phpstan/phpstan": "^0.12.6" 940 | }, 941 | "require-dev": { 942 | "consistence/coding-standard": "^3.0.1", 943 | "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4", 944 | "ergebnis/composer-normalize": "^2.0.2", 945 | "jakub-onderka/php-parallel-lint": "^1.0", 946 | "phing/phing": "^2.16.0", 947 | "phpstan/phpstan-phpunit": "^0.12", 948 | "phpunit/phpunit": "^7.0", 949 | "slevomat/coding-standard": "^4.5.2" 950 | }, 951 | "type": "phpstan-extension", 952 | "extra": { 953 | "branch-alias": { 954 | "dev-master": "0.12-dev" 955 | }, 956 | "phpstan": { 957 | "includes": [ 958 | "rules.neon" 959 | ] 960 | } 961 | }, 962 | "autoload": { 963 | "psr-4": { 964 | "PHPStan\\": "src/" 965 | } 966 | }, 967 | "notification-url": "https://packagist.org/downloads/", 968 | "license": [ 969 | "MIT" 970 | ], 971 | "description": "Extra strict and opinionated rules for PHPStan", 972 | "time": "2020-01-20T13:08:52+00:00" 973 | }, 974 | { 975 | "name": "psr/container", 976 | "version": "1.0.0", 977 | "source": { 978 | "type": "git", 979 | "url": "https://github.com/php-fig/container.git", 980 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 981 | }, 982 | "dist": { 983 | "type": "zip", 984 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 985 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 986 | "shasum": "" 987 | }, 988 | "require": { 989 | "php": ">=5.3.0" 990 | }, 991 | "type": "library", 992 | "extra": { 993 | "branch-alias": { 994 | "dev-master": "1.0.x-dev" 995 | } 996 | }, 997 | "autoload": { 998 | "psr-4": { 999 | "Psr\\Container\\": "src/" 1000 | } 1001 | }, 1002 | "notification-url": "https://packagist.org/downloads/", 1003 | "license": [ 1004 | "MIT" 1005 | ], 1006 | "authors": [ 1007 | { 1008 | "name": "PHP-FIG", 1009 | "homepage": "http://www.php-fig.org/" 1010 | } 1011 | ], 1012 | "description": "Common Container Interface (PHP FIG PSR-11)", 1013 | "homepage": "https://github.com/php-fig/container", 1014 | "keywords": [ 1015 | "PSR-11", 1016 | "container", 1017 | "container-interface", 1018 | "container-interop", 1019 | "psr" 1020 | ], 1021 | "time": "2017-02-14T16:28:37+00:00" 1022 | }, 1023 | { 1024 | "name": "psr/event-dispatcher", 1025 | "version": "1.0.0", 1026 | "source": { 1027 | "type": "git", 1028 | "url": "https://github.com/php-fig/event-dispatcher.git", 1029 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" 1030 | }, 1031 | "dist": { 1032 | "type": "zip", 1033 | "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", 1034 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", 1035 | "shasum": "" 1036 | }, 1037 | "require": { 1038 | "php": ">=7.2.0" 1039 | }, 1040 | "type": "library", 1041 | "extra": { 1042 | "branch-alias": { 1043 | "dev-master": "1.0.x-dev" 1044 | } 1045 | }, 1046 | "autoload": { 1047 | "psr-4": { 1048 | "Psr\\EventDispatcher\\": "src/" 1049 | } 1050 | }, 1051 | "notification-url": "https://packagist.org/downloads/", 1052 | "license": [ 1053 | "MIT" 1054 | ], 1055 | "authors": [ 1056 | { 1057 | "name": "PHP-FIG", 1058 | "homepage": "http://www.php-fig.org/" 1059 | } 1060 | ], 1061 | "description": "Standard interfaces for event handling.", 1062 | "keywords": [ 1063 | "events", 1064 | "psr", 1065 | "psr-14" 1066 | ], 1067 | "time": "2019-01-08T18:20:26+00:00" 1068 | }, 1069 | { 1070 | "name": "roave/security-advisories", 1071 | "version": "dev-master", 1072 | "source": { 1073 | "type": "git", 1074 | "url": "https://github.com/Roave/SecurityAdvisories.git", 1075 | "reference": "57353ec1a34527a2dbbd3c0fb9418ffc008c6f60" 1076 | }, 1077 | "dist": { 1078 | "type": "zip", 1079 | "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/57353ec1a34527a2dbbd3c0fb9418ffc008c6f60", 1080 | "reference": "57353ec1a34527a2dbbd3c0fb9418ffc008c6f60", 1081 | "shasum": "" 1082 | }, 1083 | "conflict": { 1084 | "3f/pygmentize": "<1.2", 1085 | "adodb/adodb-php": "<5.20.12", 1086 | "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", 1087 | "amphp/artax": "<1.0.6|>=2,<2.0.6", 1088 | "amphp/http": "<1.0.1", 1089 | "amphp/http-client": ">=4,<4.4", 1090 | "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", 1091 | "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", 1092 | "aws/aws-sdk-php": ">=3,<3.2.1", 1093 | "bagisto/bagisto": "<0.1.5", 1094 | "barrelstrength/sprout-base-email": "<1.2.7", 1095 | "barrelstrength/sprout-forms": "<3.9", 1096 | "bolt/bolt": "<3.7.1", 1097 | "brightlocal/phpwhois": "<=4.2.5", 1098 | "buddypress/buddypress": "<5.1.2", 1099 | "bugsnag/bugsnag-laravel": ">=2,<2.0.2", 1100 | "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", 1101 | "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", 1102 | "cartalyst/sentry": "<=2.1.6", 1103 | "centreon/centreon": "<18.10.8|>=19,<19.4.5", 1104 | "cesnet/simplesamlphp-module-proxystatistics": "<3.1", 1105 | "codeigniter/framework": "<=3.0.6", 1106 | "composer/composer": "<=1-alpha.11", 1107 | "contao-components/mediaelement": ">=2.14.2,<2.21.1", 1108 | "contao/core": ">=2,<3.5.39", 1109 | "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", 1110 | "contao/listing-bundle": ">=4,<4.4.8", 1111 | "datadog/dd-trace": ">=0.30,<0.30.2", 1112 | "david-garcia/phpwhois": "<=4.3.1", 1113 | "doctrine/annotations": ">=1,<1.2.7", 1114 | "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", 1115 | "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", 1116 | "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", 1117 | "doctrine/doctrine-bundle": "<1.5.2", 1118 | "doctrine/doctrine-module": "<=0.7.1", 1119 | "doctrine/mongodb-odm": ">=1,<1.0.2", 1120 | "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", 1121 | "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", 1122 | "dolibarr/dolibarr": "<11.0.4", 1123 | "dompdf/dompdf": ">=0.6,<0.6.2", 1124 | "drupal/core": ">=7,<7.72|>=8,<8.8.8|>=8.9,<8.9.1|>=9,<9.0.1", 1125 | "drupal/drupal": ">=7,<7.72|>=8,<8.8.8|>=8.9,<8.9.1|>=9,<9.0.1", 1126 | "endroid/qr-code-bundle": "<3.4.2", 1127 | "enshrined/svg-sanitize": "<0.13.1", 1128 | "erusev/parsedown": "<1.7.2", 1129 | "ezsystems/demobundle": ">=5.4,<5.4.6.1", 1130 | "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", 1131 | "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", 1132 | "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", 1133 | "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", 1134 | "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2", 1135 | "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", 1136 | "ezsystems/ezplatform-user": ">=1,<1.0.1", 1137 | "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", 1138 | "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.1|>=2011,<2017.12.7.2|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.4.2", 1139 | "ezsystems/repository-forms": ">=2.3,<2.3.2.1", 1140 | "ezyang/htmlpurifier": "<4.1.1", 1141 | "firebase/php-jwt": "<2", 1142 | "fooman/tcpdf": "<6.2.22", 1143 | "fossar/tcpdf-parser": "<6.2.22", 1144 | "friendsofsymfony/oauth2-php": "<1.3", 1145 | "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", 1146 | "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", 1147 | "fuel/core": "<1.8.1", 1148 | "getgrav/grav": "<1.7-beta.8", 1149 | "gree/jose": "<=2.2", 1150 | "gregwar/rst": "<1.0.3", 1151 | "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", 1152 | "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", 1153 | "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", 1154 | "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", 1155 | "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", 1156 | "illuminate/view": ">=7,<7.1.2", 1157 | "ivankristianto/phpwhois": "<=4.3", 1158 | "james-heinrich/getid3": "<1.9.9", 1159 | "joomla/session": "<1.3.1", 1160 | "jsmitty12/phpwhois": "<5.1", 1161 | "kazist/phpwhois": "<=4.2.6", 1162 | "kreait/firebase-php": ">=3.2,<3.8.1", 1163 | "la-haute-societe/tcpdf": "<6.2.22", 1164 | "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30|>=7,<7.1.2", 1165 | "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", 1166 | "league/commonmark": "<0.18.3", 1167 | "librenms/librenms": "<1.53", 1168 | "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", 1169 | "magento/magento1ce": "<1.9.4.3", 1170 | "magento/magento1ee": ">=1,<1.14.4.3", 1171 | "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", 1172 | "monolog/monolog": ">=1.8,<1.12", 1173 | "namshi/jose": "<2.2", 1174 | "nystudio107/craft-seomatic": "<3.3", 1175 | "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", 1176 | "october/october": ">=1.0.319,<1.0.467", 1177 | "onelogin/php-saml": "<2.10.4", 1178 | "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", 1179 | "openid/php-openid": "<2.3", 1180 | "oro/crm": ">=1.7,<1.7.4", 1181 | "oro/platform": ">=1.7,<1.7.4", 1182 | "padraic/humbug_get_contents": "<1.1.2", 1183 | "pagarme/pagarme-php": ">=0,<3", 1184 | "paragonie/random_compat": "<2", 1185 | "paypal/merchant-sdk-php": "<3.12", 1186 | "pear/archive_tar": "<1.4.4", 1187 | "phpfastcache/phpfastcache": ">=5,<5.0.13", 1188 | "phpmailer/phpmailer": "<6.1.6", 1189 | "phpmussel/phpmussel": ">=1,<1.6", 1190 | "phpmyadmin/phpmyadmin": "<4.9.2", 1191 | "phpoffice/phpexcel": "<1.8.2", 1192 | "phpoffice/phpspreadsheet": "<1.8", 1193 | "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", 1194 | "phpwhois/phpwhois": "<=4.2.5", 1195 | "phpxmlrpc/extras": "<0.6.1", 1196 | "pimcore/pimcore": "<6.3", 1197 | "prestashop/autoupgrade": ">=4,<4.10.1", 1198 | "prestashop/gamification": "<2.3.2", 1199 | "prestashop/ps_facetedsearch": "<3.4.1", 1200 | "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", 1201 | "propel/propel": ">=2-alpha.1,<=2-alpha.7", 1202 | "propel/propel1": ">=1,<=1.7.1", 1203 | "pusher/pusher-php-server": "<2.2.1", 1204 | "rainlab/debugbar-plugin": "<3.1", 1205 | "robrichards/xmlseclibs": "<3.0.4", 1206 | "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", 1207 | "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", 1208 | "sensiolabs/connect": "<4.2.3", 1209 | "serluck/phpwhois": "<=4.2.6", 1210 | "shopware/shopware": "<5.3.7", 1211 | "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", 1212 | "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", 1213 | "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", 1214 | "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", 1215 | "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", 1216 | "silverstripe/framework": "<4.4.5|>=4.5,<4.5.2", 1217 | "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", 1218 | "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", 1219 | "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", 1220 | "silverstripe/subsites": ">=2,<2.1.1", 1221 | "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", 1222 | "silverstripe/userforms": "<3", 1223 | "simple-updates/phpwhois": "<=1", 1224 | "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", 1225 | "simplesamlphp/simplesamlphp": "<1.18.6", 1226 | "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", 1227 | "simplito/elliptic-php": "<1.0.6", 1228 | "slim/slim": "<2.6", 1229 | "smarty/smarty": "<3.1.33", 1230 | "socalnick/scn-social-auth": "<1.15.2", 1231 | "spoonity/tcpdf": "<6.2.22", 1232 | "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", 1233 | "ssddanbrown/bookstack": "<0.29.2", 1234 | "stormpath/sdk": ">=0,<9.9.99", 1235 | "studio-42/elfinder": "<2.1.49", 1236 | "swiftmailer/swiftmailer": ">=4,<5.4.5", 1237 | "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", 1238 | "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", 1239 | "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", 1240 | "sylius/resource-bundle": "<1.3.13|>=1.4,<1.4.6|>=1.5,<1.5.1|>=1.6,<1.6.3", 1241 | "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", 1242 | "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", 1243 | "symbiote/silverstripe-versionedfiles": "<=2.0.3", 1244 | "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", 1245 | "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 1246 | "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", 1247 | "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", 1248 | "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 1249 | "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", 1250 | "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", 1251 | "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", 1252 | "symfony/mime": ">=4.3,<4.3.8", 1253 | "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 1254 | "symfony/polyfill": ">=1,<1.10", 1255 | "symfony/polyfill-php55": ">=1,<1.10", 1256 | "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 1257 | "symfony/routing": ">=2,<2.0.19", 1258 | "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", 1259 | "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", 1260 | "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", 1261 | "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", 1262 | "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", 1263 | "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", 1264 | "symfony/serializer": ">=2,<2.0.11", 1265 | "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", 1266 | "symfony/translation": ">=2,<2.0.17", 1267 | "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", 1268 | "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", 1269 | "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", 1270 | "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", 1271 | "t3g/svg-sanitizer": "<1.0.3", 1272 | "tecnickcom/tcpdf": "<6.2.22", 1273 | "thelia/backoffice-default-template": ">=2.1,<2.1.2", 1274 | "thelia/thelia": ">=2.1-beta.1,<2.1.3", 1275 | "theonedemon/phpwhois": "<=4.2.5", 1276 | "titon/framework": ">=0,<9.9.99", 1277 | "truckersmp/phpwhois": "<=4.3.1", 1278 | "twig/twig": "<1.38|>=2,<2.7", 1279 | "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", 1280 | "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", 1281 | "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", 1282 | "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", 1283 | "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", 1284 | "ua-parser/uap-php": "<3.8", 1285 | "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", 1286 | "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", 1287 | "wallabag/tcpdf": "<6.2.22", 1288 | "willdurand/js-translation-bundle": "<2.1.1", 1289 | "yii2mod/yii2-cms": "<1.9.2", 1290 | "yiisoft/yii": ">=1.1.14,<1.1.15", 1291 | "yiisoft/yii2": "<2.0.15", 1292 | "yiisoft/yii2-bootstrap": "<2.0.4", 1293 | "yiisoft/yii2-dev": "<2.0.15", 1294 | "yiisoft/yii2-elasticsearch": "<2.0.5", 1295 | "yiisoft/yii2-gii": "<2.0.4", 1296 | "yiisoft/yii2-jui": "<2.0.4", 1297 | "yiisoft/yii2-redis": "<2.0.8", 1298 | "yourls/yourls": "<1.7.4", 1299 | "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", 1300 | "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", 1301 | "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", 1302 | "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", 1303 | "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", 1304 | "zendframework/zend-diactoros": ">=1,<1.8.4", 1305 | "zendframework/zend-feed": ">=1,<2.10.3", 1306 | "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", 1307 | "zendframework/zend-http": ">=1,<2.8.1", 1308 | "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", 1309 | "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", 1310 | "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", 1311 | "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", 1312 | "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", 1313 | "zendframework/zend-validator": ">=2.3,<2.3.6", 1314 | "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", 1315 | "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", 1316 | "zendframework/zendframework": "<2.5.1", 1317 | "zendframework/zendframework1": "<1.12.20", 1318 | "zendframework/zendopenid": ">=2,<2.0.2", 1319 | "zendframework/zendxml": ">=1,<1.0.1", 1320 | "zetacomponents/mail": "<1.8.2", 1321 | "zf-commons/zfc-user": "<1.2.2", 1322 | "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", 1323 | "zfr/zfr-oauth2-server-module": "<0.1.2" 1324 | }, 1325 | "type": "metapackage", 1326 | "notification-url": "https://packagist.org/downloads/", 1327 | "license": [ 1328 | "MIT" 1329 | ], 1330 | "authors": [ 1331 | { 1332 | "name": "Marco Pivetta", 1333 | "email": "ocramius@gmail.com", 1334 | "role": "maintainer" 1335 | }, 1336 | { 1337 | "name": "Ilya Tribusean", 1338 | "email": "slash3b@gmail.com", 1339 | "role": "maintainer" 1340 | } 1341 | ], 1342 | "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", 1343 | "funding": [ 1344 | { 1345 | "url": "https://github.com/Ocramius", 1346 | "type": "github" 1347 | }, 1348 | { 1349 | "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", 1350 | "type": "tidelift" 1351 | } 1352 | ], 1353 | "time": "2020-07-03T16:50:03+00:00" 1354 | }, 1355 | { 1356 | "name": "sebastian/comparator", 1357 | "version": "4.0.3", 1358 | "source": { 1359 | "type": "git", 1360 | "url": "https://github.com/sebastianbergmann/comparator.git", 1361 | "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f" 1362 | }, 1363 | "dist": { 1364 | "type": "zip", 1365 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f", 1366 | "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f", 1367 | "shasum": "" 1368 | }, 1369 | "require": { 1370 | "php": "^7.3 || ^8.0", 1371 | "sebastian/diff": "^4.0", 1372 | "sebastian/exporter": "^4.0" 1373 | }, 1374 | "require-dev": { 1375 | "phpunit/phpunit": "^9.0" 1376 | }, 1377 | "type": "library", 1378 | "extra": { 1379 | "branch-alias": { 1380 | "dev-master": "4.0-dev" 1381 | } 1382 | }, 1383 | "autoload": { 1384 | "classmap": [ 1385 | "src/" 1386 | ] 1387 | }, 1388 | "notification-url": "https://packagist.org/downloads/", 1389 | "license": [ 1390 | "BSD-3-Clause" 1391 | ], 1392 | "authors": [ 1393 | { 1394 | "name": "Sebastian Bergmann", 1395 | "email": "sebastian@phpunit.de" 1396 | }, 1397 | { 1398 | "name": "Jeff Welch", 1399 | "email": "whatthejeff@gmail.com" 1400 | }, 1401 | { 1402 | "name": "Volker Dusch", 1403 | "email": "github@wallbash.com" 1404 | }, 1405 | { 1406 | "name": "Bernhard Schussek", 1407 | "email": "bschussek@2bepublished.at" 1408 | } 1409 | ], 1410 | "description": "Provides the functionality to compare PHP values for equality", 1411 | "homepage": "https://github.com/sebastianbergmann/comparator", 1412 | "keywords": [ 1413 | "comparator", 1414 | "compare", 1415 | "equality" 1416 | ], 1417 | "funding": [ 1418 | { 1419 | "url": "https://github.com/sebastianbergmann", 1420 | "type": "github" 1421 | } 1422 | ], 1423 | "time": "2020-06-26T12:05:46+00:00" 1424 | }, 1425 | { 1426 | "name": "sebastian/diff", 1427 | "version": "4.0.2", 1428 | "source": { 1429 | "type": "git", 1430 | "url": "https://github.com/sebastianbergmann/diff.git", 1431 | "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113" 1432 | }, 1433 | "dist": { 1434 | "type": "zip", 1435 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113", 1436 | "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113", 1437 | "shasum": "" 1438 | }, 1439 | "require": { 1440 | "php": "^7.3 || ^8.0" 1441 | }, 1442 | "require-dev": { 1443 | "phpunit/phpunit": "^9.0", 1444 | "symfony/process": "^4.2 || ^5" 1445 | }, 1446 | "type": "library", 1447 | "extra": { 1448 | "branch-alias": { 1449 | "dev-master": "4.0-dev" 1450 | } 1451 | }, 1452 | "autoload": { 1453 | "classmap": [ 1454 | "src/" 1455 | ] 1456 | }, 1457 | "notification-url": "https://packagist.org/downloads/", 1458 | "license": [ 1459 | "BSD-3-Clause" 1460 | ], 1461 | "authors": [ 1462 | { 1463 | "name": "Sebastian Bergmann", 1464 | "email": "sebastian@phpunit.de" 1465 | }, 1466 | { 1467 | "name": "Kore Nordmann", 1468 | "email": "mail@kore-nordmann.de" 1469 | } 1470 | ], 1471 | "description": "Diff implementation", 1472 | "homepage": "https://github.com/sebastianbergmann/diff", 1473 | "keywords": [ 1474 | "diff", 1475 | "udiff", 1476 | "unidiff", 1477 | "unified diff" 1478 | ], 1479 | "funding": [ 1480 | { 1481 | "url": "https://github.com/sebastianbergmann", 1482 | "type": "github" 1483 | } 1484 | ], 1485 | "time": "2020-06-30T04:46:02+00:00" 1486 | }, 1487 | { 1488 | "name": "sebastian/exporter", 1489 | "version": "4.0.2", 1490 | "source": { 1491 | "type": "git", 1492 | "url": "https://github.com/sebastianbergmann/exporter.git", 1493 | "reference": "571d721db4aec847a0e59690b954af33ebf9f023" 1494 | }, 1495 | "dist": { 1496 | "type": "zip", 1497 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/571d721db4aec847a0e59690b954af33ebf9f023", 1498 | "reference": "571d721db4aec847a0e59690b954af33ebf9f023", 1499 | "shasum": "" 1500 | }, 1501 | "require": { 1502 | "php": "^7.3 || ^8.0", 1503 | "sebastian/recursion-context": "^4.0" 1504 | }, 1505 | "require-dev": { 1506 | "ext-mbstring": "*", 1507 | "phpunit/phpunit": "^9.2" 1508 | }, 1509 | "type": "library", 1510 | "extra": { 1511 | "branch-alias": { 1512 | "dev-master": "4.0-dev" 1513 | } 1514 | }, 1515 | "autoload": { 1516 | "classmap": [ 1517 | "src/" 1518 | ] 1519 | }, 1520 | "notification-url": "https://packagist.org/downloads/", 1521 | "license": [ 1522 | "BSD-3-Clause" 1523 | ], 1524 | "authors": [ 1525 | { 1526 | "name": "Sebastian Bergmann", 1527 | "email": "sebastian@phpunit.de" 1528 | }, 1529 | { 1530 | "name": "Jeff Welch", 1531 | "email": "whatthejeff@gmail.com" 1532 | }, 1533 | { 1534 | "name": "Volker Dusch", 1535 | "email": "github@wallbash.com" 1536 | }, 1537 | { 1538 | "name": "Adam Harvey", 1539 | "email": "aharvey@php.net" 1540 | }, 1541 | { 1542 | "name": "Bernhard Schussek", 1543 | "email": "bschussek@gmail.com" 1544 | } 1545 | ], 1546 | "description": "Provides the functionality to export PHP variables for visualization", 1547 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1548 | "keywords": [ 1549 | "export", 1550 | "exporter" 1551 | ], 1552 | "funding": [ 1553 | { 1554 | "url": "https://github.com/sebastianbergmann", 1555 | "type": "github" 1556 | } 1557 | ], 1558 | "time": "2020-06-26T12:08:55+00:00" 1559 | }, 1560 | { 1561 | "name": "sebastian/recursion-context", 1562 | "version": "4.0.2", 1563 | "source": { 1564 | "type": "git", 1565 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1566 | "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63" 1567 | }, 1568 | "dist": { 1569 | "type": "zip", 1570 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/062231bf61d2b9448c4fa5a7643b5e1829c11d63", 1571 | "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63", 1572 | "shasum": "" 1573 | }, 1574 | "require": { 1575 | "php": "^7.3 || ^8.0" 1576 | }, 1577 | "require-dev": { 1578 | "phpunit/phpunit": "^9.0" 1579 | }, 1580 | "type": "library", 1581 | "extra": { 1582 | "branch-alias": { 1583 | "dev-master": "4.0-dev" 1584 | } 1585 | }, 1586 | "autoload": { 1587 | "classmap": [ 1588 | "src/" 1589 | ] 1590 | }, 1591 | "notification-url": "https://packagist.org/downloads/", 1592 | "license": [ 1593 | "BSD-3-Clause" 1594 | ], 1595 | "authors": [ 1596 | { 1597 | "name": "Sebastian Bergmann", 1598 | "email": "sebastian@phpunit.de" 1599 | }, 1600 | { 1601 | "name": "Jeff Welch", 1602 | "email": "whatthejeff@gmail.com" 1603 | }, 1604 | { 1605 | "name": "Adam Harvey", 1606 | "email": "aharvey@php.net" 1607 | } 1608 | ], 1609 | "description": "Provides functionality to recursively process PHP variables", 1610 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1611 | "funding": [ 1612 | { 1613 | "url": "https://github.com/sebastianbergmann", 1614 | "type": "github" 1615 | } 1616 | ], 1617 | "time": "2020-06-26T12:14:17+00:00" 1618 | }, 1619 | { 1620 | "name": "symfony/console", 1621 | "version": "v5.1.2", 1622 | "source": { 1623 | "type": "git", 1624 | "url": "https://github.com/symfony/console.git", 1625 | "reference": "34ac555a3627e324b660e318daa07572e1140123" 1626 | }, 1627 | "dist": { 1628 | "type": "zip", 1629 | "url": "https://api.github.com/repos/symfony/console/zipball/34ac555a3627e324b660e318daa07572e1140123", 1630 | "reference": "34ac555a3627e324b660e318daa07572e1140123", 1631 | "shasum": "" 1632 | }, 1633 | "require": { 1634 | "php": ">=7.2.5", 1635 | "symfony/polyfill-mbstring": "~1.0", 1636 | "symfony/polyfill-php73": "^1.8", 1637 | "symfony/polyfill-php80": "^1.15", 1638 | "symfony/service-contracts": "^1.1|^2", 1639 | "symfony/string": "^5.1" 1640 | }, 1641 | "conflict": { 1642 | "symfony/dependency-injection": "<4.4", 1643 | "symfony/dotenv": "<5.1", 1644 | "symfony/event-dispatcher": "<4.4", 1645 | "symfony/lock": "<4.4", 1646 | "symfony/process": "<4.4" 1647 | }, 1648 | "provide": { 1649 | "psr/log-implementation": "1.0" 1650 | }, 1651 | "require-dev": { 1652 | "psr/log": "~1.0", 1653 | "symfony/config": "^4.4|^5.0", 1654 | "symfony/dependency-injection": "^4.4|^5.0", 1655 | "symfony/event-dispatcher": "^4.4|^5.0", 1656 | "symfony/lock": "^4.4|^5.0", 1657 | "symfony/process": "^4.4|^5.0", 1658 | "symfony/var-dumper": "^4.4|^5.0" 1659 | }, 1660 | "suggest": { 1661 | "psr/log": "For using the console logger", 1662 | "symfony/event-dispatcher": "", 1663 | "symfony/lock": "", 1664 | "symfony/process": "" 1665 | }, 1666 | "type": "library", 1667 | "extra": { 1668 | "branch-alias": { 1669 | "dev-master": "5.1-dev" 1670 | } 1671 | }, 1672 | "autoload": { 1673 | "psr-4": { 1674 | "Symfony\\Component\\Console\\": "" 1675 | }, 1676 | "exclude-from-classmap": [ 1677 | "/Tests/" 1678 | ] 1679 | }, 1680 | "notification-url": "https://packagist.org/downloads/", 1681 | "license": [ 1682 | "MIT" 1683 | ], 1684 | "authors": [ 1685 | { 1686 | "name": "Fabien Potencier", 1687 | "email": "fabien@symfony.com" 1688 | }, 1689 | { 1690 | "name": "Symfony Community", 1691 | "homepage": "https://symfony.com/contributors" 1692 | } 1693 | ], 1694 | "description": "Symfony Console Component", 1695 | "homepage": "https://symfony.com", 1696 | "funding": [ 1697 | { 1698 | "url": "https://symfony.com/sponsor", 1699 | "type": "custom" 1700 | }, 1701 | { 1702 | "url": "https://github.com/fabpot", 1703 | "type": "github" 1704 | }, 1705 | { 1706 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1707 | "type": "tidelift" 1708 | } 1709 | ], 1710 | "time": "2020-06-15T12:59:21+00:00" 1711 | }, 1712 | { 1713 | "name": "symfony/event-dispatcher", 1714 | "version": "v5.1.2", 1715 | "source": { 1716 | "type": "git", 1717 | "url": "https://github.com/symfony/event-dispatcher.git", 1718 | "reference": "cc0d059e2e997e79ca34125a52f3e33de4424ac7" 1719 | }, 1720 | "dist": { 1721 | "type": "zip", 1722 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cc0d059e2e997e79ca34125a52f3e33de4424ac7", 1723 | "reference": "cc0d059e2e997e79ca34125a52f3e33de4424ac7", 1724 | "shasum": "" 1725 | }, 1726 | "require": { 1727 | "php": ">=7.2.5", 1728 | "symfony/deprecation-contracts": "^2.1", 1729 | "symfony/event-dispatcher-contracts": "^2", 1730 | "symfony/polyfill-php80": "^1.15" 1731 | }, 1732 | "conflict": { 1733 | "symfony/dependency-injection": "<4.4" 1734 | }, 1735 | "provide": { 1736 | "psr/event-dispatcher-implementation": "1.0", 1737 | "symfony/event-dispatcher-implementation": "2.0" 1738 | }, 1739 | "require-dev": { 1740 | "psr/log": "~1.0", 1741 | "symfony/config": "^4.4|^5.0", 1742 | "symfony/dependency-injection": "^4.4|^5.0", 1743 | "symfony/expression-language": "^4.4|^5.0", 1744 | "symfony/http-foundation": "^4.4|^5.0", 1745 | "symfony/service-contracts": "^1.1|^2", 1746 | "symfony/stopwatch": "^4.4|^5.0" 1747 | }, 1748 | "suggest": { 1749 | "symfony/dependency-injection": "", 1750 | "symfony/http-kernel": "" 1751 | }, 1752 | "type": "library", 1753 | "extra": { 1754 | "branch-alias": { 1755 | "dev-master": "5.1-dev" 1756 | } 1757 | }, 1758 | "autoload": { 1759 | "psr-4": { 1760 | "Symfony\\Component\\EventDispatcher\\": "" 1761 | }, 1762 | "exclude-from-classmap": [ 1763 | "/Tests/" 1764 | ] 1765 | }, 1766 | "notification-url": "https://packagist.org/downloads/", 1767 | "license": [ 1768 | "MIT" 1769 | ], 1770 | "authors": [ 1771 | { 1772 | "name": "Fabien Potencier", 1773 | "email": "fabien@symfony.com" 1774 | }, 1775 | { 1776 | "name": "Symfony Community", 1777 | "homepage": "https://symfony.com/contributors" 1778 | } 1779 | ], 1780 | "description": "Symfony EventDispatcher Component", 1781 | "homepage": "https://symfony.com", 1782 | "funding": [ 1783 | { 1784 | "url": "https://symfony.com/sponsor", 1785 | "type": "custom" 1786 | }, 1787 | { 1788 | "url": "https://github.com/fabpot", 1789 | "type": "github" 1790 | }, 1791 | { 1792 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1793 | "type": "tidelift" 1794 | } 1795 | ], 1796 | "time": "2020-05-20T17:43:50+00:00" 1797 | }, 1798 | { 1799 | "name": "symfony/event-dispatcher-contracts", 1800 | "version": "v2.1.2", 1801 | "source": { 1802 | "type": "git", 1803 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 1804 | "reference": "405952c4e90941a17e52ef7489a2bd94870bb290" 1805 | }, 1806 | "dist": { 1807 | "type": "zip", 1808 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/405952c4e90941a17e52ef7489a2bd94870bb290", 1809 | "reference": "405952c4e90941a17e52ef7489a2bd94870bb290", 1810 | "shasum": "" 1811 | }, 1812 | "require": { 1813 | "php": ">=7.2.5", 1814 | "psr/event-dispatcher": "^1" 1815 | }, 1816 | "suggest": { 1817 | "symfony/event-dispatcher-implementation": "" 1818 | }, 1819 | "type": "library", 1820 | "extra": { 1821 | "branch-alias": { 1822 | "dev-master": "2.1-dev" 1823 | } 1824 | }, 1825 | "autoload": { 1826 | "psr-4": { 1827 | "Symfony\\Contracts\\EventDispatcher\\": "" 1828 | } 1829 | }, 1830 | "notification-url": "https://packagist.org/downloads/", 1831 | "license": [ 1832 | "MIT" 1833 | ], 1834 | "authors": [ 1835 | { 1836 | "name": "Nicolas Grekas", 1837 | "email": "p@tchwork.com" 1838 | }, 1839 | { 1840 | "name": "Symfony Community", 1841 | "homepage": "https://symfony.com/contributors" 1842 | } 1843 | ], 1844 | "description": "Generic abstractions related to dispatching event", 1845 | "homepage": "https://symfony.com", 1846 | "keywords": [ 1847 | "abstractions", 1848 | "contracts", 1849 | "decoupling", 1850 | "interfaces", 1851 | "interoperability", 1852 | "standards" 1853 | ], 1854 | "funding": [ 1855 | { 1856 | "url": "https://symfony.com/sponsor", 1857 | "type": "custom" 1858 | }, 1859 | { 1860 | "url": "https://github.com/fabpot", 1861 | "type": "github" 1862 | }, 1863 | { 1864 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1865 | "type": "tidelift" 1866 | } 1867 | ], 1868 | "time": "2020-05-20T17:43:50+00:00" 1869 | }, 1870 | { 1871 | "name": "symfony/finder", 1872 | "version": "v5.1.2", 1873 | "source": { 1874 | "type": "git", 1875 | "url": "https://github.com/symfony/finder.git", 1876 | "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187" 1877 | }, 1878 | "dist": { 1879 | "type": "zip", 1880 | "url": "https://api.github.com/repos/symfony/finder/zipball/4298870062bfc667cb78d2b379be4bf5dec5f187", 1881 | "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187", 1882 | "shasum": "" 1883 | }, 1884 | "require": { 1885 | "php": ">=7.2.5" 1886 | }, 1887 | "type": "library", 1888 | "extra": { 1889 | "branch-alias": { 1890 | "dev-master": "5.1-dev" 1891 | } 1892 | }, 1893 | "autoload": { 1894 | "psr-4": { 1895 | "Symfony\\Component\\Finder\\": "" 1896 | }, 1897 | "exclude-from-classmap": [ 1898 | "/Tests/" 1899 | ] 1900 | }, 1901 | "notification-url": "https://packagist.org/downloads/", 1902 | "license": [ 1903 | "MIT" 1904 | ], 1905 | "authors": [ 1906 | { 1907 | "name": "Fabien Potencier", 1908 | "email": "fabien@symfony.com" 1909 | }, 1910 | { 1911 | "name": "Symfony Community", 1912 | "homepage": "https://symfony.com/contributors" 1913 | } 1914 | ], 1915 | "description": "Symfony Finder Component", 1916 | "homepage": "https://symfony.com", 1917 | "funding": [ 1918 | { 1919 | "url": "https://symfony.com/sponsor", 1920 | "type": "custom" 1921 | }, 1922 | { 1923 | "url": "https://github.com/fabpot", 1924 | "type": "github" 1925 | }, 1926 | { 1927 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1928 | "type": "tidelift" 1929 | } 1930 | ], 1931 | "time": "2020-05-20T17:43:50+00:00" 1932 | }, 1933 | { 1934 | "name": "symfony/polyfill-ctype", 1935 | "version": "v1.17.1", 1936 | "source": { 1937 | "type": "git", 1938 | "url": "https://github.com/symfony/polyfill-ctype.git", 1939 | "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d" 1940 | }, 1941 | "dist": { 1942 | "type": "zip", 1943 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d", 1944 | "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d", 1945 | "shasum": "" 1946 | }, 1947 | "require": { 1948 | "php": ">=5.3.3" 1949 | }, 1950 | "suggest": { 1951 | "ext-ctype": "For best performance" 1952 | }, 1953 | "type": "library", 1954 | "extra": { 1955 | "branch-alias": { 1956 | "dev-master": "1.17-dev" 1957 | }, 1958 | "thanks": { 1959 | "name": "symfony/polyfill", 1960 | "url": "https://github.com/symfony/polyfill" 1961 | } 1962 | }, 1963 | "autoload": { 1964 | "psr-4": { 1965 | "Symfony\\Polyfill\\Ctype\\": "" 1966 | }, 1967 | "files": [ 1968 | "bootstrap.php" 1969 | ] 1970 | }, 1971 | "notification-url": "https://packagist.org/downloads/", 1972 | "license": [ 1973 | "MIT" 1974 | ], 1975 | "authors": [ 1976 | { 1977 | "name": "Gert de Pagter", 1978 | "email": "BackEndTea@gmail.com" 1979 | }, 1980 | { 1981 | "name": "Symfony Community", 1982 | "homepage": "https://symfony.com/contributors" 1983 | } 1984 | ], 1985 | "description": "Symfony polyfill for ctype functions", 1986 | "homepage": "https://symfony.com", 1987 | "keywords": [ 1988 | "compatibility", 1989 | "ctype", 1990 | "polyfill", 1991 | "portable" 1992 | ], 1993 | "funding": [ 1994 | { 1995 | "url": "https://symfony.com/sponsor", 1996 | "type": "custom" 1997 | }, 1998 | { 1999 | "url": "https://github.com/fabpot", 2000 | "type": "github" 2001 | }, 2002 | { 2003 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2004 | "type": "tidelift" 2005 | } 2006 | ], 2007 | "time": "2020-06-06T08:46:27+00:00" 2008 | }, 2009 | { 2010 | "name": "symfony/polyfill-intl-grapheme", 2011 | "version": "v1.17.1", 2012 | "source": { 2013 | "type": "git", 2014 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 2015 | "reference": "6e4dbcf5e81eba86e36731f94fe56b1726835846" 2016 | }, 2017 | "dist": { 2018 | "type": "zip", 2019 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/6e4dbcf5e81eba86e36731f94fe56b1726835846", 2020 | "reference": "6e4dbcf5e81eba86e36731f94fe56b1726835846", 2021 | "shasum": "" 2022 | }, 2023 | "require": { 2024 | "php": ">=5.3.3" 2025 | }, 2026 | "suggest": { 2027 | "ext-intl": "For best performance" 2028 | }, 2029 | "type": "library", 2030 | "extra": { 2031 | "branch-alias": { 2032 | "dev-master": "1.17-dev" 2033 | }, 2034 | "thanks": { 2035 | "name": "symfony/polyfill", 2036 | "url": "https://github.com/symfony/polyfill" 2037 | } 2038 | }, 2039 | "autoload": { 2040 | "psr-4": { 2041 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 2042 | }, 2043 | "files": [ 2044 | "bootstrap.php" 2045 | ] 2046 | }, 2047 | "notification-url": "https://packagist.org/downloads/", 2048 | "license": [ 2049 | "MIT" 2050 | ], 2051 | "authors": [ 2052 | { 2053 | "name": "Nicolas Grekas", 2054 | "email": "p@tchwork.com" 2055 | }, 2056 | { 2057 | "name": "Symfony Community", 2058 | "homepage": "https://symfony.com/contributors" 2059 | } 2060 | ], 2061 | "description": "Symfony polyfill for intl's grapheme_* functions", 2062 | "homepage": "https://symfony.com", 2063 | "keywords": [ 2064 | "compatibility", 2065 | "grapheme", 2066 | "intl", 2067 | "polyfill", 2068 | "portable", 2069 | "shim" 2070 | ], 2071 | "funding": [ 2072 | { 2073 | "url": "https://symfony.com/sponsor", 2074 | "type": "custom" 2075 | }, 2076 | { 2077 | "url": "https://github.com/fabpot", 2078 | "type": "github" 2079 | }, 2080 | { 2081 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2082 | "type": "tidelift" 2083 | } 2084 | ], 2085 | "time": "2020-06-06T08:46:27+00:00" 2086 | }, 2087 | { 2088 | "name": "symfony/polyfill-intl-normalizer", 2089 | "version": "v1.17.1", 2090 | "source": { 2091 | "type": "git", 2092 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 2093 | "reference": "40309d1700e8f72447bb9e7b54af756eeea35620" 2094 | }, 2095 | "dist": { 2096 | "type": "zip", 2097 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/40309d1700e8f72447bb9e7b54af756eeea35620", 2098 | "reference": "40309d1700e8f72447bb9e7b54af756eeea35620", 2099 | "shasum": "" 2100 | }, 2101 | "require": { 2102 | "php": ">=5.3.3" 2103 | }, 2104 | "suggest": { 2105 | "ext-intl": "For best performance" 2106 | }, 2107 | "type": "library", 2108 | "extra": { 2109 | "branch-alias": { 2110 | "dev-master": "1.17-dev" 2111 | }, 2112 | "thanks": { 2113 | "name": "symfony/polyfill", 2114 | "url": "https://github.com/symfony/polyfill" 2115 | } 2116 | }, 2117 | "autoload": { 2118 | "psr-4": { 2119 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 2120 | }, 2121 | "files": [ 2122 | "bootstrap.php" 2123 | ], 2124 | "classmap": [ 2125 | "Resources/stubs" 2126 | ] 2127 | }, 2128 | "notification-url": "https://packagist.org/downloads/", 2129 | "license": [ 2130 | "MIT" 2131 | ], 2132 | "authors": [ 2133 | { 2134 | "name": "Nicolas Grekas", 2135 | "email": "p@tchwork.com" 2136 | }, 2137 | { 2138 | "name": "Symfony Community", 2139 | "homepage": "https://symfony.com/contributors" 2140 | } 2141 | ], 2142 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 2143 | "homepage": "https://symfony.com", 2144 | "keywords": [ 2145 | "compatibility", 2146 | "intl", 2147 | "normalizer", 2148 | "polyfill", 2149 | "portable", 2150 | "shim" 2151 | ], 2152 | "funding": [ 2153 | { 2154 | "url": "https://symfony.com/sponsor", 2155 | "type": "custom" 2156 | }, 2157 | { 2158 | "url": "https://github.com/fabpot", 2159 | "type": "github" 2160 | }, 2161 | { 2162 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2163 | "type": "tidelift" 2164 | } 2165 | ], 2166 | "time": "2020-06-14T14:40:37+00:00" 2167 | }, 2168 | { 2169 | "name": "symfony/polyfill-mbstring", 2170 | "version": "v1.17.1", 2171 | "source": { 2172 | "type": "git", 2173 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2174 | "reference": "7110338d81ce1cbc3e273136e4574663627037a7" 2175 | }, 2176 | "dist": { 2177 | "type": "zip", 2178 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7", 2179 | "reference": "7110338d81ce1cbc3e273136e4574663627037a7", 2180 | "shasum": "" 2181 | }, 2182 | "require": { 2183 | "php": ">=5.3.3" 2184 | }, 2185 | "suggest": { 2186 | "ext-mbstring": "For best performance" 2187 | }, 2188 | "type": "library", 2189 | "extra": { 2190 | "branch-alias": { 2191 | "dev-master": "1.17-dev" 2192 | }, 2193 | "thanks": { 2194 | "name": "symfony/polyfill", 2195 | "url": "https://github.com/symfony/polyfill" 2196 | } 2197 | }, 2198 | "autoload": { 2199 | "psr-4": { 2200 | "Symfony\\Polyfill\\Mbstring\\": "" 2201 | }, 2202 | "files": [ 2203 | "bootstrap.php" 2204 | ] 2205 | }, 2206 | "notification-url": "https://packagist.org/downloads/", 2207 | "license": [ 2208 | "MIT" 2209 | ], 2210 | "authors": [ 2211 | { 2212 | "name": "Nicolas Grekas", 2213 | "email": "p@tchwork.com" 2214 | }, 2215 | { 2216 | "name": "Symfony Community", 2217 | "homepage": "https://symfony.com/contributors" 2218 | } 2219 | ], 2220 | "description": "Symfony polyfill for the Mbstring extension", 2221 | "homepage": "https://symfony.com", 2222 | "keywords": [ 2223 | "compatibility", 2224 | "mbstring", 2225 | "polyfill", 2226 | "portable", 2227 | "shim" 2228 | ], 2229 | "funding": [ 2230 | { 2231 | "url": "https://symfony.com/sponsor", 2232 | "type": "custom" 2233 | }, 2234 | { 2235 | "url": "https://github.com/fabpot", 2236 | "type": "github" 2237 | }, 2238 | { 2239 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2240 | "type": "tidelift" 2241 | } 2242 | ], 2243 | "time": "2020-06-06T08:46:27+00:00" 2244 | }, 2245 | { 2246 | "name": "symfony/polyfill-php73", 2247 | "version": "v1.17.1", 2248 | "source": { 2249 | "type": "git", 2250 | "url": "https://github.com/symfony/polyfill-php73.git", 2251 | "reference": "fa0837fe02d617d31fbb25f990655861bb27bd1a" 2252 | }, 2253 | "dist": { 2254 | "type": "zip", 2255 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fa0837fe02d617d31fbb25f990655861bb27bd1a", 2256 | "reference": "fa0837fe02d617d31fbb25f990655861bb27bd1a", 2257 | "shasum": "" 2258 | }, 2259 | "require": { 2260 | "php": ">=5.3.3" 2261 | }, 2262 | "type": "library", 2263 | "extra": { 2264 | "branch-alias": { 2265 | "dev-master": "1.17-dev" 2266 | }, 2267 | "thanks": { 2268 | "name": "symfony/polyfill", 2269 | "url": "https://github.com/symfony/polyfill" 2270 | } 2271 | }, 2272 | "autoload": { 2273 | "psr-4": { 2274 | "Symfony\\Polyfill\\Php73\\": "" 2275 | }, 2276 | "files": [ 2277 | "bootstrap.php" 2278 | ], 2279 | "classmap": [ 2280 | "Resources/stubs" 2281 | ] 2282 | }, 2283 | "notification-url": "https://packagist.org/downloads/", 2284 | "license": [ 2285 | "MIT" 2286 | ], 2287 | "authors": [ 2288 | { 2289 | "name": "Nicolas Grekas", 2290 | "email": "p@tchwork.com" 2291 | }, 2292 | { 2293 | "name": "Symfony Community", 2294 | "homepage": "https://symfony.com/contributors" 2295 | } 2296 | ], 2297 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 2298 | "homepage": "https://symfony.com", 2299 | "keywords": [ 2300 | "compatibility", 2301 | "polyfill", 2302 | "portable", 2303 | "shim" 2304 | ], 2305 | "funding": [ 2306 | { 2307 | "url": "https://symfony.com/sponsor", 2308 | "type": "custom" 2309 | }, 2310 | { 2311 | "url": "https://github.com/fabpot", 2312 | "type": "github" 2313 | }, 2314 | { 2315 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2316 | "type": "tidelift" 2317 | } 2318 | ], 2319 | "time": "2020-06-06T08:46:27+00:00" 2320 | }, 2321 | { 2322 | "name": "symfony/process", 2323 | "version": "v5.1.2", 2324 | "source": { 2325 | "type": "git", 2326 | "url": "https://github.com/symfony/process.git", 2327 | "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1" 2328 | }, 2329 | "dist": { 2330 | "type": "zip", 2331 | "url": "https://api.github.com/repos/symfony/process/zipball/7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", 2332 | "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", 2333 | "shasum": "" 2334 | }, 2335 | "require": { 2336 | "php": ">=7.2.5", 2337 | "symfony/polyfill-php80": "^1.15" 2338 | }, 2339 | "type": "library", 2340 | "extra": { 2341 | "branch-alias": { 2342 | "dev-master": "5.1-dev" 2343 | } 2344 | }, 2345 | "autoload": { 2346 | "psr-4": { 2347 | "Symfony\\Component\\Process\\": "" 2348 | }, 2349 | "exclude-from-classmap": [ 2350 | "/Tests/" 2351 | ] 2352 | }, 2353 | "notification-url": "https://packagist.org/downloads/", 2354 | "license": [ 2355 | "MIT" 2356 | ], 2357 | "authors": [ 2358 | { 2359 | "name": "Fabien Potencier", 2360 | "email": "fabien@symfony.com" 2361 | }, 2362 | { 2363 | "name": "Symfony Community", 2364 | "homepage": "https://symfony.com/contributors" 2365 | } 2366 | ], 2367 | "description": "Symfony Process Component", 2368 | "homepage": "https://symfony.com", 2369 | "funding": [ 2370 | { 2371 | "url": "https://symfony.com/sponsor", 2372 | "type": "custom" 2373 | }, 2374 | { 2375 | "url": "https://github.com/fabpot", 2376 | "type": "github" 2377 | }, 2378 | { 2379 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2380 | "type": "tidelift" 2381 | } 2382 | ], 2383 | "time": "2020-05-30T20:35:19+00:00" 2384 | }, 2385 | { 2386 | "name": "symfony/service-contracts", 2387 | "version": "v2.1.2", 2388 | "source": { 2389 | "type": "git", 2390 | "url": "https://github.com/symfony/service-contracts.git", 2391 | "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b" 2392 | }, 2393 | "dist": { 2394 | "type": "zip", 2395 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/66a8f0957a3ca54e4f724e49028ab19d75a8918b", 2396 | "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b", 2397 | "shasum": "" 2398 | }, 2399 | "require": { 2400 | "php": ">=7.2.5", 2401 | "psr/container": "^1.0" 2402 | }, 2403 | "suggest": { 2404 | "symfony/service-implementation": "" 2405 | }, 2406 | "type": "library", 2407 | "extra": { 2408 | "branch-alias": { 2409 | "dev-master": "2.1-dev" 2410 | } 2411 | }, 2412 | "autoload": { 2413 | "psr-4": { 2414 | "Symfony\\Contracts\\Service\\": "" 2415 | } 2416 | }, 2417 | "notification-url": "https://packagist.org/downloads/", 2418 | "license": [ 2419 | "MIT" 2420 | ], 2421 | "authors": [ 2422 | { 2423 | "name": "Nicolas Grekas", 2424 | "email": "p@tchwork.com" 2425 | }, 2426 | { 2427 | "name": "Symfony Community", 2428 | "homepage": "https://symfony.com/contributors" 2429 | } 2430 | ], 2431 | "description": "Generic abstractions related to writing services", 2432 | "homepage": "https://symfony.com", 2433 | "keywords": [ 2434 | "abstractions", 2435 | "contracts", 2436 | "decoupling", 2437 | "interfaces", 2438 | "interoperability", 2439 | "standards" 2440 | ], 2441 | "funding": [ 2442 | { 2443 | "url": "https://symfony.com/sponsor", 2444 | "type": "custom" 2445 | }, 2446 | { 2447 | "url": "https://github.com/fabpot", 2448 | "type": "github" 2449 | }, 2450 | { 2451 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2452 | "type": "tidelift" 2453 | } 2454 | ], 2455 | "time": "2020-05-20T17:43:50+00:00" 2456 | }, 2457 | { 2458 | "name": "symfony/string", 2459 | "version": "v5.1.2", 2460 | "source": { 2461 | "type": "git", 2462 | "url": "https://github.com/symfony/string.git", 2463 | "reference": "ac70459db781108db7c6d8981dd31ce0e29e3298" 2464 | }, 2465 | "dist": { 2466 | "type": "zip", 2467 | "url": "https://api.github.com/repos/symfony/string/zipball/ac70459db781108db7c6d8981dd31ce0e29e3298", 2468 | "reference": "ac70459db781108db7c6d8981dd31ce0e29e3298", 2469 | "shasum": "" 2470 | }, 2471 | "require": { 2472 | "php": ">=7.2.5", 2473 | "symfony/polyfill-ctype": "~1.8", 2474 | "symfony/polyfill-intl-grapheme": "~1.0", 2475 | "symfony/polyfill-intl-normalizer": "~1.0", 2476 | "symfony/polyfill-mbstring": "~1.0", 2477 | "symfony/polyfill-php80": "~1.15" 2478 | }, 2479 | "require-dev": { 2480 | "symfony/error-handler": "^4.4|^5.0", 2481 | "symfony/http-client": "^4.4|^5.0", 2482 | "symfony/translation-contracts": "^1.1|^2", 2483 | "symfony/var-exporter": "^4.4|^5.0" 2484 | }, 2485 | "type": "library", 2486 | "extra": { 2487 | "branch-alias": { 2488 | "dev-master": "5.1-dev" 2489 | } 2490 | }, 2491 | "autoload": { 2492 | "psr-4": { 2493 | "Symfony\\Component\\String\\": "" 2494 | }, 2495 | "files": [ 2496 | "Resources/functions.php" 2497 | ], 2498 | "exclude-from-classmap": [ 2499 | "/Tests/" 2500 | ] 2501 | }, 2502 | "notification-url": "https://packagist.org/downloads/", 2503 | "license": [ 2504 | "MIT" 2505 | ], 2506 | "authors": [ 2507 | { 2508 | "name": "Nicolas Grekas", 2509 | "email": "p@tchwork.com" 2510 | }, 2511 | { 2512 | "name": "Symfony Community", 2513 | "homepage": "https://symfony.com/contributors" 2514 | } 2515 | ], 2516 | "description": "Symfony String component", 2517 | "homepage": "https://symfony.com", 2518 | "keywords": [ 2519 | "grapheme", 2520 | "i18n", 2521 | "string", 2522 | "unicode", 2523 | "utf-8", 2524 | "utf8" 2525 | ], 2526 | "funding": [ 2527 | { 2528 | "url": "https://symfony.com/sponsor", 2529 | "type": "custom" 2530 | }, 2531 | { 2532 | "url": "https://github.com/fabpot", 2533 | "type": "github" 2534 | }, 2535 | { 2536 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2537 | "type": "tidelift" 2538 | } 2539 | ], 2540 | "time": "2020-06-11T12:16:36+00:00" 2541 | }, 2542 | { 2543 | "name": "symfony/yaml", 2544 | "version": "v5.1.2", 2545 | "source": { 2546 | "type": "git", 2547 | "url": "https://github.com/symfony/yaml.git", 2548 | "reference": "ea342353a3ef4f453809acc4ebc55382231d4d23" 2549 | }, 2550 | "dist": { 2551 | "type": "zip", 2552 | "url": "https://api.github.com/repos/symfony/yaml/zipball/ea342353a3ef4f453809acc4ebc55382231d4d23", 2553 | "reference": "ea342353a3ef4f453809acc4ebc55382231d4d23", 2554 | "shasum": "" 2555 | }, 2556 | "require": { 2557 | "php": ">=7.2.5", 2558 | "symfony/deprecation-contracts": "^2.1", 2559 | "symfony/polyfill-ctype": "~1.8" 2560 | }, 2561 | "conflict": { 2562 | "symfony/console": "<4.4" 2563 | }, 2564 | "require-dev": { 2565 | "symfony/console": "^4.4|^5.0" 2566 | }, 2567 | "suggest": { 2568 | "symfony/console": "For validating YAML files using the lint command" 2569 | }, 2570 | "bin": [ 2571 | "Resources/bin/yaml-lint" 2572 | ], 2573 | "type": "library", 2574 | "extra": { 2575 | "branch-alias": { 2576 | "dev-master": "5.1-dev" 2577 | } 2578 | }, 2579 | "autoload": { 2580 | "psr-4": { 2581 | "Symfony\\Component\\Yaml\\": "" 2582 | }, 2583 | "exclude-from-classmap": [ 2584 | "/Tests/" 2585 | ] 2586 | }, 2587 | "notification-url": "https://packagist.org/downloads/", 2588 | "license": [ 2589 | "MIT" 2590 | ], 2591 | "authors": [ 2592 | { 2593 | "name": "Fabien Potencier", 2594 | "email": "fabien@symfony.com" 2595 | }, 2596 | { 2597 | "name": "Symfony Community", 2598 | "homepage": "https://symfony.com/contributors" 2599 | } 2600 | ], 2601 | "description": "Symfony Yaml Component", 2602 | "homepage": "https://symfony.com", 2603 | "funding": [ 2604 | { 2605 | "url": "https://symfony.com/sponsor", 2606 | "type": "custom" 2607 | }, 2608 | { 2609 | "url": "https://github.com/fabpot", 2610 | "type": "github" 2611 | }, 2612 | { 2613 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2614 | "type": "tidelift" 2615 | } 2616 | ], 2617 | "time": "2020-05-20T17:43:50+00:00" 2618 | }, 2619 | { 2620 | "name": "webmozart/assert", 2621 | "version": "1.9.0", 2622 | "source": { 2623 | "type": "git", 2624 | "url": "https://github.com/webmozart/assert.git", 2625 | "reference": "9dc4f203e36f2b486149058bade43c851dd97451" 2626 | }, 2627 | "dist": { 2628 | "type": "zip", 2629 | "url": "https://api.github.com/repos/webmozart/assert/zipball/9dc4f203e36f2b486149058bade43c851dd97451", 2630 | "reference": "9dc4f203e36f2b486149058bade43c851dd97451", 2631 | "shasum": "" 2632 | }, 2633 | "require": { 2634 | "php": "^5.3.3 || ^7.0", 2635 | "symfony/polyfill-ctype": "^1.8" 2636 | }, 2637 | "conflict": { 2638 | "phpstan/phpstan": "<0.12.20", 2639 | "vimeo/psalm": "<3.9.1" 2640 | }, 2641 | "require-dev": { 2642 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 2643 | }, 2644 | "type": "library", 2645 | "autoload": { 2646 | "psr-4": { 2647 | "Webmozart\\Assert\\": "src/" 2648 | } 2649 | }, 2650 | "notification-url": "https://packagist.org/downloads/", 2651 | "license": [ 2652 | "MIT" 2653 | ], 2654 | "authors": [ 2655 | { 2656 | "name": "Bernhard Schussek", 2657 | "email": "bschussek@gmail.com" 2658 | } 2659 | ], 2660 | "description": "Assertions to validate method input/output with nice error messages.", 2661 | "keywords": [ 2662 | "assert", 2663 | "check", 2664 | "validate" 2665 | ], 2666 | "time": "2020-06-16T10:16:42+00:00" 2667 | } 2668 | ], 2669 | "aliases": [], 2670 | "minimum-stability": "stable", 2671 | "stability-flags": { 2672 | "roave/security-advisories": 20 2673 | }, 2674 | "prefer-stable": false, 2675 | "prefer-lowest": false, 2676 | "platform": { 2677 | "php": ">=7.3" 2678 | }, 2679 | "platform-dev": [], 2680 | "plugin-api-version": "1.1.0" 2681 | } 2682 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | ci: 5 | image: supervisorphp/configuration:latest 6 | build: 7 | context: . 8 | volumes: 9 | - ./:/app 10 | -------------------------------------------------------------------------------- /phpspec.yml: -------------------------------------------------------------------------------- 1 | suites: 2 | supervisor_configuration_suite: 3 | namespace: Supervisor\Configuration 4 | psr4_prefix: Supervisor\Configuration 5 | formatter.name: pretty 6 | -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | parameters: 2 | level: 2 3 | 4 | paths: 5 | - src 6 | -------------------------------------------------------------------------------- /resources/example.conf: -------------------------------------------------------------------------------- 1 | [unix_http_server] 2 | file = /tmp/supervisor.sock 3 | chmod = 0777 4 | chown= nobody:nogroup 5 | username = user 6 | password = 123 7 | 8 | [inet_http_server] 9 | port = 127.0.0.1:9001 10 | username = user 11 | password = 123 12 | 13 | [supervisord] 14 | logfile = /tmp/supervisord.log 15 | logfile_maxbytes = 50MB 16 | logfile_backups=10 17 | loglevel = info 18 | pidfile = /tmp/supervisord.pid 19 | nodaemon = false 20 | minfds = 1024 21 | minprocs = 200 22 | umask = 022 23 | user = chrism 24 | identifier = supervisor 25 | directory = /tmp 26 | nocleanup = true 27 | childlogdir = /tmp 28 | strip_ansi = false 29 | environment = "KEY1="value1",KEY2="value2"" 30 | 31 | [supervisorctl] 32 | serverurl = unix:///tmp/supervisor.sock 33 | username = chris 34 | password = 123 35 | prompt = mysupervisor 36 | 37 | [program:cat] 38 | command = /bin/cat 39 | process_name = "%(program_name)s" 40 | numprocs = 1 41 | directory = /tmp 42 | umask = 022 43 | priority = 999 44 | autostart = true 45 | autorestart = true 46 | startsecs = 10 47 | startretries = 3 48 | exitcodes = 0,2 49 | stopsignal = TERM 50 | stopwaitsecs = 10 51 | user = chrism 52 | redirect_stderr = false 53 | stdout_logfile = /a/path 54 | stdout_logfile_maxbytes = 1MB 55 | stdout_logfile_backups = 10 56 | stdout_capture_maxbytes = 1MB 57 | stderr_logfile = /a/path 58 | stderr_logfile_maxbytes = 1MB 59 | stderr_logfile_backups = 10 60 | stderr_capture_maxbytes = 1MB 61 | environment = "A="1",B="2"" 62 | serverurl = AUTO 63 | 64 | [program:cat2] 65 | command = /bin/cat 66 | process_name = "%(program_name)s" 67 | numprocs = 1 68 | directory = /tmp 69 | umask = 022 70 | priority = 999 71 | autostart = true 72 | autorestart = true 73 | startsecs = 10 74 | startretries = 3 75 | exitcodes = 0,2 76 | stopsignal = TERM 77 | stopwaitsecs = 10 78 | user = chrism 79 | redirect_stderr = false 80 | stdout_logfile = /a/path 81 | stdout_logfile_maxbytes = 1048576 82 | stdout_logfile_backups = 10 83 | stdout_capture_maxbytes = 1048576 84 | stderr_logfile = /a/path 85 | stderr_logfile_maxbytes = 1048576 86 | stderr_logfile_backups = 10 87 | stderr_capture_maxbytes = 1048576 88 | environment = A="1",B="2" 89 | serverurl = AUTO 90 | 91 | [include] 92 | files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf 93 | 94 | [group:foo] 95 | programs = bar,baz 96 | priority = 999 97 | 98 | [group:foo] 99 | programs = bar,baz 100 | priority = 999 101 | 102 | [fcgi-program:fcgiprogramname] 103 | command = /usr/bin/example.fcgi 104 | socket = "unix:///var/run/supervisor/%(program_name)s.sock" 105 | socket_owner = chrism 106 | socket_mode = 0700 107 | process_name = "%(program_name)s_%(process_num)02d" 108 | numprocs = 5 109 | priority = 999 110 | autostart = true 111 | autorestart = unexpected 112 | startsecs = 1 113 | startretries = 3 114 | exitcodes = 0,2 115 | stopsignal = QUIT 116 | stopwaitsecs = 10 117 | user = chrism 118 | redirect_stderr = true 119 | stdout_logfile = /a/path 120 | stdout_logfile_maxbytes = 1MB 121 | stdout_logfile_backups = 10 122 | stderr_logfile = /a/path 123 | stderr_logfile_maxbytes = 1MB 124 | stderr_logfile_backups = 10 125 | environment = A="1",B="2" 126 | serverurl = AUTO 127 | 128 | [eventlistener:theeventlistenername] 129 | command = /bin/eventlistener 130 | process_name = "%(program_name)s_%(process_num)02d" 131 | numprocs = 5 132 | events = PROCESS_STATE 133 | buffer_size = 10 134 | priority = -1 135 | autostart = true 136 | autorestart = unexpected 137 | startsecs = 1 138 | startretries = 3 139 | exitcodes = 0,2 140 | stopsignal = QUIT 141 | stopwaitsecs = 10 142 | user = chrism 143 | redirect_stderr = true 144 | stdout_logfile = /a/path 145 | stdout_logfile_maxbytes = 1MB 146 | stdout_logfile_backups = 10 147 | stderr_logfile = /a/path 148 | stderr_logfile_maxbytes = 1MB 149 | stderr_logfile_backups = 10 150 | environment = A="1",B="2" 151 | result_handler = supervisor.dispatchers:default_handler 152 | 153 | [rpcinterface:supervisor] 154 | supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 155 | retries = 1 156 | -------------------------------------------------------------------------------- /resources/invalid.conf: -------------------------------------------------------------------------------- 1 | this is an invalid INI file which cannot be parsed 2 | ?{}|&~![()^" 3 | -------------------------------------------------------------------------------- /src/Configuration.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class Configuration 12 | { 13 | /** 14 | * Available sections. 15 | * 16 | * @var array 17 | */ 18 | protected $sectionMap = [ 19 | 'eventlistener' => Section\EventListener::class, 20 | 'fcgi-program' => Section\FcgiProgram::class, 21 | 'group' => Section\Group::class, 22 | 'include' => Section\Includes::class, 23 | 'inet_http_server' => Section\InetHttpServer::class, 24 | 'program' => Section\Program::class, 25 | 'supervisorctl' => Section\Supervisorctl::class, 26 | 'supervisord' => Section\Supervisord::class, 27 | 'unix_http_server' => Section\UnixHttpServer::class, 28 | 'rpcinterface' => Section\RpcInterface::class, 29 | ]; 30 | 31 | /** 32 | * Config sections. 33 | * 34 | * @var SectionInterface[] 35 | */ 36 | protected $sections = []; 37 | 38 | /** 39 | * Returns a specific section by name. 40 | * 41 | * @param string $section 42 | * 43 | * @return SectionInterface|null 44 | */ 45 | public function getSection(string $section): ?SectionInterface 46 | { 47 | if ($this->hasSection($section)) { 48 | return $this->sections[$section]; 49 | } 50 | return null; 51 | } 52 | 53 | /** 54 | * Checks whether section exists in Configuration. 55 | * 56 | * @param string $section 57 | * 58 | * @return bool 59 | */ 60 | public function hasSection(string $section): bool 61 | { 62 | return array_key_exists($section, $this->sections); 63 | } 64 | 65 | /** 66 | * Adds or overrides a section. 67 | * 68 | * @param SectionInterface $section 69 | */ 70 | public function addSection(SectionInterface $section): void 71 | { 72 | $this->sections[$section->getName()] = $section; 73 | } 74 | 75 | /** 76 | * Removes a section by name. 77 | * 78 | * @param string $section 79 | * 80 | * @return bool Whether the section existed before this function call. 81 | */ 82 | public function removeSection($section): bool 83 | { 84 | if ($has = $this->hasSection($section)) { 85 | unset($this->sections[$section]); 86 | } 87 | 88 | return $has; 89 | } 90 | 91 | /** 92 | * Returns all sections. 93 | * 94 | * @return SectionInterface[] 95 | */ 96 | public function getSections(): array 97 | { 98 | return $this->sections; 99 | } 100 | 101 | /** 102 | * Adds or overrides an array sections. 103 | * 104 | * @param SectionInterface[] $sections 105 | */ 106 | public function addSections(array $sections): void 107 | { 108 | foreach ($sections as $section) { 109 | $this->addSection($section); 110 | } 111 | } 112 | 113 | /** 114 | * Resets Configuration. 115 | */ 116 | public function reset(): void 117 | { 118 | $this->sections = []; 119 | } 120 | 121 | /** 122 | * Converts the configuration to array. 123 | * 124 | * @return array 125 | */ 126 | public function toArray(): array 127 | { 128 | $ini = []; 129 | 130 | foreach ($this->sections as $sectionName => $section) { 131 | $ini[$sectionName] = $section->getProperties(); 132 | } 133 | 134 | return $ini; 135 | } 136 | 137 | /** 138 | * Adds or overrides a default section mapping. 139 | * 140 | * @param string $section 141 | * @param string $className 142 | */ 143 | public function mapSection($section, $className): void 144 | { 145 | if (false === class_exists($className)) { 146 | throw new \InvalidArgumentException('This section class does not exist'); 147 | } 148 | if (false === is_a($className, SectionInterface::class, true)) { 149 | throw new \InvalidArgumentException('This section class must implement Supervisor\Configuration\Section'); 150 | } 151 | 152 | $this->sectionMap[$section] = $className; 153 | } 154 | 155 | /** 156 | * Finds a section class by name. 157 | * 158 | * @param string $section 159 | * 160 | * @return string|bool 161 | */ 162 | public function findSection($section) 163 | { 164 | return $this->sectionMap[$section] ?? false; 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /src/Exception/LoaderException.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class LoaderException extends \RuntimeException 11 | { 12 | } 13 | -------------------------------------------------------------------------------- /src/Exception/WriterException.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class WriterException extends \Exception 11 | { 12 | } 13 | -------------------------------------------------------------------------------- /src/Loader/AbstractLoader.php: -------------------------------------------------------------------------------- 1 | parser)) { 25 | $this->parser = new Parser(); 26 | } 27 | 28 | return $this->parser; 29 | } 30 | 31 | /** 32 | * Parses a section array. 33 | * 34 | * @param array $sections 35 | * @param Configuration|null $configuration 36 | * 37 | * @return Configuration 38 | */ 39 | public function parseSections(array $sections, Configuration $configuration = null): Configuration 40 | { 41 | if (is_null($configuration)) { 42 | $configuration = new Configuration(); 43 | } 44 | 45 | foreach ($sections as $sectionName => $section) { 46 | $name = explode(':', $sectionName, 2); 47 | 48 | $class = $configuration->findSection($name[0]); 49 | 50 | if (false === $class) { 51 | $class = GenericSection::class; 52 | $name[1] = $sectionName; 53 | } 54 | 55 | if (isset($name[1])) { 56 | $section = new $class($name[1], $section); 57 | } else { 58 | $section = new $class($section); 59 | } 60 | 61 | $configuration->addSection($section); 62 | } 63 | 64 | return $configuration; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/Loader/FlysystemLoader.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | final class FlysystemLoader extends AbstractLoader 16 | { 17 | /** 18 | * @var Filesystem 19 | */ 20 | protected $filesystem; 21 | 22 | /** 23 | * @var string 24 | */ 25 | protected $file; 26 | 27 | /** 28 | * @param Filesystem $filesystem 29 | * @param string $file 30 | */ 31 | public function __construct(Filesystem $filesystem, string $file) 32 | { 33 | $this->filesystem = $filesystem; 34 | $this->file = $file; 35 | } 36 | 37 | /** 38 | * {@inheritdoc} 39 | */ 40 | public function load(Configuration $configuration = null): Configuration 41 | { 42 | if (!$this->filesystem->has($this->file)) { 43 | throw new LoaderException(sprintf('File "%s" not found', $this->file)); 44 | } 45 | 46 | if (!$fileContents = $this->filesystem->read($this->file)) { 47 | throw new LoaderException(sprintf('Reading file "%s" failed', $this->file)); 48 | } 49 | 50 | try { 51 | $ini = $this->getParser()->parse($fileContents); 52 | } catch (ParserException $e) { 53 | throw new LoaderException('Cannot parse INI', 0, $e); 54 | } 55 | 56 | return $this->parseSections($ini, $configuration); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/Loader/IniFileLoader.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | final class IniFileLoader extends AbstractLoader 16 | { 17 | /** 18 | * @var string 19 | */ 20 | protected $file; 21 | 22 | /** 23 | * @param string $file 24 | */ 25 | public function __construct(string $file) 26 | { 27 | $this->file = $file; 28 | } 29 | 30 | /** 31 | * {@inheritdoc} 32 | */ 33 | public function load(Configuration $configuration = null): Configuration 34 | { 35 | if (!file_exists($this->file)) { 36 | throw new LoaderException(sprintf('File "%s" not found', $this->file)); 37 | } 38 | 39 | if (!$fileContents = file_get_contents($this->file)) { 40 | throw new LoaderException(sprintf('Reading file "%s" failed', $this->file)); 41 | } 42 | 43 | try { 44 | $ini = $this->getParser()->parse($fileContents); 45 | } catch (ParserException $e) { 46 | throw new LoaderException('Cannot parse INI', 0, $e); 47 | } 48 | 49 | return $this->parseSections($ini, $configuration); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/Loader/IniStringLoader.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | final class IniStringLoader extends AbstractLoader 15 | { 16 | /** 17 | * @var string 18 | */ 19 | private $string; 20 | 21 | /** 22 | * @param string $string 23 | */ 24 | public function __construct($string) 25 | { 26 | $this->string = $string; 27 | } 28 | 29 | /** 30 | * {@inheritdoc} 31 | */ 32 | public function load(Configuration $configuration = null): Configuration 33 | { 34 | try { 35 | $ini = $this->getParser()->parse($this->string); 36 | } catch (ParserException $e) { 37 | throw new LoaderException('Cannot parse INI', 0, $e); 38 | } 39 | 40 | return $this->parseSections($ini, $configuration); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/Loader/LoaderInterface.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | interface LoaderInterface 14 | { 15 | /** 16 | * Load an input to a configuration. 17 | * 18 | * @param Configuration|null $configuration If null passed, it is created automatically 19 | * 20 | * @return Configuration 21 | * 22 | * @throws LoaderException If the given data cannot be parsed 23 | */ 24 | public function load(Configuration $configuration = null): Configuration; 25 | } 26 | -------------------------------------------------------------------------------- /src/Section/Base.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | abstract class Base implements SectionInterface 14 | { 15 | use SectionData; 16 | 17 | /** 18 | * @var OptionsResolver[] 19 | */ 20 | private static $resolversByClass = []; 21 | 22 | /** 23 | * @param array $properties 24 | */ 25 | public function __construct(array $properties) 26 | { 27 | $this->setProperties($properties); 28 | } 29 | 30 | /** 31 | * {@inheritdoc} 32 | */ 33 | public function setProperty($key, $value): void 34 | { 35 | $properties = $this->properties; 36 | $properties[$key] = $value; 37 | 38 | $this->setProperties($properties); 39 | } 40 | 41 | /** 42 | * {@inheritdoc} 43 | */ 44 | public function setProperties(array $properties): void 45 | { 46 | $this->properties = $this->resolveProperties($properties); 47 | } 48 | 49 | /** 50 | * Resolves properties. 51 | * 52 | * @param array $properties 53 | * 54 | * @return array 55 | */ 56 | protected function resolveProperties(array $properties) 57 | { 58 | $class = get_class($this); 59 | 60 | if (!isset(self::$resolversByClass[$class])) { 61 | self::$resolversByClass[$class] = new OptionsResolver(); 62 | $this->configureProperties(self::$resolversByClass[$class]); 63 | } 64 | 65 | return self::$resolversByClass[$class]->resolve($properties); 66 | } 67 | 68 | /** 69 | * @param OptionsResolver $resolver 70 | */ 71 | abstract protected function configureProperties(OptionsResolver $resolver); 72 | 73 | /** 74 | * Values returned from INI parser are always string 75 | * As a workaround to this problem you can set various normalizers to optimize the values. 76 | * 77 | * Note: The property should be defined first 78 | */ 79 | 80 | /** 81 | * Configures an array property for OptionsResolver. 82 | * 83 | * @param string $property 84 | * @param OptionsResolver $resolver 85 | */ 86 | protected function configureArrayProperty($property, OptionsResolver $resolver) 87 | { 88 | $resolver 89 | ->setAllowedTypes($property, ['array', 'string']) 90 | ->setNormalizer($property, function (Options $options, $value) { 91 | return is_array($value) ? $value : explode(',', str_replace(' ', '', $value)); 92 | }); 93 | } 94 | 95 | /** 96 | * Configures an environment property for OptionsResolver. 97 | * 98 | * @param OptionsResolver $resolver 99 | */ 100 | protected function configureEnvironmentProperty(OptionsResolver $resolver) 101 | { 102 | $resolver 103 | ->setDefined('environment') 104 | ->setAllowedTypes('environment', ['array', 'string']) 105 | ->setNormalizer('environment', function (Options $options, $value) { 106 | if (is_array($value)) { 107 | $normalized = []; 108 | 109 | foreach ($value as $key => $val) { 110 | is_string($key) and $normalized[] = sprintf('%s="%s"', strtoupper($key), $val); 111 | } 112 | 113 | $value = implode(',', $normalized); 114 | } 115 | 116 | return $value; 117 | }); 118 | } 119 | 120 | /** 121 | * Configures a byte property for OptionsResolver. 122 | * 123 | * @param string $property 124 | * @param OptionsResolver $resolver 125 | */ 126 | protected function configureByteProperty($property, OptionsResolver $resolver) 127 | { 128 | $resolver 129 | ->setAllowedValues($property, function($value) {return is_byte($value);}) 130 | ->setNormalizer($property, function (Options $options, $value) { 131 | return is_numeric($value) ? intval($value) : $value; 132 | }); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/Section/EventListener.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class EventListener extends Program 15 | { 16 | /** 17 | * {@inheritdoc} 18 | */ 19 | protected $sectionName = 'eventlistener'; 20 | 21 | /** 22 | * {@inheritdoc} 23 | */ 24 | protected function configureProperties(OptionsResolver $resolver) 25 | { 26 | parent::configureProperties($resolver); 27 | 28 | $resolver->setDefined('buffer_size') 29 | ->setAllowedTypes('buffer_size', 'integer'); 30 | 31 | $resolver->setDefined('events'); 32 | $this->configureArrayProperty('events', $resolver); 33 | 34 | $resolver 35 | ->setDefined('result_handler') 36 | ->setAllowedTypes('result_handler', 'string'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Section/FcgiProgram.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class FcgiProgram extends Program 15 | { 16 | /** 17 | * {@inheritdoc} 18 | */ 19 | protected $sectionName = 'fcgi-program'; 20 | 21 | /** 22 | * {@inheritdoc} 23 | */ 24 | protected function configureProperties(OptionsResolver $resolver) 25 | { 26 | parent::configureProperties($resolver); 27 | 28 | $resolver 29 | ->setRequired('socket') 30 | ->setAllowedTypes('socket', 'string'); 31 | 32 | $resolver 33 | ->setDefined('socket_owner') 34 | ->setAllowedTypes('socket_owner', 'string'); 35 | 36 | // TODO: octal vs. decimal value 37 | $resolver->setDefined('socket_mode') 38 | ->setAllowedTypes('socket_mode', 'integer'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Section/GenericSection.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | final class GenericSection implements SectionInterface 11 | { 12 | use SectionData; 13 | 14 | /** 15 | * @param string $name 16 | * @param array $properties 17 | */ 18 | public function __construct($name, array $properties = []) 19 | { 20 | $this->name = trim($name); 21 | $this->properties = $properties; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Section/Group.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class Group extends Named 15 | { 16 | /** 17 | * {@inheritdoc} 18 | */ 19 | protected $sectionName = 'group'; 20 | 21 | /** 22 | * {@inheritdoc} 23 | */ 24 | protected function configureProperties(OptionsResolver $resolver) 25 | { 26 | $resolver->setRequired('programs'); 27 | $this->configureArrayProperty('programs', $resolver); 28 | 29 | $resolver->setDefined('priority') 30 | ->setAllowedTypes('priority', 'int'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Section/Includes.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | class Includes extends Base 16 | { 17 | /** 18 | * {@inheritdoc} 19 | */ 20 | protected $name = 'include'; 21 | 22 | /** 23 | * {@inheritdoc} 24 | */ 25 | protected function configureProperties(OptionsResolver $resolver) 26 | { 27 | $resolver 28 | ->setRequired('files') 29 | ->setAllowedTypes('files', ['string', 'array']) 30 | ->setNormalizer('files', function (Options $options, $value) { 31 | return is_string($value) ? $value : implode(' ', $value); 32 | }); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Section/InetHttpServer.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | class InetHttpServer extends Base 16 | { 17 | /** 18 | * {@inheritdoc} 19 | */ 20 | protected $name = 'inet_http_server'; 21 | 22 | /** 23 | * {@inheritdoc} 24 | */ 25 | protected function configureProperties(OptionsResolver $resolver) 26 | { 27 | $resolver 28 | ->setRequired('port') 29 | ->setAllowedTypes('port', ['integer', 'string']) 30 | ->setNormalizer('port', function (Options $options, $value) { 31 | // We cast it to integer first to make sure it is an integer representation 32 | is_numeric($value) and $value = '*:' . intval($value); 33 | 34 | return $value; 35 | }); 36 | 37 | $resolver 38 | ->setDefined('username') 39 | ->setAllowedTypes('username', 'string'); 40 | 41 | $resolver 42 | ->setDefined('password') 43 | ->setAllowedTypes('password', ['string', 'numeric']); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Section/Named.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | abstract class Named extends Base 11 | { 12 | /** 13 | * Predefined section name. 14 | * 15 | * @var string 16 | */ 17 | protected $sectionName; 18 | 19 | /** 20 | * @param string $name 21 | * @param array $properties 22 | */ 23 | public function __construct($name, array $properties = []) 24 | { 25 | $this->name = $this->sectionName . ':' . trim($name); 26 | 27 | parent::__construct($properties); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Section/Program.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | class Program extends Named 16 | { 17 | /** 18 | * {@inheritdoc} 19 | */ 20 | protected $sectionName = 'program'; 21 | 22 | /** 23 | * {@inheritdoc} 24 | */ 25 | protected function configureProperties(OptionsResolver $resolver) 26 | { 27 | $this->configureProcessProperties($resolver); 28 | $this->configureStartControlProperties($resolver); 29 | $this->configureStopControlProperties($resolver); 30 | 31 | $resolver 32 | ->setDefined('user') 33 | ->setAllowedTypes('user', 'string'); 34 | 35 | $this->configureLogProperties($resolver); 36 | 37 | $this->configureEnvironmentProperty($resolver); 38 | 39 | $resolver 40 | ->setDefined('directory') 41 | ->setAllowedTypes('directory', 'string'); 42 | 43 | // TODO: octal vs. decimal value 44 | $resolver->setDefined('umask') 45 | ->setAllowedTypes('umask', 'int'); 46 | 47 | $resolver 48 | ->setDefined('serverurl') 49 | ->setAllowedTypes('serverurl', 'string'); 50 | } 51 | 52 | /** 53 | * Configures process related properties. 54 | * 55 | * @param OptionsResolver $resolver 56 | */ 57 | private function configureProcessProperties(OptionsResolver $resolver) 58 | { 59 | $resolver 60 | ->setRequired('command') 61 | ->setAllowedTypes('command', 'string'); 62 | 63 | $resolver 64 | ->setDefined('process_name') 65 | ->setAllowedTypes('process_name', 'string'); 66 | 67 | $resolver->setDefined('numprocs') 68 | ->setAllowedTypes('numprocs', 'int'); 69 | 70 | $resolver->setDefined('numprocs_start') 71 | ->setAllowedTypes('numprocs_start', 'int'); 72 | 73 | $resolver->setDefined('priority') 74 | ->setAllowedTypes('priority', 'int'); 75 | } 76 | 77 | /** 78 | * Configures start control related properties. 79 | * 80 | * @param OptionsResolver $resolver 81 | */ 82 | private function configureStartControlProperties(OptionsResolver $resolver) 83 | { 84 | $resolver->setDefined('autostart') 85 | ->setAllowedTypes('autostart', 'bool'); 86 | 87 | $resolver 88 | ->setDefined('autorestart') 89 | ->setAllowedTypes('autorestart', ['bool', 'string']) 90 | ->setAllowedValues('autorestart', [true, false, 'true', 'false', 'unexpected']) 91 | ->setNormalizer('autorestart', function (Options $options, $value) { 92 | return (is_bool($value) or $value === 'unexpected') ? $value : ($value === 'true' ? true : false); 93 | }); 94 | 95 | $resolver->setDefined('startsecs') 96 | ->setAllowedTypes('startsecs', 'int'); 97 | 98 | $resolver->setDefined('startretries') 99 | ->setAllowedTypes('startretries', 'int'); 100 | } 101 | 102 | /** 103 | * Configures stop control related properties. 104 | * 105 | * @param OptionsResolver $resolver 106 | */ 107 | private function configureStopControlProperties(OptionsResolver $resolver) 108 | { 109 | $resolver->setDefined('exitcodes'); 110 | $this->configureArrayProperty('exitcodes', $resolver); 111 | 112 | $resolver 113 | ->setDefined('stopsignal') 114 | ->setAllowedTypes('stopsignal', 'string') 115 | ->setAllowedValues('stopsignal', ['TERM', 'HUP', 'INT', 'QUIT', 'KILL', 'USR1', 'USR2']); 116 | 117 | $resolver->setDefined('stopwaitsecs') 118 | ->setAllowedTypes('stopwaitsecs', 'int'); 119 | 120 | $resolver->setDefined('stopasgroup') 121 | ->setAllowedTypes('stopasgroup', 'bool'); 122 | 123 | $resolver->setDefined('killasgroup') 124 | ->setAllowedTypes('killasgroup', 'bool'); 125 | } 126 | 127 | /** 128 | * Configures log related properties. 129 | * 130 | * @param OptionsResolver $resolver 131 | */ 132 | private function configureLogProperties(OptionsResolver $resolver) 133 | { 134 | $resolver->setDefined('redirect_stderr') 135 | ->setAllowedTypes('redirect_stderr', 'bool'); 136 | 137 | $this->configureStdoutLogProperties($resolver); 138 | $this->configureStderrLogProperties($resolver); 139 | } 140 | 141 | /** 142 | * Configures stdout log related properties. 143 | * 144 | * @param OptionsResolver $resolver 145 | */ 146 | private function configureStdoutLogProperties(OptionsResolver $resolver) 147 | { 148 | $resolver 149 | ->setDefined('stdout_logfile') 150 | ->setAllowedTypes('stdout_logfile', 'string'); 151 | 152 | $resolver->setDefined('stdout_logfile_maxbytes'); 153 | $this->configureByteProperty('stdout_logfile_maxbytes', $resolver); 154 | 155 | $resolver->setDefined('stdout_logfile_backups') 156 | ->setAllowedTypes('stdout_logfile_backups', 'int'); 157 | 158 | $resolver->setDefined('stdout_capture_maxbytes'); 159 | $this->configureByteProperty('stdout_capture_maxbytes', $resolver); 160 | 161 | $resolver->setDefined('stdout_events_enabled') 162 | ->setAllowedTypes('stdout_events_enabled', 'bool'); 163 | 164 | $resolver->setDefined('stdout_syslog') 165 | ->setAllowedTypes('stdout_syslog', 'bool'); 166 | } 167 | 168 | /** 169 | * Configures stderr log related properties. 170 | * 171 | * @param OptionsResolver $resolver 172 | */ 173 | private function configureStderrLogProperties(OptionsResolver $resolver) 174 | { 175 | $resolver 176 | ->setDefined('stderr_logfile') 177 | ->setAllowedTypes('stderr_logfile', 'string'); 178 | 179 | $resolver->setDefined('stderr_logfile_maxbytes'); 180 | $this->configureByteProperty('stderr_logfile_maxbytes', $resolver); 181 | 182 | $resolver->setDefined('stderr_logfile_backups') 183 | ->setAllowedTypes('stderr_logfile_backups', 'int'); 184 | 185 | $resolver->setDefined('stderr_capture_maxbytes'); 186 | $this->configureByteProperty('stderr_capture_maxbytes', $resolver); 187 | 188 | $resolver->setDefined('stderr_events_enabled') 189 | ->setAllowedTypes('stderr_events_enabled', 'bool'); 190 | 191 | $resolver->setDefined('stderr_syslog') 192 | ->setAllowedTypes('stderr_syslog', 'bool'); 193 | } 194 | } 195 | -------------------------------------------------------------------------------- /src/Section/RpcInterface.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class RpcInterface extends Named 15 | { 16 | /** 17 | * {@inheritdoc} 18 | */ 19 | protected $sectionName = 'rpcinterface'; 20 | 21 | /** 22 | * {@inheritdoc} 23 | */ 24 | protected function configureProperties(OptionsResolver $resolver) 25 | { 26 | $resolver 27 | ->setDefined('supervisor.rpcinterface_factory') 28 | ->setAllowedTypes('supervisor.rpcinterface_factory', 'string'); 29 | 30 | // Note: undocumented, based on examples 31 | $resolver->setDefined('retries') 32 | ->setAllowedTypes('retries', 'int'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Section/SectionData.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | trait SectionData 11 | { 12 | /** 13 | * Name of section (eg. supervisord or program:test). 14 | * 15 | * @var string 16 | */ 17 | protected $name; 18 | 19 | /** 20 | * @var array 21 | */ 22 | protected $properties; 23 | 24 | /** 25 | * {@inheritdoc} 26 | */ 27 | public function getName(): string 28 | { 29 | return $this->name; 30 | } 31 | 32 | /** 33 | * {@inheritdoc} 34 | */ 35 | public function getProperty($key) 36 | { 37 | if (isset($this->properties[$key])) { 38 | return $this->properties[$key]; 39 | } 40 | } 41 | 42 | /** 43 | * {@inheritdoc} 44 | */ 45 | public function hasProperty($key): bool 46 | { 47 | return isset($this->properties[$key]); 48 | } 49 | 50 | /** 51 | * {@inheritdoc} 52 | */ 53 | public function setProperty($key, $value): void 54 | { 55 | $this->properties[$key] = $value; 56 | } 57 | 58 | /** 59 | * {@inheritdoc} 60 | */ 61 | public function getProperties(): array 62 | { 63 | return $this->properties; 64 | } 65 | 66 | /** 67 | * {@inheritdoc} 68 | */ 69 | public function setProperties(array $properties): void 70 | { 71 | $this->properties = $properties; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/Section/SectionInterface.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | interface SectionInterface 11 | { 12 | /** 13 | * Returns the section name. 14 | * 15 | * Should be set explicitly for single sections (eg. supervisord) 16 | * 17 | * @return string 18 | */ 19 | public function getName(): string; 20 | 21 | /** 22 | * Returns a specific property. 23 | * 24 | * @param string $key 25 | * 26 | * @return mixed 27 | */ 28 | public function getProperty($key); 29 | 30 | /** 31 | * Checks if a property exists. 32 | * 33 | * @param string $key 34 | * 35 | * @return bool 36 | */ 37 | public function hasProperty($key): bool; 38 | 39 | /** 40 | * Sets a specific property. 41 | * 42 | * @param string $key 43 | * @param mixed $value 44 | */ 45 | public function setProperty($key, $value): void; 46 | 47 | /** 48 | * Returns the properties as an array. 49 | * 50 | * @return array 51 | */ 52 | public function getProperties(): array; 53 | 54 | /** 55 | * Sets an array of properties. 56 | * 57 | * @param array $properties 58 | */ 59 | public function setProperties(array $properties): void; 60 | } 61 | -------------------------------------------------------------------------------- /src/Section/Supervisorctl.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class Supervisorctl extends Base 15 | { 16 | /** 17 | * {@inheritdoc} 18 | */ 19 | protected $name = 'supervisorctl'; 20 | 21 | /** 22 | * {@inheritdoc} 23 | */ 24 | protected function configureProperties(OptionsResolver $resolver) 25 | { 26 | $resolver 27 | ->setDefined('serverurl') 28 | ->setAllowedTypes('serverurl', 'string'); 29 | 30 | $resolver 31 | ->setDefined('username') 32 | ->setAllowedTypes('username', 'string'); 33 | 34 | $resolver 35 | ->setDefined('password') 36 | ->setAllowedTypes('password', ['string', 'numeric']); 37 | 38 | $resolver 39 | ->setDefined('prompt') 40 | ->setAllowedTypes('prompt', 'string'); 41 | 42 | $resolver 43 | ->setDefined('history_file') 44 | ->setAllowedTypes('history_file', 'string'); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/Section/Supervisord.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class Supervisord extends Base 15 | { 16 | /** 17 | * {@inheritdoc} 18 | */ 19 | protected $name = 'supervisord'; 20 | 21 | protected function configureProperties(OptionsResolver $resolver) 22 | { 23 | $resolver 24 | ->setDefined('logfile') 25 | ->setAllowedTypes('logfile', 'string'); 26 | 27 | $resolver->setDefined('logfile_maxbytes'); 28 | $this->configureByteProperty('logfile_maxbytes', $resolver); 29 | 30 | $resolver->setDefined('logfile_backups') 31 | ->setAllowedTypes('logfile_backups', 'int'); 32 | 33 | $resolver 34 | ->setDefined('loglevel') 35 | ->setAllowedTypes('loglevel', 'string') 36 | ->setAllowedValues('loglevel', ['critical', 'error', 'warn', 'info', 'debug', 'trace', 'blather']); 37 | 38 | $resolver 39 | ->setDefined('pidfile') 40 | ->setAllowedTypes('pidfile', 'string'); 41 | 42 | // TODO: octal vs. decimal value 43 | $resolver->setDefined('umask') 44 | ->setAllowedTypes('umask', 'int'); 45 | 46 | $resolver->setDefined('nodaemon') 47 | ->setAllowedTypes('nodaemon', 'bool'); 48 | 49 | $resolver->setDefined('minfds') 50 | ->setAllowedTypes('minfds', 'int'); 51 | 52 | $resolver->setDefined('minprocs') 53 | ->setAllowedTypes('minprocs', 'int'); 54 | 55 | $resolver->setDefined('nocleanup') 56 | ->setAllowedTypes('nocleanup', 'bool'); 57 | 58 | $resolver 59 | ->setDefined('childlogdir') 60 | ->setAllowedTypes('childlogdir', 'string'); 61 | 62 | $resolver 63 | ->setDefined('user') 64 | ->setAllowedTypes('user', 'string'); 65 | 66 | $resolver 67 | ->setDefined('directory') 68 | ->setAllowedTypes('directory', 'string'); 69 | 70 | $resolver->setDefined('strip_ansi') 71 | ->setAllowedTypes('strip_ansi', 'bool'); 72 | 73 | $this->configureEnvironmentProperty($resolver); 74 | 75 | $resolver 76 | ->setDefined('identifier') 77 | ->setAllowedTypes('identifier', 'string'); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/Section/UnixHttpServer.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class UnixHttpServer extends Base 15 | { 16 | /** 17 | * {@inheritdoc} 18 | */ 19 | protected $name = 'unix_http_server'; 20 | 21 | /** 22 | * {@inheritdoc} 23 | */ 24 | protected function configureProperties(OptionsResolver $resolver) 25 | { 26 | $resolver 27 | ->setDefined('file') 28 | ->setAllowedTypes('file', 'string'); 29 | 30 | // TODO: octal vs. decimal value 31 | $resolver->setDefined('chmod') 32 | ->setAllowedTypes('chmod', 'int'); 33 | 34 | $resolver 35 | ->setDefined('chown') 36 | ->setAllowedTypes('chown', 'string'); 37 | 38 | $resolver 39 | ->setDefined('username') 40 | ->setAllowedTypes('username', 'string'); 41 | 42 | $resolver 43 | ->setDefined('password') 44 | ->setAllowedTypes('password', ['string', 'numeric']); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/Util.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class Util 11 | { 12 | /** 13 | * Checks whether a given value is a valid byte value. 14 | * 15 | * @param string|int $value 16 | * 17 | * @return bool 18 | */ 19 | public static function isByte($value): bool 20 | { 21 | return is_numeric($value) or (is_string($value) and preg_match('/[0-9]+kb|mb|gb/i', $value)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Writer/AbstractWriter.php: -------------------------------------------------------------------------------- 1 | renderer)) { 22 | $this->renderer = new Renderer(Renderer::ARRAY_MODE_CONCAT | Renderer::BOOLEAN_MODE_BOOL_STRING); 23 | } 24 | 25 | return $this->renderer; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Writer/FlysystemWriter.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | final class FlysystemWriter extends AbstractWriter 15 | { 16 | /** 17 | * @var Filesystem 18 | */ 19 | private $filesystem; 20 | 21 | /** 22 | * @var string 23 | */ 24 | private $file; 25 | 26 | /** 27 | * @param Filesystem $filesystem 28 | * @param string $file 29 | */ 30 | public function __construct(Filesystem $filesystem, $file) 31 | { 32 | $this->filesystem = $filesystem; 33 | $this->file = $file; 34 | } 35 | 36 | /** 37 | * {@inheritdoc} 38 | */ 39 | public function write(Configuration $configuration): void 40 | { 41 | $ini = $this->getRenderer()->render($configuration->toArray()); 42 | 43 | if (false === $result = $this->filesystem->put($this->file, $ini)) { 44 | throw new WriterException(sprintf('Cannot write configuration into file %s', $this->file)); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/Writer/IniFileWriter.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | final class IniFileWriter extends AbstractWriter 16 | { 17 | /** 18 | * @var string 19 | */ 20 | private $file; 21 | 22 | /** 23 | * @param string $file 24 | */ 25 | public function __construct(string $file) 26 | { 27 | $this->file = $file; 28 | } 29 | 30 | /** 31 | * {@inheritdoc} 32 | */ 33 | public function write(Configuration $configuration): void 34 | { 35 | $ini = $this->getRenderer()->render($configuration->toArray()); 36 | 37 | if (false === $result = file_put_contents($this->file, $ini)) { 38 | throw new WriterException(sprintf('Cannot write configuration into file %s', $this->file)); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Writer/WriterInterface.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | interface WriterInterface 14 | { 15 | /** 16 | * Writes a Configuration. 17 | * 18 | * @param Configuration $configuration 19 | * 20 | * @throws WriterException 21 | */ 22 | public function write(Configuration $configuration); 23 | } 24 | -------------------------------------------------------------------------------- /src/functions.php: -------------------------------------------------------------------------------- 1 |