├── .gitattributes ├── .github └── workflows │ └── php.yml ├── .gitignore ├── .php-cs-fixer.dist.php ├── CONTRIBUTING.md ├── LICENSE.txt ├── README.md ├── composer.json ├── composer.lock ├── composer.phar ├── contrib ├── pre-commit └── setup.sh ├── phpstan.neon ├── src ├── Client.php ├── GroupmeException.php ├── ImageClient.php └── Services │ ├── BotsService.php │ ├── DirectMessagesService.php │ ├── GroupsService.php │ ├── ImagesService.php │ ├── LeaderboardService.php │ ├── LikesService.php │ ├── MembersService.php │ ├── MessagesService.php │ ├── Service.php │ ├── SmsService.php │ └── UsersService.php └── tests └── ClientTest.php /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/php.yml: -------------------------------------------------------------------------------- 1 | name: Latest Build 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | operating-system: [ubuntu-latest] 16 | php-versions: [ '8.1', '8.2', '8.3' ] 17 | dependency-stability: [ prefer-stable ] 18 | 19 | name: PHP ${{ matrix.php-versions }} - ${{ matrix.dependency-stability }} - ${{ matrix.operating-system}} 20 | 21 | steps: 22 | - uses: actions/checkout@v2 23 | 24 | - name: Install PHP versions 25 | uses: shivammathur/setup-php@v2 26 | with: 27 | php-version: ${{ matrix.php-versions }} 28 | 29 | - name: Install Dependencies 30 | if: steps.vendor-cache.outputs.cache-hit != 'true' 31 | run: php composer.phar install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist 32 | 33 | - name: Run PHPStan 34 | run: php vendor/bin/phpstan 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | vendor/ 3 | tests/.env 4 | .phpunit.result.cache 5 | .php-cs-fixer.cache -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | in(__DIR__); 4 | 5 | return (new PhpCsFixer\Config()) 6 | ->setRules([ 7 | '@PhpCsFixer' => true, 8 | '@DoctrineAnnotation' => true, 9 | 'blank_line_before_statement' => ['statements' => ['return']], 10 | 'concat_space' => ['spacing' => 'one'], 11 | 'declare_parentheses' => true, 12 | 'global_namespace_import' => true, 13 | 'increment_style' => false, 14 | 'multiline_whitespace_before_semicolons' => ['strategy' => 'no_multi_line'], 15 | 'phpdoc_line_span' => ['property' => 'single'], 16 | 'phpdoc_separation' => false, 17 | 'phpdoc_summary' => false, 18 | 'php_unit_internal_class' => false, 19 | 'php_unit_test_class_requires_covers' => false, 20 | 'single_line_throw' => false, 21 | 'yoda_style' => false, 22 | ]) 23 | ->setFinder($finder); -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution Guide 2 | 3 | Run the setup script to add git hooks. The git hook will ensure PHP CS Fixer and PHPStan run after you make changes. 4 | 5 | ~~~~~bash 6 | ./contrib/setup.sh 7 | ~~~~~ 8 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 John Spaetzel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Unofficial PHP Client Library for the GroupMe v3 API 2 | 3 | [![Build](https://github.com/jspaetzel/GroupMePHP/actions/workflows/php.yml/badge.svg)](https://github.com/jspaetzel/GroupMePHP/actions/workflows/php.yml) 4 | [![Packagist Version](https://img.shields.io/packagist/v/jspaetzel/groupme.svg)](https://packagist.org/packages/jspaetzel/groupme) 5 | 6 | Install with [Composer](https://getcomposer.org/) 7 | ~~~~~bash 8 | composer require jspaetzel/groupme 9 | ~~~~~ 10 | 11 | Then use the autoloader to load this library in your code 12 | ~~~~~php 13 | require './vendor/autoload.php'; 14 | ~~~~~ 15 | 16 | ### Examples 17 | These are some basic examples for how to interact with the api via the library. 18 | The APIKEY in these examples is the API key of a user, not a groupme bot key or application key. 19 | 20 | #### For all requests you'll need create a Client 21 | ~~~~~php 22 | $client = new \GroupMePHP\Client('APIKEY'); 23 | ~~~~~ 24 | 25 | #### Send a message to a group 26 | ~~~~~php 27 | $message_to_send = "Hello Group!" 28 | $messages_service = new \GroupMePHP\Services\MessagesService($client); 29 | $messages_service->create(12345678, ["THISISAGUID123", $message_to_send]); 30 | ~~~~~ 31 | 32 | #### Send a direct message to a user 33 | ~~~~~php 34 | $direct_message_service = new \GroupMePHP\Services\DirectMessagesService($client); 35 | $direct_message_service->create([ 36 | "source_guid" => "THISISAGUID123", 37 | "recipient_id" => 12345678, 38 | "text" => 'Hello User' 39 | ]); 40 | ~~~~~ 41 | 42 | #### Get index of groups for authenticated user 43 | ~~~~~php 44 | $group_service = new \GroupMePHP\Services\GroupsService($client); 45 | $response = $group_service->index(); 46 | ~~~~~ 47 | 48 | #### Get only the members of a group as json 49 | ~~~~~php 50 | $group_service = new \GroupMePHP\Services\GroupsService($client); 51 | $response = $group_service->show(1234567); 52 | $members = $response['members']; 53 | ~~~~~ 54 | 55 | ### Want to contribute? 56 | See the [contribution guide](./CONTRIBUTING.md) 57 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jspaetzel/groupme", 3 | "type": "library", 4 | "description": "Groupme Library for PHP", 5 | "keywords": [ 6 | "php", 7 | "groupme" 8 | ], 9 | "homepage": "https://github.com/jspaetzel/GroupMePHP", 10 | "license": "MIT", 11 | "authors": [ 12 | { 13 | "name": "John Spaetzel", 14 | "email": "john.spaetzel@gmail.com", 15 | "homepage": "https://meh.dev/", 16 | "role": "Developer" 17 | } 18 | ], 19 | "require": { 20 | "ext-curl": "*", 21 | "ext-json": "*", 22 | "php": ">=8.1" 23 | }, 24 | "require-dev": { 25 | "phpunit/phpunit": "9.6.19", 26 | "symfony/dotenv": "^6.4.7", 27 | "phpstan/phpstan": "^1.11" 28 | }, 29 | "autoload": { 30 | "psr-4": { 31 | "GroupMePHP\\": "src/" 32 | } 33 | }, 34 | "autoload-dev": { 35 | "psr-4": { 36 | "GroupMePHP\\Tests\\": "tests/" 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /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": "54ec8027f47453266fc89074cf75a40f", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/instantiator", 12 | "version": "2.0.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/instantiator.git", 16 | "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", 21 | "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^8.1" 26 | }, 27 | "require-dev": { 28 | "doctrine/coding-standard": "^11", 29 | "ext-pdo": "*", 30 | "ext-phar": "*", 31 | "phpbench/phpbench": "^1.2", 32 | "phpstan/phpstan": "^1.9.4", 33 | "phpstan/phpstan-phpunit": "^1.3", 34 | "phpunit/phpunit": "^9.5.27", 35 | "vimeo/psalm": "^5.4" 36 | }, 37 | "type": "library", 38 | "autoload": { 39 | "psr-4": { 40 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 41 | } 42 | }, 43 | "notification-url": "https://packagist.org/downloads/", 44 | "license": [ 45 | "MIT" 46 | ], 47 | "authors": [ 48 | { 49 | "name": "Marco Pivetta", 50 | "email": "ocramius@gmail.com", 51 | "homepage": "https://ocramius.github.io/" 52 | } 53 | ], 54 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 55 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 56 | "keywords": [ 57 | "constructor", 58 | "instantiate" 59 | ], 60 | "support": { 61 | "issues": "https://github.com/doctrine/instantiator/issues", 62 | "source": "https://github.com/doctrine/instantiator/tree/2.0.0" 63 | }, 64 | "funding": [ 65 | { 66 | "url": "https://www.doctrine-project.org/sponsorship.html", 67 | "type": "custom" 68 | }, 69 | { 70 | "url": "https://www.patreon.com/phpdoctrine", 71 | "type": "patreon" 72 | }, 73 | { 74 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 75 | "type": "tidelift" 76 | } 77 | ], 78 | "time": "2022-12-30T00:23:10+00:00" 79 | }, 80 | { 81 | "name": "myclabs/deep-copy", 82 | "version": "1.11.1", 83 | "source": { 84 | "type": "git", 85 | "url": "https://github.com/myclabs/DeepCopy.git", 86 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" 87 | }, 88 | "dist": { 89 | "type": "zip", 90 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 91 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 92 | "shasum": "" 93 | }, 94 | "require": { 95 | "php": "^7.1 || ^8.0" 96 | }, 97 | "conflict": { 98 | "doctrine/collections": "<1.6.8", 99 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 100 | }, 101 | "require-dev": { 102 | "doctrine/collections": "^1.6.8", 103 | "doctrine/common": "^2.13.3 || ^3.2.2", 104 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 105 | }, 106 | "type": "library", 107 | "autoload": { 108 | "files": [ 109 | "src/DeepCopy/deep_copy.php" 110 | ], 111 | "psr-4": { 112 | "DeepCopy\\": "src/DeepCopy/" 113 | } 114 | }, 115 | "notification-url": "https://packagist.org/downloads/", 116 | "license": [ 117 | "MIT" 118 | ], 119 | "description": "Create deep copies (clones) of your objects", 120 | "keywords": [ 121 | "clone", 122 | "copy", 123 | "duplicate", 124 | "object", 125 | "object graph" 126 | ], 127 | "support": { 128 | "issues": "https://github.com/myclabs/DeepCopy/issues", 129 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" 130 | }, 131 | "funding": [ 132 | { 133 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 134 | "type": "tidelift" 135 | } 136 | ], 137 | "time": "2023-03-08T13:26:56+00:00" 138 | }, 139 | { 140 | "name": "nikic/php-parser", 141 | "version": "v5.0.2", 142 | "source": { 143 | "type": "git", 144 | "url": "https://github.com/nikic/PHP-Parser.git", 145 | "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" 146 | }, 147 | "dist": { 148 | "type": "zip", 149 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", 150 | "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", 151 | "shasum": "" 152 | }, 153 | "require": { 154 | "ext-ctype": "*", 155 | "ext-json": "*", 156 | "ext-tokenizer": "*", 157 | "php": ">=7.4" 158 | }, 159 | "require-dev": { 160 | "ircmaxell/php-yacc": "^0.0.7", 161 | "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" 162 | }, 163 | "bin": [ 164 | "bin/php-parse" 165 | ], 166 | "type": "library", 167 | "extra": { 168 | "branch-alias": { 169 | "dev-master": "5.0-dev" 170 | } 171 | }, 172 | "autoload": { 173 | "psr-4": { 174 | "PhpParser\\": "lib/PhpParser" 175 | } 176 | }, 177 | "notification-url": "https://packagist.org/downloads/", 178 | "license": [ 179 | "BSD-3-Clause" 180 | ], 181 | "authors": [ 182 | { 183 | "name": "Nikita Popov" 184 | } 185 | ], 186 | "description": "A PHP parser written in PHP", 187 | "keywords": [ 188 | "parser", 189 | "php" 190 | ], 191 | "support": { 192 | "issues": "https://github.com/nikic/PHP-Parser/issues", 193 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" 194 | }, 195 | "time": "2024-03-05T20:51:40+00:00" 196 | }, 197 | { 198 | "name": "phar-io/manifest", 199 | "version": "2.0.4", 200 | "source": { 201 | "type": "git", 202 | "url": "https://github.com/phar-io/manifest.git", 203 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 204 | }, 205 | "dist": { 206 | "type": "zip", 207 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 208 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 209 | "shasum": "" 210 | }, 211 | "require": { 212 | "ext-dom": "*", 213 | "ext-libxml": "*", 214 | "ext-phar": "*", 215 | "ext-xmlwriter": "*", 216 | "phar-io/version": "^3.0.1", 217 | "php": "^7.2 || ^8.0" 218 | }, 219 | "type": "library", 220 | "extra": { 221 | "branch-alias": { 222 | "dev-master": "2.0.x-dev" 223 | } 224 | }, 225 | "autoload": { 226 | "classmap": [ 227 | "src/" 228 | ] 229 | }, 230 | "notification-url": "https://packagist.org/downloads/", 231 | "license": [ 232 | "BSD-3-Clause" 233 | ], 234 | "authors": [ 235 | { 236 | "name": "Arne Blankerts", 237 | "email": "arne@blankerts.de", 238 | "role": "Developer" 239 | }, 240 | { 241 | "name": "Sebastian Heuer", 242 | "email": "sebastian@phpeople.de", 243 | "role": "Developer" 244 | }, 245 | { 246 | "name": "Sebastian Bergmann", 247 | "email": "sebastian@phpunit.de", 248 | "role": "Developer" 249 | } 250 | ], 251 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 252 | "support": { 253 | "issues": "https://github.com/phar-io/manifest/issues", 254 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 255 | }, 256 | "funding": [ 257 | { 258 | "url": "https://github.com/theseer", 259 | "type": "github" 260 | } 261 | ], 262 | "time": "2024-03-03T12:33:53+00:00" 263 | }, 264 | { 265 | "name": "phar-io/version", 266 | "version": "3.2.1", 267 | "source": { 268 | "type": "git", 269 | "url": "https://github.com/phar-io/version.git", 270 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 271 | }, 272 | "dist": { 273 | "type": "zip", 274 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 275 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 276 | "shasum": "" 277 | }, 278 | "require": { 279 | "php": "^7.2 || ^8.0" 280 | }, 281 | "type": "library", 282 | "autoload": { 283 | "classmap": [ 284 | "src/" 285 | ] 286 | }, 287 | "notification-url": "https://packagist.org/downloads/", 288 | "license": [ 289 | "BSD-3-Clause" 290 | ], 291 | "authors": [ 292 | { 293 | "name": "Arne Blankerts", 294 | "email": "arne@blankerts.de", 295 | "role": "Developer" 296 | }, 297 | { 298 | "name": "Sebastian Heuer", 299 | "email": "sebastian@phpeople.de", 300 | "role": "Developer" 301 | }, 302 | { 303 | "name": "Sebastian Bergmann", 304 | "email": "sebastian@phpunit.de", 305 | "role": "Developer" 306 | } 307 | ], 308 | "description": "Library for handling version information and constraints", 309 | "support": { 310 | "issues": "https://github.com/phar-io/version/issues", 311 | "source": "https://github.com/phar-io/version/tree/3.2.1" 312 | }, 313 | "time": "2022-02-21T01:04:05+00:00" 314 | }, 315 | { 316 | "name": "phpstan/phpstan", 317 | "version": "1.11.1", 318 | "source": { 319 | "type": "git", 320 | "url": "https://github.com/phpstan/phpstan.git", 321 | "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b" 322 | }, 323 | "dist": { 324 | "type": "zip", 325 | "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e524358f930e41a2b4cca1320e3b04fc26b39e0b", 326 | "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b", 327 | "shasum": "" 328 | }, 329 | "require": { 330 | "php": "^7.2|^8.0" 331 | }, 332 | "conflict": { 333 | "phpstan/phpstan-shim": "*" 334 | }, 335 | "bin": [ 336 | "phpstan", 337 | "phpstan.phar" 338 | ], 339 | "type": "library", 340 | "autoload": { 341 | "files": [ 342 | "bootstrap.php" 343 | ] 344 | }, 345 | "notification-url": "https://packagist.org/downloads/", 346 | "license": [ 347 | "MIT" 348 | ], 349 | "description": "PHPStan - PHP Static Analysis Tool", 350 | "keywords": [ 351 | "dev", 352 | "static analysis" 353 | ], 354 | "support": { 355 | "docs": "https://phpstan.org/user-guide/getting-started", 356 | "forum": "https://github.com/phpstan/phpstan/discussions", 357 | "issues": "https://github.com/phpstan/phpstan/issues", 358 | "security": "https://github.com/phpstan/phpstan/security/policy", 359 | "source": "https://github.com/phpstan/phpstan-src" 360 | }, 361 | "funding": [ 362 | { 363 | "url": "https://github.com/ondrejmirtes", 364 | "type": "github" 365 | }, 366 | { 367 | "url": "https://github.com/phpstan", 368 | "type": "github" 369 | } 370 | ], 371 | "time": "2024-05-15T08:00:59+00:00" 372 | }, 373 | { 374 | "name": "phpunit/php-code-coverage", 375 | "version": "9.2.31", 376 | "source": { 377 | "type": "git", 378 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 379 | "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" 380 | }, 381 | "dist": { 382 | "type": "zip", 383 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", 384 | "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", 385 | "shasum": "" 386 | }, 387 | "require": { 388 | "ext-dom": "*", 389 | "ext-libxml": "*", 390 | "ext-xmlwriter": "*", 391 | "nikic/php-parser": "^4.18 || ^5.0", 392 | "php": ">=7.3", 393 | "phpunit/php-file-iterator": "^3.0.3", 394 | "phpunit/php-text-template": "^2.0.2", 395 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 396 | "sebastian/complexity": "^2.0", 397 | "sebastian/environment": "^5.1.2", 398 | "sebastian/lines-of-code": "^1.0.3", 399 | "sebastian/version": "^3.0.1", 400 | "theseer/tokenizer": "^1.2.0" 401 | }, 402 | "require-dev": { 403 | "phpunit/phpunit": "^9.3" 404 | }, 405 | "suggest": { 406 | "ext-pcov": "PHP extension that provides line coverage", 407 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 408 | }, 409 | "type": "library", 410 | "extra": { 411 | "branch-alias": { 412 | "dev-master": "9.2-dev" 413 | } 414 | }, 415 | "autoload": { 416 | "classmap": [ 417 | "src/" 418 | ] 419 | }, 420 | "notification-url": "https://packagist.org/downloads/", 421 | "license": [ 422 | "BSD-3-Clause" 423 | ], 424 | "authors": [ 425 | { 426 | "name": "Sebastian Bergmann", 427 | "email": "sebastian@phpunit.de", 428 | "role": "lead" 429 | } 430 | ], 431 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 432 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 433 | "keywords": [ 434 | "coverage", 435 | "testing", 436 | "xunit" 437 | ], 438 | "support": { 439 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 440 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 441 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" 442 | }, 443 | "funding": [ 444 | { 445 | "url": "https://github.com/sebastianbergmann", 446 | "type": "github" 447 | } 448 | ], 449 | "time": "2024-03-02T06:37:42+00:00" 450 | }, 451 | { 452 | "name": "phpunit/php-file-iterator", 453 | "version": "3.0.6", 454 | "source": { 455 | "type": "git", 456 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 457 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 458 | }, 459 | "dist": { 460 | "type": "zip", 461 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 462 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 463 | "shasum": "" 464 | }, 465 | "require": { 466 | "php": ">=7.3" 467 | }, 468 | "require-dev": { 469 | "phpunit/phpunit": "^9.3" 470 | }, 471 | "type": "library", 472 | "extra": { 473 | "branch-alias": { 474 | "dev-master": "3.0-dev" 475 | } 476 | }, 477 | "autoload": { 478 | "classmap": [ 479 | "src/" 480 | ] 481 | }, 482 | "notification-url": "https://packagist.org/downloads/", 483 | "license": [ 484 | "BSD-3-Clause" 485 | ], 486 | "authors": [ 487 | { 488 | "name": "Sebastian Bergmann", 489 | "email": "sebastian@phpunit.de", 490 | "role": "lead" 491 | } 492 | ], 493 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 494 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 495 | "keywords": [ 496 | "filesystem", 497 | "iterator" 498 | ], 499 | "support": { 500 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 501 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 502 | }, 503 | "funding": [ 504 | { 505 | "url": "https://github.com/sebastianbergmann", 506 | "type": "github" 507 | } 508 | ], 509 | "time": "2021-12-02T12:48:52+00:00" 510 | }, 511 | { 512 | "name": "phpunit/php-invoker", 513 | "version": "3.1.1", 514 | "source": { 515 | "type": "git", 516 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 517 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 518 | }, 519 | "dist": { 520 | "type": "zip", 521 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 522 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 523 | "shasum": "" 524 | }, 525 | "require": { 526 | "php": ">=7.3" 527 | }, 528 | "require-dev": { 529 | "ext-pcntl": "*", 530 | "phpunit/phpunit": "^9.3" 531 | }, 532 | "suggest": { 533 | "ext-pcntl": "*" 534 | }, 535 | "type": "library", 536 | "extra": { 537 | "branch-alias": { 538 | "dev-master": "3.1-dev" 539 | } 540 | }, 541 | "autoload": { 542 | "classmap": [ 543 | "src/" 544 | ] 545 | }, 546 | "notification-url": "https://packagist.org/downloads/", 547 | "license": [ 548 | "BSD-3-Clause" 549 | ], 550 | "authors": [ 551 | { 552 | "name": "Sebastian Bergmann", 553 | "email": "sebastian@phpunit.de", 554 | "role": "lead" 555 | } 556 | ], 557 | "description": "Invoke callables with a timeout", 558 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 559 | "keywords": [ 560 | "process" 561 | ], 562 | "support": { 563 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 564 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 565 | }, 566 | "funding": [ 567 | { 568 | "url": "https://github.com/sebastianbergmann", 569 | "type": "github" 570 | } 571 | ], 572 | "time": "2020-09-28T05:58:55+00:00" 573 | }, 574 | { 575 | "name": "phpunit/php-text-template", 576 | "version": "2.0.4", 577 | "source": { 578 | "type": "git", 579 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 580 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 581 | }, 582 | "dist": { 583 | "type": "zip", 584 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 585 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 586 | "shasum": "" 587 | }, 588 | "require": { 589 | "php": ">=7.3" 590 | }, 591 | "require-dev": { 592 | "phpunit/phpunit": "^9.3" 593 | }, 594 | "type": "library", 595 | "extra": { 596 | "branch-alias": { 597 | "dev-master": "2.0-dev" 598 | } 599 | }, 600 | "autoload": { 601 | "classmap": [ 602 | "src/" 603 | ] 604 | }, 605 | "notification-url": "https://packagist.org/downloads/", 606 | "license": [ 607 | "BSD-3-Clause" 608 | ], 609 | "authors": [ 610 | { 611 | "name": "Sebastian Bergmann", 612 | "email": "sebastian@phpunit.de", 613 | "role": "lead" 614 | } 615 | ], 616 | "description": "Simple template engine.", 617 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 618 | "keywords": [ 619 | "template" 620 | ], 621 | "support": { 622 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 623 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 624 | }, 625 | "funding": [ 626 | { 627 | "url": "https://github.com/sebastianbergmann", 628 | "type": "github" 629 | } 630 | ], 631 | "time": "2020-10-26T05:33:50+00:00" 632 | }, 633 | { 634 | "name": "phpunit/php-timer", 635 | "version": "5.0.3", 636 | "source": { 637 | "type": "git", 638 | "url": "https://github.com/sebastianbergmann/php-timer.git", 639 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 640 | }, 641 | "dist": { 642 | "type": "zip", 643 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 644 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 645 | "shasum": "" 646 | }, 647 | "require": { 648 | "php": ">=7.3" 649 | }, 650 | "require-dev": { 651 | "phpunit/phpunit": "^9.3" 652 | }, 653 | "type": "library", 654 | "extra": { 655 | "branch-alias": { 656 | "dev-master": "5.0-dev" 657 | } 658 | }, 659 | "autoload": { 660 | "classmap": [ 661 | "src/" 662 | ] 663 | }, 664 | "notification-url": "https://packagist.org/downloads/", 665 | "license": [ 666 | "BSD-3-Clause" 667 | ], 668 | "authors": [ 669 | { 670 | "name": "Sebastian Bergmann", 671 | "email": "sebastian@phpunit.de", 672 | "role": "lead" 673 | } 674 | ], 675 | "description": "Utility class for timing", 676 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 677 | "keywords": [ 678 | "timer" 679 | ], 680 | "support": { 681 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 682 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 683 | }, 684 | "funding": [ 685 | { 686 | "url": "https://github.com/sebastianbergmann", 687 | "type": "github" 688 | } 689 | ], 690 | "time": "2020-10-26T13:16:10+00:00" 691 | }, 692 | { 693 | "name": "phpunit/phpunit", 694 | "version": "9.6.19", 695 | "source": { 696 | "type": "git", 697 | "url": "https://github.com/sebastianbergmann/phpunit.git", 698 | "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" 699 | }, 700 | "dist": { 701 | "type": "zip", 702 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", 703 | "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", 704 | "shasum": "" 705 | }, 706 | "require": { 707 | "doctrine/instantiator": "^1.3.1 || ^2", 708 | "ext-dom": "*", 709 | "ext-json": "*", 710 | "ext-libxml": "*", 711 | "ext-mbstring": "*", 712 | "ext-xml": "*", 713 | "ext-xmlwriter": "*", 714 | "myclabs/deep-copy": "^1.10.1", 715 | "phar-io/manifest": "^2.0.3", 716 | "phar-io/version": "^3.0.2", 717 | "php": ">=7.3", 718 | "phpunit/php-code-coverage": "^9.2.28", 719 | "phpunit/php-file-iterator": "^3.0.5", 720 | "phpunit/php-invoker": "^3.1.1", 721 | "phpunit/php-text-template": "^2.0.3", 722 | "phpunit/php-timer": "^5.0.2", 723 | "sebastian/cli-parser": "^1.0.1", 724 | "sebastian/code-unit": "^1.0.6", 725 | "sebastian/comparator": "^4.0.8", 726 | "sebastian/diff": "^4.0.3", 727 | "sebastian/environment": "^5.1.3", 728 | "sebastian/exporter": "^4.0.5", 729 | "sebastian/global-state": "^5.0.1", 730 | "sebastian/object-enumerator": "^4.0.3", 731 | "sebastian/resource-operations": "^3.0.3", 732 | "sebastian/type": "^3.2", 733 | "sebastian/version": "^3.0.2" 734 | }, 735 | "suggest": { 736 | "ext-soap": "To be able to generate mocks based on WSDL files", 737 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 738 | }, 739 | "bin": [ 740 | "phpunit" 741 | ], 742 | "type": "library", 743 | "extra": { 744 | "branch-alias": { 745 | "dev-master": "9.6-dev" 746 | } 747 | }, 748 | "autoload": { 749 | "files": [ 750 | "src/Framework/Assert/Functions.php" 751 | ], 752 | "classmap": [ 753 | "src/" 754 | ] 755 | }, 756 | "notification-url": "https://packagist.org/downloads/", 757 | "license": [ 758 | "BSD-3-Clause" 759 | ], 760 | "authors": [ 761 | { 762 | "name": "Sebastian Bergmann", 763 | "email": "sebastian@phpunit.de", 764 | "role": "lead" 765 | } 766 | ], 767 | "description": "The PHP Unit Testing framework.", 768 | "homepage": "https://phpunit.de/", 769 | "keywords": [ 770 | "phpunit", 771 | "testing", 772 | "xunit" 773 | ], 774 | "support": { 775 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 776 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 777 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" 778 | }, 779 | "funding": [ 780 | { 781 | "url": "https://phpunit.de/sponsors.html", 782 | "type": "custom" 783 | }, 784 | { 785 | "url": "https://github.com/sebastianbergmann", 786 | "type": "github" 787 | }, 788 | { 789 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 790 | "type": "tidelift" 791 | } 792 | ], 793 | "time": "2024-04-05T04:35:58+00:00" 794 | }, 795 | { 796 | "name": "sebastian/cli-parser", 797 | "version": "1.0.2", 798 | "source": { 799 | "type": "git", 800 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 801 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" 802 | }, 803 | "dist": { 804 | "type": "zip", 805 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 806 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 807 | "shasum": "" 808 | }, 809 | "require": { 810 | "php": ">=7.3" 811 | }, 812 | "require-dev": { 813 | "phpunit/phpunit": "^9.3" 814 | }, 815 | "type": "library", 816 | "extra": { 817 | "branch-alias": { 818 | "dev-master": "1.0-dev" 819 | } 820 | }, 821 | "autoload": { 822 | "classmap": [ 823 | "src/" 824 | ] 825 | }, 826 | "notification-url": "https://packagist.org/downloads/", 827 | "license": [ 828 | "BSD-3-Clause" 829 | ], 830 | "authors": [ 831 | { 832 | "name": "Sebastian Bergmann", 833 | "email": "sebastian@phpunit.de", 834 | "role": "lead" 835 | } 836 | ], 837 | "description": "Library for parsing CLI options", 838 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 839 | "support": { 840 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 841 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" 842 | }, 843 | "funding": [ 844 | { 845 | "url": "https://github.com/sebastianbergmann", 846 | "type": "github" 847 | } 848 | ], 849 | "time": "2024-03-02T06:27:43+00:00" 850 | }, 851 | { 852 | "name": "sebastian/code-unit", 853 | "version": "1.0.8", 854 | "source": { 855 | "type": "git", 856 | "url": "https://github.com/sebastianbergmann/code-unit.git", 857 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 858 | }, 859 | "dist": { 860 | "type": "zip", 861 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 862 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 863 | "shasum": "" 864 | }, 865 | "require": { 866 | "php": ">=7.3" 867 | }, 868 | "require-dev": { 869 | "phpunit/phpunit": "^9.3" 870 | }, 871 | "type": "library", 872 | "extra": { 873 | "branch-alias": { 874 | "dev-master": "1.0-dev" 875 | } 876 | }, 877 | "autoload": { 878 | "classmap": [ 879 | "src/" 880 | ] 881 | }, 882 | "notification-url": "https://packagist.org/downloads/", 883 | "license": [ 884 | "BSD-3-Clause" 885 | ], 886 | "authors": [ 887 | { 888 | "name": "Sebastian Bergmann", 889 | "email": "sebastian@phpunit.de", 890 | "role": "lead" 891 | } 892 | ], 893 | "description": "Collection of value objects that represent the PHP code units", 894 | "homepage": "https://github.com/sebastianbergmann/code-unit", 895 | "support": { 896 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 897 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 898 | }, 899 | "funding": [ 900 | { 901 | "url": "https://github.com/sebastianbergmann", 902 | "type": "github" 903 | } 904 | ], 905 | "time": "2020-10-26T13:08:54+00:00" 906 | }, 907 | { 908 | "name": "sebastian/code-unit-reverse-lookup", 909 | "version": "2.0.3", 910 | "source": { 911 | "type": "git", 912 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 913 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 914 | }, 915 | "dist": { 916 | "type": "zip", 917 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 918 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 919 | "shasum": "" 920 | }, 921 | "require": { 922 | "php": ">=7.3" 923 | }, 924 | "require-dev": { 925 | "phpunit/phpunit": "^9.3" 926 | }, 927 | "type": "library", 928 | "extra": { 929 | "branch-alias": { 930 | "dev-master": "2.0-dev" 931 | } 932 | }, 933 | "autoload": { 934 | "classmap": [ 935 | "src/" 936 | ] 937 | }, 938 | "notification-url": "https://packagist.org/downloads/", 939 | "license": [ 940 | "BSD-3-Clause" 941 | ], 942 | "authors": [ 943 | { 944 | "name": "Sebastian Bergmann", 945 | "email": "sebastian@phpunit.de" 946 | } 947 | ], 948 | "description": "Looks up which function or method a line of code belongs to", 949 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 950 | "support": { 951 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 952 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 953 | }, 954 | "funding": [ 955 | { 956 | "url": "https://github.com/sebastianbergmann", 957 | "type": "github" 958 | } 959 | ], 960 | "time": "2020-09-28T05:30:19+00:00" 961 | }, 962 | { 963 | "name": "sebastian/comparator", 964 | "version": "4.0.8", 965 | "source": { 966 | "type": "git", 967 | "url": "https://github.com/sebastianbergmann/comparator.git", 968 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 969 | }, 970 | "dist": { 971 | "type": "zip", 972 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 973 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 974 | "shasum": "" 975 | }, 976 | "require": { 977 | "php": ">=7.3", 978 | "sebastian/diff": "^4.0", 979 | "sebastian/exporter": "^4.0" 980 | }, 981 | "require-dev": { 982 | "phpunit/phpunit": "^9.3" 983 | }, 984 | "type": "library", 985 | "extra": { 986 | "branch-alias": { 987 | "dev-master": "4.0-dev" 988 | } 989 | }, 990 | "autoload": { 991 | "classmap": [ 992 | "src/" 993 | ] 994 | }, 995 | "notification-url": "https://packagist.org/downloads/", 996 | "license": [ 997 | "BSD-3-Clause" 998 | ], 999 | "authors": [ 1000 | { 1001 | "name": "Sebastian Bergmann", 1002 | "email": "sebastian@phpunit.de" 1003 | }, 1004 | { 1005 | "name": "Jeff Welch", 1006 | "email": "whatthejeff@gmail.com" 1007 | }, 1008 | { 1009 | "name": "Volker Dusch", 1010 | "email": "github@wallbash.com" 1011 | }, 1012 | { 1013 | "name": "Bernhard Schussek", 1014 | "email": "bschussek@2bepublished.at" 1015 | } 1016 | ], 1017 | "description": "Provides the functionality to compare PHP values for equality", 1018 | "homepage": "https://github.com/sebastianbergmann/comparator", 1019 | "keywords": [ 1020 | "comparator", 1021 | "compare", 1022 | "equality" 1023 | ], 1024 | "support": { 1025 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1026 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 1027 | }, 1028 | "funding": [ 1029 | { 1030 | "url": "https://github.com/sebastianbergmann", 1031 | "type": "github" 1032 | } 1033 | ], 1034 | "time": "2022-09-14T12:41:17+00:00" 1035 | }, 1036 | { 1037 | "name": "sebastian/complexity", 1038 | "version": "2.0.3", 1039 | "source": { 1040 | "type": "git", 1041 | "url": "https://github.com/sebastianbergmann/complexity.git", 1042 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" 1043 | }, 1044 | "dist": { 1045 | "type": "zip", 1046 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", 1047 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", 1048 | "shasum": "" 1049 | }, 1050 | "require": { 1051 | "nikic/php-parser": "^4.18 || ^5.0", 1052 | "php": ">=7.3" 1053 | }, 1054 | "require-dev": { 1055 | "phpunit/phpunit": "^9.3" 1056 | }, 1057 | "type": "library", 1058 | "extra": { 1059 | "branch-alias": { 1060 | "dev-master": "2.0-dev" 1061 | } 1062 | }, 1063 | "autoload": { 1064 | "classmap": [ 1065 | "src/" 1066 | ] 1067 | }, 1068 | "notification-url": "https://packagist.org/downloads/", 1069 | "license": [ 1070 | "BSD-3-Clause" 1071 | ], 1072 | "authors": [ 1073 | { 1074 | "name": "Sebastian Bergmann", 1075 | "email": "sebastian@phpunit.de", 1076 | "role": "lead" 1077 | } 1078 | ], 1079 | "description": "Library for calculating the complexity of PHP code units", 1080 | "homepage": "https://github.com/sebastianbergmann/complexity", 1081 | "support": { 1082 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1083 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" 1084 | }, 1085 | "funding": [ 1086 | { 1087 | "url": "https://github.com/sebastianbergmann", 1088 | "type": "github" 1089 | } 1090 | ], 1091 | "time": "2023-12-22T06:19:30+00:00" 1092 | }, 1093 | { 1094 | "name": "sebastian/diff", 1095 | "version": "4.0.6", 1096 | "source": { 1097 | "type": "git", 1098 | "url": "https://github.com/sebastianbergmann/diff.git", 1099 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" 1100 | }, 1101 | "dist": { 1102 | "type": "zip", 1103 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", 1104 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", 1105 | "shasum": "" 1106 | }, 1107 | "require": { 1108 | "php": ">=7.3" 1109 | }, 1110 | "require-dev": { 1111 | "phpunit/phpunit": "^9.3", 1112 | "symfony/process": "^4.2 || ^5" 1113 | }, 1114 | "type": "library", 1115 | "extra": { 1116 | "branch-alias": { 1117 | "dev-master": "4.0-dev" 1118 | } 1119 | }, 1120 | "autoload": { 1121 | "classmap": [ 1122 | "src/" 1123 | ] 1124 | }, 1125 | "notification-url": "https://packagist.org/downloads/", 1126 | "license": [ 1127 | "BSD-3-Clause" 1128 | ], 1129 | "authors": [ 1130 | { 1131 | "name": "Sebastian Bergmann", 1132 | "email": "sebastian@phpunit.de" 1133 | }, 1134 | { 1135 | "name": "Kore Nordmann", 1136 | "email": "mail@kore-nordmann.de" 1137 | } 1138 | ], 1139 | "description": "Diff implementation", 1140 | "homepage": "https://github.com/sebastianbergmann/diff", 1141 | "keywords": [ 1142 | "diff", 1143 | "udiff", 1144 | "unidiff", 1145 | "unified diff" 1146 | ], 1147 | "support": { 1148 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1149 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" 1150 | }, 1151 | "funding": [ 1152 | { 1153 | "url": "https://github.com/sebastianbergmann", 1154 | "type": "github" 1155 | } 1156 | ], 1157 | "time": "2024-03-02T06:30:58+00:00" 1158 | }, 1159 | { 1160 | "name": "sebastian/environment", 1161 | "version": "5.1.5", 1162 | "source": { 1163 | "type": "git", 1164 | "url": "https://github.com/sebastianbergmann/environment.git", 1165 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" 1166 | }, 1167 | "dist": { 1168 | "type": "zip", 1169 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1170 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1171 | "shasum": "" 1172 | }, 1173 | "require": { 1174 | "php": ">=7.3" 1175 | }, 1176 | "require-dev": { 1177 | "phpunit/phpunit": "^9.3" 1178 | }, 1179 | "suggest": { 1180 | "ext-posix": "*" 1181 | }, 1182 | "type": "library", 1183 | "extra": { 1184 | "branch-alias": { 1185 | "dev-master": "5.1-dev" 1186 | } 1187 | }, 1188 | "autoload": { 1189 | "classmap": [ 1190 | "src/" 1191 | ] 1192 | }, 1193 | "notification-url": "https://packagist.org/downloads/", 1194 | "license": [ 1195 | "BSD-3-Clause" 1196 | ], 1197 | "authors": [ 1198 | { 1199 | "name": "Sebastian Bergmann", 1200 | "email": "sebastian@phpunit.de" 1201 | } 1202 | ], 1203 | "description": "Provides functionality to handle HHVM/PHP environments", 1204 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1205 | "keywords": [ 1206 | "Xdebug", 1207 | "environment", 1208 | "hhvm" 1209 | ], 1210 | "support": { 1211 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1212 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" 1213 | }, 1214 | "funding": [ 1215 | { 1216 | "url": "https://github.com/sebastianbergmann", 1217 | "type": "github" 1218 | } 1219 | ], 1220 | "time": "2023-02-03T06:03:51+00:00" 1221 | }, 1222 | { 1223 | "name": "sebastian/exporter", 1224 | "version": "4.0.6", 1225 | "source": { 1226 | "type": "git", 1227 | "url": "https://github.com/sebastianbergmann/exporter.git", 1228 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" 1229 | }, 1230 | "dist": { 1231 | "type": "zip", 1232 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", 1233 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", 1234 | "shasum": "" 1235 | }, 1236 | "require": { 1237 | "php": ">=7.3", 1238 | "sebastian/recursion-context": "^4.0" 1239 | }, 1240 | "require-dev": { 1241 | "ext-mbstring": "*", 1242 | "phpunit/phpunit": "^9.3" 1243 | }, 1244 | "type": "library", 1245 | "extra": { 1246 | "branch-alias": { 1247 | "dev-master": "4.0-dev" 1248 | } 1249 | }, 1250 | "autoload": { 1251 | "classmap": [ 1252 | "src/" 1253 | ] 1254 | }, 1255 | "notification-url": "https://packagist.org/downloads/", 1256 | "license": [ 1257 | "BSD-3-Clause" 1258 | ], 1259 | "authors": [ 1260 | { 1261 | "name": "Sebastian Bergmann", 1262 | "email": "sebastian@phpunit.de" 1263 | }, 1264 | { 1265 | "name": "Jeff Welch", 1266 | "email": "whatthejeff@gmail.com" 1267 | }, 1268 | { 1269 | "name": "Volker Dusch", 1270 | "email": "github@wallbash.com" 1271 | }, 1272 | { 1273 | "name": "Adam Harvey", 1274 | "email": "aharvey@php.net" 1275 | }, 1276 | { 1277 | "name": "Bernhard Schussek", 1278 | "email": "bschussek@gmail.com" 1279 | } 1280 | ], 1281 | "description": "Provides the functionality to export PHP variables for visualization", 1282 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1283 | "keywords": [ 1284 | "export", 1285 | "exporter" 1286 | ], 1287 | "support": { 1288 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1289 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" 1290 | }, 1291 | "funding": [ 1292 | { 1293 | "url": "https://github.com/sebastianbergmann", 1294 | "type": "github" 1295 | } 1296 | ], 1297 | "time": "2024-03-02T06:33:00+00:00" 1298 | }, 1299 | { 1300 | "name": "sebastian/global-state", 1301 | "version": "5.0.7", 1302 | "source": { 1303 | "type": "git", 1304 | "url": "https://github.com/sebastianbergmann/global-state.git", 1305 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" 1306 | }, 1307 | "dist": { 1308 | "type": "zip", 1309 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 1310 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 1311 | "shasum": "" 1312 | }, 1313 | "require": { 1314 | "php": ">=7.3", 1315 | "sebastian/object-reflector": "^2.0", 1316 | "sebastian/recursion-context": "^4.0" 1317 | }, 1318 | "require-dev": { 1319 | "ext-dom": "*", 1320 | "phpunit/phpunit": "^9.3" 1321 | }, 1322 | "suggest": { 1323 | "ext-uopz": "*" 1324 | }, 1325 | "type": "library", 1326 | "extra": { 1327 | "branch-alias": { 1328 | "dev-master": "5.0-dev" 1329 | } 1330 | }, 1331 | "autoload": { 1332 | "classmap": [ 1333 | "src/" 1334 | ] 1335 | }, 1336 | "notification-url": "https://packagist.org/downloads/", 1337 | "license": [ 1338 | "BSD-3-Clause" 1339 | ], 1340 | "authors": [ 1341 | { 1342 | "name": "Sebastian Bergmann", 1343 | "email": "sebastian@phpunit.de" 1344 | } 1345 | ], 1346 | "description": "Snapshotting of global state", 1347 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1348 | "keywords": [ 1349 | "global state" 1350 | ], 1351 | "support": { 1352 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1353 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" 1354 | }, 1355 | "funding": [ 1356 | { 1357 | "url": "https://github.com/sebastianbergmann", 1358 | "type": "github" 1359 | } 1360 | ], 1361 | "time": "2024-03-02T06:35:11+00:00" 1362 | }, 1363 | { 1364 | "name": "sebastian/lines-of-code", 1365 | "version": "1.0.4", 1366 | "source": { 1367 | "type": "git", 1368 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1369 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" 1370 | }, 1371 | "dist": { 1372 | "type": "zip", 1373 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", 1374 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", 1375 | "shasum": "" 1376 | }, 1377 | "require": { 1378 | "nikic/php-parser": "^4.18 || ^5.0", 1379 | "php": ">=7.3" 1380 | }, 1381 | "require-dev": { 1382 | "phpunit/phpunit": "^9.3" 1383 | }, 1384 | "type": "library", 1385 | "extra": { 1386 | "branch-alias": { 1387 | "dev-master": "1.0-dev" 1388 | } 1389 | }, 1390 | "autoload": { 1391 | "classmap": [ 1392 | "src/" 1393 | ] 1394 | }, 1395 | "notification-url": "https://packagist.org/downloads/", 1396 | "license": [ 1397 | "BSD-3-Clause" 1398 | ], 1399 | "authors": [ 1400 | { 1401 | "name": "Sebastian Bergmann", 1402 | "email": "sebastian@phpunit.de", 1403 | "role": "lead" 1404 | } 1405 | ], 1406 | "description": "Library for counting the lines of code in PHP source code", 1407 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1408 | "support": { 1409 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1410 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" 1411 | }, 1412 | "funding": [ 1413 | { 1414 | "url": "https://github.com/sebastianbergmann", 1415 | "type": "github" 1416 | } 1417 | ], 1418 | "time": "2023-12-22T06:20:34+00:00" 1419 | }, 1420 | { 1421 | "name": "sebastian/object-enumerator", 1422 | "version": "4.0.4", 1423 | "source": { 1424 | "type": "git", 1425 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1426 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 1427 | }, 1428 | "dist": { 1429 | "type": "zip", 1430 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 1431 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 1432 | "shasum": "" 1433 | }, 1434 | "require": { 1435 | "php": ">=7.3", 1436 | "sebastian/object-reflector": "^2.0", 1437 | "sebastian/recursion-context": "^4.0" 1438 | }, 1439 | "require-dev": { 1440 | "phpunit/phpunit": "^9.3" 1441 | }, 1442 | "type": "library", 1443 | "extra": { 1444 | "branch-alias": { 1445 | "dev-master": "4.0-dev" 1446 | } 1447 | }, 1448 | "autoload": { 1449 | "classmap": [ 1450 | "src/" 1451 | ] 1452 | }, 1453 | "notification-url": "https://packagist.org/downloads/", 1454 | "license": [ 1455 | "BSD-3-Clause" 1456 | ], 1457 | "authors": [ 1458 | { 1459 | "name": "Sebastian Bergmann", 1460 | "email": "sebastian@phpunit.de" 1461 | } 1462 | ], 1463 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1464 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1465 | "support": { 1466 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1467 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 1468 | }, 1469 | "funding": [ 1470 | { 1471 | "url": "https://github.com/sebastianbergmann", 1472 | "type": "github" 1473 | } 1474 | ], 1475 | "time": "2020-10-26T13:12:34+00:00" 1476 | }, 1477 | { 1478 | "name": "sebastian/object-reflector", 1479 | "version": "2.0.4", 1480 | "source": { 1481 | "type": "git", 1482 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1483 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 1484 | }, 1485 | "dist": { 1486 | "type": "zip", 1487 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1488 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1489 | "shasum": "" 1490 | }, 1491 | "require": { 1492 | "php": ">=7.3" 1493 | }, 1494 | "require-dev": { 1495 | "phpunit/phpunit": "^9.3" 1496 | }, 1497 | "type": "library", 1498 | "extra": { 1499 | "branch-alias": { 1500 | "dev-master": "2.0-dev" 1501 | } 1502 | }, 1503 | "autoload": { 1504 | "classmap": [ 1505 | "src/" 1506 | ] 1507 | }, 1508 | "notification-url": "https://packagist.org/downloads/", 1509 | "license": [ 1510 | "BSD-3-Clause" 1511 | ], 1512 | "authors": [ 1513 | { 1514 | "name": "Sebastian Bergmann", 1515 | "email": "sebastian@phpunit.de" 1516 | } 1517 | ], 1518 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1519 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1520 | "support": { 1521 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1522 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 1523 | }, 1524 | "funding": [ 1525 | { 1526 | "url": "https://github.com/sebastianbergmann", 1527 | "type": "github" 1528 | } 1529 | ], 1530 | "time": "2020-10-26T13:14:26+00:00" 1531 | }, 1532 | { 1533 | "name": "sebastian/recursion-context", 1534 | "version": "4.0.5", 1535 | "source": { 1536 | "type": "git", 1537 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1538 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" 1539 | }, 1540 | "dist": { 1541 | "type": "zip", 1542 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1543 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1544 | "shasum": "" 1545 | }, 1546 | "require": { 1547 | "php": ">=7.3" 1548 | }, 1549 | "require-dev": { 1550 | "phpunit/phpunit": "^9.3" 1551 | }, 1552 | "type": "library", 1553 | "extra": { 1554 | "branch-alias": { 1555 | "dev-master": "4.0-dev" 1556 | } 1557 | }, 1558 | "autoload": { 1559 | "classmap": [ 1560 | "src/" 1561 | ] 1562 | }, 1563 | "notification-url": "https://packagist.org/downloads/", 1564 | "license": [ 1565 | "BSD-3-Clause" 1566 | ], 1567 | "authors": [ 1568 | { 1569 | "name": "Sebastian Bergmann", 1570 | "email": "sebastian@phpunit.de" 1571 | }, 1572 | { 1573 | "name": "Jeff Welch", 1574 | "email": "whatthejeff@gmail.com" 1575 | }, 1576 | { 1577 | "name": "Adam Harvey", 1578 | "email": "aharvey@php.net" 1579 | } 1580 | ], 1581 | "description": "Provides functionality to recursively process PHP variables", 1582 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 1583 | "support": { 1584 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1585 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" 1586 | }, 1587 | "funding": [ 1588 | { 1589 | "url": "https://github.com/sebastianbergmann", 1590 | "type": "github" 1591 | } 1592 | ], 1593 | "time": "2023-02-03T06:07:39+00:00" 1594 | }, 1595 | { 1596 | "name": "sebastian/resource-operations", 1597 | "version": "3.0.4", 1598 | "source": { 1599 | "type": "git", 1600 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1601 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" 1602 | }, 1603 | "dist": { 1604 | "type": "zip", 1605 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 1606 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 1607 | "shasum": "" 1608 | }, 1609 | "require": { 1610 | "php": ">=7.3" 1611 | }, 1612 | "require-dev": { 1613 | "phpunit/phpunit": "^9.0" 1614 | }, 1615 | "type": "library", 1616 | "extra": { 1617 | "branch-alias": { 1618 | "dev-main": "3.0-dev" 1619 | } 1620 | }, 1621 | "autoload": { 1622 | "classmap": [ 1623 | "src/" 1624 | ] 1625 | }, 1626 | "notification-url": "https://packagist.org/downloads/", 1627 | "license": [ 1628 | "BSD-3-Clause" 1629 | ], 1630 | "authors": [ 1631 | { 1632 | "name": "Sebastian Bergmann", 1633 | "email": "sebastian@phpunit.de" 1634 | } 1635 | ], 1636 | "description": "Provides a list of PHP built-in functions that operate on resources", 1637 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1638 | "support": { 1639 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" 1640 | }, 1641 | "funding": [ 1642 | { 1643 | "url": "https://github.com/sebastianbergmann", 1644 | "type": "github" 1645 | } 1646 | ], 1647 | "time": "2024-03-14T16:00:52+00:00" 1648 | }, 1649 | { 1650 | "name": "sebastian/type", 1651 | "version": "3.2.1", 1652 | "source": { 1653 | "type": "git", 1654 | "url": "https://github.com/sebastianbergmann/type.git", 1655 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" 1656 | }, 1657 | "dist": { 1658 | "type": "zip", 1659 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 1660 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 1661 | "shasum": "" 1662 | }, 1663 | "require": { 1664 | "php": ">=7.3" 1665 | }, 1666 | "require-dev": { 1667 | "phpunit/phpunit": "^9.5" 1668 | }, 1669 | "type": "library", 1670 | "extra": { 1671 | "branch-alias": { 1672 | "dev-master": "3.2-dev" 1673 | } 1674 | }, 1675 | "autoload": { 1676 | "classmap": [ 1677 | "src/" 1678 | ] 1679 | }, 1680 | "notification-url": "https://packagist.org/downloads/", 1681 | "license": [ 1682 | "BSD-3-Clause" 1683 | ], 1684 | "authors": [ 1685 | { 1686 | "name": "Sebastian Bergmann", 1687 | "email": "sebastian@phpunit.de", 1688 | "role": "lead" 1689 | } 1690 | ], 1691 | "description": "Collection of value objects that represent the types of the PHP type system", 1692 | "homepage": "https://github.com/sebastianbergmann/type", 1693 | "support": { 1694 | "issues": "https://github.com/sebastianbergmann/type/issues", 1695 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" 1696 | }, 1697 | "funding": [ 1698 | { 1699 | "url": "https://github.com/sebastianbergmann", 1700 | "type": "github" 1701 | } 1702 | ], 1703 | "time": "2023-02-03T06:13:03+00:00" 1704 | }, 1705 | { 1706 | "name": "sebastian/version", 1707 | "version": "3.0.2", 1708 | "source": { 1709 | "type": "git", 1710 | "url": "https://github.com/sebastianbergmann/version.git", 1711 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 1712 | }, 1713 | "dist": { 1714 | "type": "zip", 1715 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 1716 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 1717 | "shasum": "" 1718 | }, 1719 | "require": { 1720 | "php": ">=7.3" 1721 | }, 1722 | "type": "library", 1723 | "extra": { 1724 | "branch-alias": { 1725 | "dev-master": "3.0-dev" 1726 | } 1727 | }, 1728 | "autoload": { 1729 | "classmap": [ 1730 | "src/" 1731 | ] 1732 | }, 1733 | "notification-url": "https://packagist.org/downloads/", 1734 | "license": [ 1735 | "BSD-3-Clause" 1736 | ], 1737 | "authors": [ 1738 | { 1739 | "name": "Sebastian Bergmann", 1740 | "email": "sebastian@phpunit.de", 1741 | "role": "lead" 1742 | } 1743 | ], 1744 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1745 | "homepage": "https://github.com/sebastianbergmann/version", 1746 | "support": { 1747 | "issues": "https://github.com/sebastianbergmann/version/issues", 1748 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 1749 | }, 1750 | "funding": [ 1751 | { 1752 | "url": "https://github.com/sebastianbergmann", 1753 | "type": "github" 1754 | } 1755 | ], 1756 | "time": "2020-09-28T06:39:44+00:00" 1757 | }, 1758 | { 1759 | "name": "symfony/dotenv", 1760 | "version": "v6.4.7", 1761 | "source": { 1762 | "type": "git", 1763 | "url": "https://github.com/symfony/dotenv.git", 1764 | "reference": "982a8d58c73a7d91d229bc20493b8ae13208741c" 1765 | }, 1766 | "dist": { 1767 | "type": "zip", 1768 | "url": "https://api.github.com/repos/symfony/dotenv/zipball/982a8d58c73a7d91d229bc20493b8ae13208741c", 1769 | "reference": "982a8d58c73a7d91d229bc20493b8ae13208741c", 1770 | "shasum": "" 1771 | }, 1772 | "require": { 1773 | "php": ">=8.1" 1774 | }, 1775 | "conflict": { 1776 | "symfony/console": "<5.4", 1777 | "symfony/process": "<5.4" 1778 | }, 1779 | "require-dev": { 1780 | "symfony/console": "^5.4|^6.0|^7.0", 1781 | "symfony/process": "^5.4|^6.0|^7.0" 1782 | }, 1783 | "type": "library", 1784 | "autoload": { 1785 | "psr-4": { 1786 | "Symfony\\Component\\Dotenv\\": "" 1787 | }, 1788 | "exclude-from-classmap": [ 1789 | "/Tests/" 1790 | ] 1791 | }, 1792 | "notification-url": "https://packagist.org/downloads/", 1793 | "license": [ 1794 | "MIT" 1795 | ], 1796 | "authors": [ 1797 | { 1798 | "name": "Fabien Potencier", 1799 | "email": "fabien@symfony.com" 1800 | }, 1801 | { 1802 | "name": "Symfony Community", 1803 | "homepage": "https://symfony.com/contributors" 1804 | } 1805 | ], 1806 | "description": "Registers environment variables from a .env file", 1807 | "homepage": "https://symfony.com", 1808 | "keywords": [ 1809 | "dotenv", 1810 | "env", 1811 | "environment" 1812 | ], 1813 | "support": { 1814 | "source": "https://github.com/symfony/dotenv/tree/v6.4.7" 1815 | }, 1816 | "funding": [ 1817 | { 1818 | "url": "https://symfony.com/sponsor", 1819 | "type": "custom" 1820 | }, 1821 | { 1822 | "url": "https://github.com/fabpot", 1823 | "type": "github" 1824 | }, 1825 | { 1826 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1827 | "type": "tidelift" 1828 | } 1829 | ], 1830 | "time": "2024-04-18T09:22:46+00:00" 1831 | }, 1832 | { 1833 | "name": "theseer/tokenizer", 1834 | "version": "1.2.3", 1835 | "source": { 1836 | "type": "git", 1837 | "url": "https://github.com/theseer/tokenizer.git", 1838 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 1839 | }, 1840 | "dist": { 1841 | "type": "zip", 1842 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 1843 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 1844 | "shasum": "" 1845 | }, 1846 | "require": { 1847 | "ext-dom": "*", 1848 | "ext-tokenizer": "*", 1849 | "ext-xmlwriter": "*", 1850 | "php": "^7.2 || ^8.0" 1851 | }, 1852 | "type": "library", 1853 | "autoload": { 1854 | "classmap": [ 1855 | "src/" 1856 | ] 1857 | }, 1858 | "notification-url": "https://packagist.org/downloads/", 1859 | "license": [ 1860 | "BSD-3-Clause" 1861 | ], 1862 | "authors": [ 1863 | { 1864 | "name": "Arne Blankerts", 1865 | "email": "arne@blankerts.de", 1866 | "role": "Developer" 1867 | } 1868 | ], 1869 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1870 | "support": { 1871 | "issues": "https://github.com/theseer/tokenizer/issues", 1872 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 1873 | }, 1874 | "funding": [ 1875 | { 1876 | "url": "https://github.com/theseer", 1877 | "type": "github" 1878 | } 1879 | ], 1880 | "time": "2024-03-03T12:36:25+00:00" 1881 | } 1882 | ], 1883 | "aliases": [], 1884 | "minimum-stability": "stable", 1885 | "stability-flags": [], 1886 | "prefer-stable": false, 1887 | "prefer-lowest": false, 1888 | "platform": { 1889 | "ext-curl": "*", 1890 | "ext-json": "*", 1891 | "php": ">=8.1" 1892 | }, 1893 | "platform-dev": [], 1894 | "plugin-api-version": "2.6.0" 1895 | } 1896 | -------------------------------------------------------------------------------- /composer.phar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jspaetzel/GroupMePHP/c4200f04295c6d127fedc36cdcd3283a14d41265/composer.phar -------------------------------------------------------------------------------- /contrib/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Pre-commit Git hook. 3 | # Runs PHP CS Fixer on PHP files. 4 | # 5 | # If you absolutely must commit without testing, 6 | # use: git commit --no-verify 7 | 8 | # This will check only staged files to be committed. 9 | filenames=($(git diff --staged --name-only HEAD)) 10 | 11 | # This will set text to red in terminal. 12 | text_red=`tput setaf 1` 13 | # This will set the text to green in terminal. 14 | text_green=`tput setaf 2` 15 | # This will reset the terminal text to normal. 16 | text_reset=`tput sgr0` 17 | 18 | numberFilesChanged="${#filenames[@]}" 19 | 20 | if [[ $numberFilesChanged > 0 ]]; 21 | then 22 | echo "$numberFilesChanged files were changed, running php-cs-fixer" 23 | # PHP CS Fixer. 24 | for i in "${filenames[@]}" 25 | do 26 | if [[ $i == *.php ]]; 27 | then 28 | php php-cs-fixer.phar fix $i 29 | 30 | if [ $? -ne 0 ]; 31 | then 32 | # File had some issues. Now it is fine. Add this file to git again. 33 | git add $i 34 | fi 35 | fi 36 | done 37 | fi 38 | 39 | echo "${text_green}PHP CS Fixer finished execution successfully.${text_reset}" 40 | 41 | echo "Running PHPStan" 42 | php vendor/bin/phpstan analyse 43 | -------------------------------------------------------------------------------- /contrib/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ ! -f php-cs-fixer.phar ]; then 4 | echo "The php-cs-fixer.phar is required... downloading..." 5 | wget https://cs.symfony.com/download/php-cs-fixer-v2.phar -O php-cs-fixer.phar || curl https://cs.symfony.com/download/php-cs-fixer-v2.phar -o php-cs-fixer.phar || { echo >&2 "I require wget or curl but they are not installed. Aborting."; exit 1; } 6 | fi 7 | 8 | # Copy the pre-commit hook to the current repository hooks directory. 9 | cp contrib/pre-commit .git/hooks/pre-commit 10 | 11 | # Add execution permission for pre-commit file. 12 | chmod +x .git/hooks/pre-commit 13 | -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | parameters: 2 | level: 5 # 0-7, zero is lowest 3 | paths: 4 | - src/ 5 | - tests/ 6 | -------------------------------------------------------------------------------- /src/Client.php: -------------------------------------------------------------------------------- 1 | token = $token; 27 | } 28 | 29 | /** 30 | * Build query string from $args. 31 | * 32 | * @param mixed $args 33 | */ 34 | public function buildQueryString($args = []) 35 | { 36 | $args = array_merge($args, ['token' => $this->token]); 37 | 38 | $query = ''; 39 | foreach ($args as $key => $val) { 40 | if ('' !== $query) { 41 | $query .= '&'; 42 | } else { 43 | $query .= '?'; 44 | } 45 | $query .= $key . '=' . $val; 46 | } 47 | 48 | return $query; 49 | } 50 | 51 | /** 52 | * Overhead function that all requests utilize. 53 | * 54 | * @param mixed $args 55 | */ 56 | public function request($args) 57 | { 58 | $c = curl_init(); 59 | 60 | curl_setopt($c, CURLOPT_TIMEOUT, 4); 61 | curl_setopt($c, CURLOPT_SSL_VERIFYPEER, true); 62 | curl_setopt($c, CURLOPT_USERAGENT, 'GroupMePHPClient/0.1'); 63 | curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 64 | curl_setopt($c, CURLOPT_CUSTOMREQUEST, $args['method']); 65 | 66 | $curlurl = $this->url . $args['url'] . $this->buildQueryString($args['query']); 67 | curl_setopt($c, CURLOPT_URL, $curlurl); 68 | 69 | if (('POST' === $args['method']) && isset($args['payload'])) { 70 | $payload = ''; 71 | if (isset($args['payload']['file'])) { 72 | $payload = $args['payload']; 73 | } else { 74 | $payload = json_encode($args['payload']); 75 | curl_setopt($c, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); 76 | } 77 | 78 | curl_setopt($c, CURLOPT_POSTFIELDS, $payload); 79 | } 80 | $info = curl_getinfo($c); 81 | $response = curl_exec($c); 82 | curl_close($c); 83 | 84 | return $response; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/GroupmeException.php: -------------------------------------------------------------------------------- 1 | '/bots', 20 | 'method' => 'POST', 21 | 'query' => [], 22 | 'payload' => ['bot' => $args], 23 | ]; 24 | 25 | return $this->request($params); 26 | } 27 | 28 | /** 29 | * Post a message from a bot. 30 | * 31 | * @param array $args 32 | * bot_id required string 33 | * text required string 34 | * picture_url string — Image must be processed through image service 35 | */ 36 | public function post($args) 37 | { 38 | $params = [ 39 | 'url' => '/bots/post', 40 | 'method' => 'POST', 41 | 'query' => [], 42 | 'payload' => $args, 43 | ]; 44 | 45 | return $this->request($params); 46 | } 47 | 48 | /** 49 | * List of bots that you have created. 50 | */ 51 | public function index() 52 | { 53 | $params = [ 54 | 'url' => '/bots', 55 | 'method' => 'GET', 56 | 'query' => [], 57 | ]; 58 | 59 | return $this->request($params); 60 | } 61 | 62 | /** 63 | * Remove a bot that you have created. 64 | * 65 | * @param string $bot_id 66 | */ 67 | public function destroy($bot_id) 68 | { 69 | $params = [ 70 | 'url' => '/bots/destroy', 71 | 'method' => 'POST', 72 | 'query' => [$bot_id], 73 | 'payload' => [], 74 | ]; 75 | 76 | return $this->request($params); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/Services/DirectMessagesService.php: -------------------------------------------------------------------------------- 1 | '/direct_messages', 19 | 'method' => 'GET', 20 | 'query' => $args, 21 | ]; 22 | 23 | return $this->request($params); 24 | } 25 | 26 | /** 27 | * Create direct messages between two users. 28 | * 29 | * @param array $args 30 | * source_guid required string — This is used for client-side deduplication. 31 | * recipient_id required string — The GroupMe user ID of the recipient of this message. 32 | * text required string — This can be omitted if at least one attachment is present. 33 | */ 34 | public function create($args) 35 | { 36 | $params = [ 37 | 'url' => '/direct_messages', 38 | 'method' => 'POST', 39 | 'query' => [], 40 | 'payload' => ['direct_message' => $args], 41 | ]; 42 | 43 | return $this->request($params); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Services/GroupsService.php: -------------------------------------------------------------------------------- 1 | '/groups', 18 | 'method' => 'GET', 19 | 'query' => $args, 20 | ]; 21 | 22 | return $this->request($params); 23 | } 24 | 25 | /** 26 | * List the authenticated user's former groups. 27 | */ 28 | public function former() 29 | { 30 | $params = [ 31 | 'url' => '/groups/former', 32 | 'method' => 'GET', 33 | 'query' => [], 34 | ]; 35 | 36 | return $this->request($params); 37 | } 38 | 39 | /** 40 | * Load a specific group. 41 | * 42 | * @param int|string $id 43 | */ 44 | public function show($id) 45 | { 46 | $params = [ 47 | 'url' => '/groups/' . $id, 48 | 'method' => 'GET', 49 | 'query' => [], 50 | ]; 51 | 52 | return $this->request($params); 53 | } 54 | 55 | /** 56 | * Create a new group. 57 | * 58 | * @param array $args 59 | * name string 60 | * description string 61 | * image_url string 62 | * share boolean — If you pass a true value for share, we'll generate a share URL. Anybody with this URL can join the group. 63 | */ 64 | public function create($args) 65 | { 66 | $params = [ 67 | 'url' => '/groups', 68 | 'method' => 'POST', 69 | 'query' => [], 70 | 'payload' => $args, 71 | ]; 72 | 73 | return $this->request($params); 74 | } 75 | 76 | /** 77 | * Update a group after creation. 78 | * 79 | * @param int|string $id 80 | * @param array $args 81 | * name string 82 | * description string 83 | * image_url string 84 | * share boolean — If you pass a true value for share, we'll generate a share URL. Anybody with this URL can join the group. 85 | */ 86 | public function update($id, $args) 87 | { 88 | $params = [ 89 | 'url' => '/groups/' . $id . '/update', 90 | 'method' => 'POST', 91 | 'query' => [], 92 | 'payload' => $args, 93 | ]; 94 | 95 | return $this->request($params); 96 | } 97 | 98 | /** 99 | * Disband a group. 100 | * 101 | * @param int|string $id 102 | */ 103 | public function destroy($id) 104 | { 105 | $params = [ 106 | 'url' => '/groups/' . $id . '/destroy', 107 | 'method' => 'POST', 108 | 'query' => [], 109 | ]; 110 | 111 | return $this->request($params); 112 | } 113 | 114 | /** 115 | * Join a shared group. 116 | * 117 | * @param int|string $group_id 118 | * @param string $share_token 119 | */ 120 | public function join($group_id, $share_token) 121 | { 122 | $params = [ 123 | 'url' => "/groups/{$group_id}/join/{$share_token}", 124 | 'method' => 'POST', 125 | 'query' => [], 126 | ]; 127 | 128 | return $this->request($params); 129 | } 130 | 131 | /** 132 | * Rejoin a group. Only works if you previously removed yourself. 133 | * 134 | * @param int|string $group_id 135 | */ 136 | public function rejoin($group_id) 137 | { 138 | $params = [ 139 | 'url' => '/groups/join', 140 | 'method' => 'POST', 141 | 'query' => [], 142 | 'payload' => ['group_id' => $group_id], 143 | ]; 144 | 145 | return $this->request($params); 146 | } 147 | 148 | /** 149 | * Change owners of requested groups. This action is only available to the current group owner. 150 | * 151 | * @param array $args 152 | * group_id string — The ID of the group 153 | * owner_id string — The ID of the new owner 154 | */ 155 | public function changeOwners($args = []) 156 | { 157 | $params = [ 158 | 'url' => '/groups/change_owners', 159 | 'method' => 'POST', 160 | 'query' => [], 161 | 'payload' => ['requests' => $args], 162 | ]; 163 | 164 | return $this->request($params); 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /src/Services/ImagesService.php: -------------------------------------------------------------------------------- 1 | '/pictures', 25 | 'method' => 'POST', 26 | 'payload' => ['file' => $file], 27 | 'query' => [], 28 | ]; 29 | 30 | $response = $this->request($params); 31 | 32 | if ($file != $url) { 33 | unlink(substr($file, 1)); 34 | } 35 | 36 | return $response; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Services/LeaderboardService.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | public function index($group_id, $period) 14 | { 15 | $params = [ 16 | 'url' => "/groups/{$group_id}/likes?period={$period}", 17 | 'method' => 'GET', 18 | 'query' => [], 19 | ]; 20 | 21 | return $this->request($params); 22 | } 23 | 24 | /** 25 | * A list of messages you have liked. Messages are returned in reverse chrono-order. Note that the payload includes a liked_at timestamp in ISO-8601 format. 26 | * 27 | * @param string $group_id 28 | */ 29 | public function myLikes($group_id) 30 | { 31 | $params = [ 32 | 'url' => "/groups/{$group_id}/likes/mine", 33 | 'method' => 'GET', 34 | 'query' => [], 35 | ]; 36 | 37 | return $this->request($params); 38 | } 39 | 40 | /** 41 | * A list of messages you have liked. Messages are returned in reverse chrono-order. Note that the payload includes a liked_at timestamp in ISO-8601 format. 42 | * 43 | * @param string $group_id 44 | */ 45 | public function myHits($group_id) 46 | { 47 | $params = [ 48 | 'url' => "/groups/{$group_id}/likes/for_me", 49 | 'method' => 'GET', 50 | 'query' => [], 51 | ]; 52 | 53 | return $this->request($params); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Services/LikesService.php: -------------------------------------------------------------------------------- 1 | '/messages/' . $conversation_id . '/' . $message_id . '/like', 17 | 'method' => 'POST', 18 | 'query' => [], 19 | ]; 20 | 21 | return $this->request($params); 22 | } 23 | 24 | /** 25 | * Unlike a message. 26 | * 27 | * @param string $conversation_id 28 | * @param string $message_id 29 | */ 30 | public function destroy($conversation_id, $message_id) 31 | { 32 | $params = [ 33 | 'url' => '/messages/' . $conversation_id . '/' . $message_id . '/unlike', 34 | 'method' => 'POST', 35 | 'query' => [], 36 | ]; 37 | 38 | return $this->request($params); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Services/MembersService.php: -------------------------------------------------------------------------------- 1 | '/groups/' . $id . '/members/add', 24 | 'method' => 'POST', 25 | 'query' => [], 26 | 'payload' => $args, 27 | ]; 28 | 29 | return $this->request($params); 30 | } 31 | 32 | public function update($group_id, $nickname) 33 | { 34 | $params = [ 35 | 'url' => "/groups/{$group_id}/memberships/update", 36 | 'method' => 'POST', 37 | 'query' => [], 38 | 'payload' => ['membership' => ['nickname' => $nickname]], 39 | ]; 40 | 41 | return $this->request($params); 42 | } 43 | 44 | /** 45 | * Get result of adding a member to a group. 46 | * 47 | * @param int|string $group_id 48 | */ 49 | public function results($group_id, $results_id) 50 | { 51 | $params = [ 52 | 'url' => '/groups/' . $group_id . '/members/results/' . $results_id, 53 | 'method' => 'GET', 54 | 'query' => [], 55 | ]; 56 | 57 | return $this->request($params); 58 | } 59 | 60 | /** 61 | * Remove member from a group. 62 | * 63 | * @param int|string $group_id 64 | * @param string $user_id 65 | */ 66 | public function remove($group_id, $user_id) 67 | { 68 | $params = [ 69 | 'url' => '/groups/' . $group_id . '/members/' . $user_id . '/remove', 70 | 'method' => 'POST', 71 | 'query' => [], 72 | ]; 73 | 74 | return $this->request($params); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/Services/MessagesService.php: -------------------------------------------------------------------------------- 1 | '/groups/' . $id . '/messages', 19 | 'method' => 'GET', 20 | 'query' => $args, 21 | ]; 22 | 23 | return $this->request($params); 24 | } 25 | 26 | /** 27 | * Create messages in a group. 28 | * 29 | * @param int|string $id of group 30 | * @param array $args 31 | * source_guid required string — This is used for client-side deduplication. 32 | * text required string — This can be omitted if at least one attachment is present. 33 | * attachments optional array - include array of attachments to attach images, etc. 34 | */ 35 | public function create($id, $args) 36 | { 37 | // Construct the payload, optionally with attachments 38 | $payload = [ 39 | 'source_guid' => $args[0], 40 | 'text' => $args[1], 41 | ]; 42 | 43 | if (!empty($args[2])) { 44 | $payload = array_merge($payload, ['attachments' => [$args[2]]]); 45 | } 46 | 47 | $params = [ 48 | 'url' => '/groups/' . $id . '/messages', 49 | 'method' => 'POST', 50 | 'query' => [], 51 | 'payload' => ['message' => $payload], 52 | ]; 53 | 54 | return $this->request($params); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/Services/Service.php: -------------------------------------------------------------------------------- 1 | client = $client; 15 | } 16 | 17 | protected function request($args): array 18 | { 19 | $body = $this->client->request($args); 20 | $container = json_decode($body, true); 21 | if (in_array($container['meta']['code'], [200, 201])) { 22 | return $container['response']; 23 | } 24 | throw new GroupmeException($container['meta']['errors'][0], $container['meta']['code']); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Services/SmsService.php: -------------------------------------------------------------------------------- 1 | '/users/sms_mode', 17 | 'method' => 'POST', 18 | 'query' => [], 19 | 'payload' => [ 20 | 'duration' => $duration, 21 | 'registration_id' => $registration_id, 22 | ], 23 | ]; 24 | 25 | return $this->request($params); 26 | } 27 | 28 | /** 29 | * Disable SMS mode. 30 | */ 31 | public function disable() 32 | { 33 | $params = [ 34 | 'url' => '/users/sms_mode/delete', 35 | 'method' => 'POST', 36 | 'query' => [], 37 | 'payload' => [], 38 | ]; 39 | 40 | return $this->request($params); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/Services/UsersService.php: -------------------------------------------------------------------------------- 1 | '/users/me', 14 | 'method' => 'GET', 15 | 'query' => [], 16 | ]; 17 | 18 | return $this->request($params); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/ClientTest.php: -------------------------------------------------------------------------------- 1 | load(__DIR__ . '/.env'); 24 | $token = $_ENV['GROUPME_TOKEN']; 25 | $this->client = new Client($token); 26 | } 27 | 28 | public function testSimpleQueryString() 29 | { 30 | $client = new Client('token'); 31 | $queryString = $client->buildQueryString(); 32 | self::assertEquals('?token=token', $queryString); 33 | } 34 | 35 | public function testComplexQueryString() 36 | { 37 | $client = new Client('token'); 38 | $args = ['a' => 1, 'b' => 2]; 39 | $queryString = $client->buildQueryString($args); 40 | self::assertEquals('?a=1&b=2&token=token', $queryString); 41 | } 42 | 43 | public function testGetMe() 44 | { 45 | $user_service = new UsersService($this->client); 46 | $response = $user_service->get(); 47 | self::assertNotNull($response); 48 | self::assertEquals($_ENV['TEST_USER_ID'], $response['id']); 49 | } 50 | 51 | public function testGetGroup() 52 | { 53 | $group_service = new GroupsService($this->client); 54 | $response = $group_service->show($_ENV['TEST_GROUP_ID']); 55 | self::assertNotNull($response); 56 | self::assertEquals($_ENV['TEST_GROUP_ID'], $response['id']); 57 | } 58 | 59 | public function testSendMessageToGroup() 60 | { 61 | $messages_service = new MessagesService($this->client); 62 | $response = $messages_service->create($_ENV['TEST_GROUP_ID'], [uniqid('test'), 'Hello Group']); 63 | self::assertNotNull($response); 64 | self::assertEquals($response['message']['text'], 'Hello Group'); 65 | } 66 | 67 | public function testGetUserGroupIndex() 68 | { 69 | $group_service = new GroupsService($this->client); 70 | $response = $group_service->index(); 71 | self::assertNotNull($response); 72 | } 73 | 74 | public function testGetGroupMembers() 75 | { 76 | $group_service = new GroupsService($this->client); 77 | $response = $group_service->show($_ENV['TEST_GROUP_ID']); 78 | $members = $response['members']; 79 | self::assertNotNull($members); 80 | } 81 | 82 | public function testAddGroupMembers() 83 | { 84 | $members_service = new MembersService($this->client); 85 | try { 86 | $response = $members_service->add(1234567, [ 87 | 'members' => [ 88 | ['nickname' => 'Test User', 'user_id' => '12345678'], 89 | ], 90 | ]); 91 | } catch (GroupmeException $ex) { 92 | self::assertEquals(401, $ex->getCode()); 93 | } 94 | } 95 | } 96 | --------------------------------------------------------------------------------