From 9c0e653afd44e0c56b18dffb114b4321cd2fff6e Mon Sep 17 00:00:00 2001 From: Sebastian Molenda Date: Wed, 20 Nov 2024 09:57:39 +0100 Subject: [PATCH] Feat/support custom message type (#110) * 1 * Custom Message Type * Remove old composer files, update acceptance test job * PHPStan fixes * Do not phpcs deleted files * phpcs quote unquote fixes * updated stubs * multiple behat outputs * support custom message type in subscribe * fixed examples, added cmt to file, tested. it is ready * phpcs... * invalid check * Fixed test with shared data * phpcssssss * fixes after review * linter fixess * PubNub SDK 7.1.0 release. --------- Co-authored-by: PubNub Release Bot <120067856+pubnub-release-bot@users.noreply.github.com> --- .github/workflows/run-tests.yml | 32 + .github/workflows/run-validations.yml | 2 +- .pubnub.yml | 11 +- CHANGELOG.md | 6 + README.md | 2 +- acceptance.json | 37 - acceptance.lock | 3605 ----------------- behat.yml | 27 +- composer.json | 17 +- examples/cli/file.php | 35 + examples/cli/hist.php | 24 +- examples/cli/pub.php | 17 +- examples/cli/sub.php | 18 +- phpstan-baseline.neon | 650 --- .../FileSharing/PublishFileMessage.php | 19 + src/PubNub/Endpoints/FileSharing/SendFile.php | 15 + src/PubNub/Endpoints/History.php | 21 + .../MessagePersistance/FetchMessages.php | 33 +- src/PubNub/Endpoints/PubSub/Publish.php | 18 + src/PubNub/Endpoints/PubSub/Signal.php | 22 +- src/PubNub/Managers/SubscriptionManager.php | 7 +- .../PNFetchMessagesItemResult.php | 42 +- .../Consumer/PubSub/PNMessageResult.php | 19 +- src/PubNub/Models/Server/MessageType.php | 12 + src/PubNub/Models/Server/SubscribeMessage.php | 23 +- src/PubNub/PubNub.php | 2 +- .../CustomMessageTypeContext.php | 197 + .../PubNubContext.php | 6 +- .../AcceptanceTestSubscribeCallback.php | 37 + .../Acceptance/Subscribe/SubscribeContext.php | 74 + .../subscribe-custom-mssg-type.feature | 14 + tests/bootstrap.php | 5 + .../features/PubNubFeatures/Access/Given.php | 257 -- tests/features/PubNubFeatures/Access/Then.php | 289 -- tests/features/PubNubFeatures/Access/When.php | 77 - .../PubNubFeatures/PNContextHelper.php | 21 - .../bootstrap/AccessManagerContext.php | 34 - tests/features/bootstrap/TimeContext.php | 31 - tests/integrational/FetchMessagesTest.php | 48 +- tests/integrational/SubscribeTest.php | 31 +- .../GetAllChannelMetadataEndpointTest.php | 16 +- 41 files changed, 734 insertions(+), 5119 deletions(-) delete mode 100644 acceptance.json delete mode 100644 acceptance.lock create mode 100644 examples/cli/file.php create mode 100644 src/PubNub/Models/Server/MessageType.php create mode 100644 tests/Acceptance/CustomMessageType/CustomMessageTypeContext.php rename tests/{features/PubNubFeatures => Acceptance}/PubNubContext.php (86%) create mode 100644 tests/Acceptance/Subscribe/AcceptanceTestSubscribeCallback.php create mode 100644 tests/Acceptance/Subscribe/SubscribeContext.php create mode 100644 tests/Acceptance/Subscribe/subscribe-custom-mssg-type.feature delete mode 100644 tests/features/PubNubFeatures/Access/Given.php delete mode 100644 tests/features/PubNubFeatures/Access/Then.php delete mode 100644 tests/features/PubNubFeatures/Access/When.php delete mode 100644 tests/features/PubNubFeatures/PNContextHelper.php delete mode 100644 tests/features/bootstrap/AccessManagerContext.php delete mode 100644 tests/features/bootstrap/TimeContext.php diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 9d870679..aeab3124 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -65,6 +65,38 @@ jobs: - name: Cancel workflow runs for commit on error if: failure() uses: ./.github/.release/actions/actions/utils/fast-jobs-failure + acceptance-tests: + name: Perform Acceptance BDD tests + runs-on: + group: organization/Default + steps: + - name: Checkout project + uses: actions/checkout@v4 + - name: Checkout mock-server action + uses: actions/checkout@v4 + with: + repository: pubnub/client-engineering-deployment-tools + ref: v1 + token: ${{ secrets.GH_TOKEN }} + path: .github/.release/actions + - name: Run mock server action + uses: ./.github/.release/actions/actions/mock-server + with: + token: ${{ secrets.GH_TOKEN }} + - name: Install Composer dev depenencies + run: | + composer install --dev + - name: Run acceptance tests + run: | + composer acceptance-test + - name: Cancel workflow runs for commit on error + if: failure() + uses: ./.github/.release/actions/actions/utils/fast-jobs-failure + - name: Expose acceptance tests reports + uses: actions/upload-artifact@v3 + with: + name: acceptance-test-reports + path: ./tests/Acceptance/reports all-tests: name: Tests needs: [tests] diff --git a/.github/workflows/run-validations.yml b/.github/workflows/run-validations.yml index e9ad0e54..3f974bc3 100644 --- a/.github/workflows/run-validations.yml +++ b/.github/workflows/run-validations.yml @@ -55,7 +55,7 @@ jobs: - name: Run PHPStan run: vendor/bin/phpstan analyze --memory-limit 256M - name: Run phpcs on changed files - run: git diff --name-only origin/master HEAD | grep -E '\.php$' | xargs vendor/bin/phpcs --standard=PSR12 + run: git diff --name-only --diff-filter=d origin/master HEAD | grep -E '\.php$' | xargs vendor/bin/phpcs --standard=PSR12 - name: Cancel workflow runs for commit on error if: failure() uses: ./.github/.release/actions/actions/utils/fast-jobs-failure diff --git a/.pubnub.yml b/.pubnub.yml index 9914039d..05504d86 100644 --- a/.pubnub.yml +++ b/.pubnub.yml @@ -1,8 +1,13 @@ name: php -version: 7.0.2 +version: 7.1.0 schema: 1 scm: github.com/pubnub/php changelog: + - date: 2024-11-20 + version: 7.1.0 + changes: + - type: feature + text: "Add custom message type support for the following APIs - publish, signal, share file, subscribe and history." - date: 2024-10-22 version: 7.0.2 changes: @@ -427,8 +432,8 @@ sdks: - x86-64 - distribution-type: library distribution-repository: GitHub release - package-name: php-7.0.2.zip - location: https://github.com/pubnub/php/releases/tag/7.0.2 + package-name: php-7.1.0.zip + location: https://github.com/pubnub/php/releases/tag/7.1.0 requires: - name: rmccue/requests min-version: 1.0.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index dce0839a..bf1d2158 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 7.1.0 +November 20 2024 + +#### Added +- Add custom message type support for the following APIs - publish, signal, share file, subscribe and history. + ## 7.0.2 October 22 2024 diff --git a/README.md b/README.md index eca142b1..c34eb8bb 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ You will need the publish and subscribe keys to authenticate your app. Get your { "require": { - "pubnub/pubnub": "7.0.2" + "pubnub/pubnub": "7.1.0" } } ``` diff --git a/acceptance.json b/acceptance.json deleted file mode 100644 index 5f6efc4f..00000000 --- a/acceptance.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "pubnub/pubnub", - "type": "library", - "description": "The Only Global Network For Real-Time Data -- PubNub!", - "keywords": ["api", "real-time", "realtime", "real time", "ajax", "push"], - "homepage": "http://www.pubnub.com/", - "license": "MIT", - "version": "4.6.0", - "authors": [ - { - "name": "PubNub", - "email": "support@pubnub.com" - } - ], - "scripts": { - "test": "./vendor/bin/phpunit tests/ --verbose --coverage-clover=coverage.clover" - }, - "require": { - "php": ">=8.1.0", - "rmccue/requests": "^1.0", - "monolog/monolog": "^1.26" - }, - "require-dev": { - "phpunit/phpunit": "^9.0", - "behat/behat": "^3.10" - }, - "autoload": { - "psr-0": { - "PubNub\\": "src/", - "PubNubFeatures\\": "tests/features/" - } - }, - "autoload-dev": { - "psr-0": { - } - } -} diff --git a/acceptance.lock b/acceptance.lock deleted file mode 100644 index ad0539ef..00000000 --- a/acceptance.lock +++ /dev/null @@ -1,3605 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "94bb2f9304002b0ca3c2def3eebb6f2e", - "packages": [ - { - "name": "monolog/monolog", - "version": "1.27.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "904713c5929655dc9b97288b69cfeedad610c9a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1", - "reference": "904713c5929655dc9b97288b69cfeedad610c9a1", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpstan/phpstan": "^0.12.59", - "phpunit/phpunit": "~4.5", - "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" - }, - "type": "library", - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/1.27.1" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2022-06-09T08:53:42+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "rmccue/requests", - "version": "v1.8.1", - "source": { - "type": "git", - "url": "https://github.com/WordPress/Requests.git", - "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/WordPress/Requests/zipball/82e6936366eac3af4d836c18b9d8c31028fe4cd5", - "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7", - "php-parallel-lint/php-console-highlighter": "^0.5.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcompatibility/php-compatibility": "^9.0", - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5", - "requests/test-server": "dev-master", - "squizlabs/php_codesniffer": "^3.5", - "wp-coding-standards/wpcs": "^2.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Requests": "library/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Ryan McCue", - "homepage": "http://ryanmccue.info" - } - ], - "description": "A HTTP library written in PHP, for human beings.", - "homepage": "http://github.com/WordPress/Requests", - "keywords": [ - "curl", - "fsockopen", - "http", - "idna", - "ipv6", - "iri", - "sockets" - ], - "support": { - "issues": "https://github.com/WordPress/Requests/issues", - "source": "https://github.com/WordPress/Requests/tree/v1.8.1" - }, - "time": "2021-06-04T09:56:25+00:00" - } - ], - "packages-dev": [ - { - "name": "behat/behat", - "version": "v3.14.0", - "source": { - "type": "git", - "url": "https://github.com/Behat/Behat.git", - "reference": "2a3832d9cb853a794af3a576f9e524ae460f3340" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Behat/Behat/zipball/2a3832d9cb853a794af3a576f9e524ae460f3340", - "reference": "2a3832d9cb853a794af3a576f9e524ae460f3340", - "shasum": "" - }, - "require": { - "behat/gherkin": "^4.9.0", - "behat/transliterator": "^1.2", - "ext-mbstring": "*", - "php": "^7.2 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/console": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/translation": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/yaml": "^4.4 || ^5.0 || ^6.0 || ^7.0" - }, - "require-dev": { - "herrera-io/box": "~1.6.1", - "phpspec/prophecy": "^1.15", - "phpunit/phpunit": "^8.5 || ^9.0", - "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "vimeo/psalm": "^4.8" - }, - "suggest": { - "ext-dom": "Needed to output test results in JUnit format." - }, - "bin": [ - "bin/behat" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Behat\\Hook\\": "src/Behat/Hook/", - "Behat\\Step\\": "src/Behat/Step/", - "Behat\\Behat\\": "src/Behat/Behat/", - "Behat\\Testwork\\": "src/Behat/Testwork/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - } - ], - "description": "Scenario-oriented BDD framework for PHP", - "homepage": "http://behat.org/", - "keywords": [ - "Agile", - "BDD", - "ScenarioBDD", - "Scrum", - "StoryBDD", - "User story", - "business", - "development", - "documentation", - "examples", - "symfony", - "testing" - ], - "support": { - "issues": "https://github.com/Behat/Behat/issues", - "source": "https://github.com/Behat/Behat/tree/v3.14.0" - }, - "time": "2023-12-09T13:55:02+00:00" - }, - { - "name": "behat/gherkin", - "version": "v4.9.0", - "source": { - "type": "git", - "url": "https://github.com/Behat/Gherkin.git", - "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", - "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", - "shasum": "" - }, - "require": { - "php": "~7.2|~8.0" - }, - "require-dev": { - "cucumber/cucumber": "dev-gherkin-22.0.0", - "phpunit/phpunit": "~8|~9", - "symfony/yaml": "~3|~4|~5" - }, - "suggest": { - "symfony/yaml": "If you want to parse features, represented in YAML files" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Behat\\Gherkin": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - } - ], - "description": "Gherkin DSL parser for PHP", - "homepage": "http://behat.org/", - "keywords": [ - "BDD", - "Behat", - "Cucumber", - "DSL", - "gherkin", - "parser" - ], - "support": { - "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" - }, - "time": "2021-10-12T13:05:09+00:00" - }, - { - "name": "behat/transliterator", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/Behat/Transliterator.git", - "reference": "baac5873bac3749887d28ab68e2f74db3a4408af" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Behat/Transliterator/zipball/baac5873bac3749887d28ab68e2f74db3a4408af", - "reference": "baac5873bac3749887d28ab68e2f74db3a4408af", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "require-dev": { - "chuyskywalker/rolling-curl": "^3.1", - "php-yaoi/php-yaoi": "^1.0", - "phpunit/phpunit": "^8.5.25 || ^9.5.19" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Behat\\Transliterator\\": "src/Behat/Transliterator" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Artistic-1.0" - ], - "description": "String transliterator", - "keywords": [ - "i18n", - "slug", - "transliterator" - ], - "support": { - "issues": "https://github.com/Behat/Transliterator/issues", - "source": "https://github.com/Behat/Transliterator/tree/v1.5.0" - }, - "time": "2022-03-30T09:27:43+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:23:10+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.12.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2024-06-12T14:39:25+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" - }, - "time": "2024-07-01T20:03:41+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.31", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:37:42+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-02T12:48:52+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.6.20", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "49d7820565836236411f5dc002d16dd689cde42f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", - "reference": "49d7820565836236411f5dc002d16dd689cde42f", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.5.0 || ^2", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.0", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.31", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.4", - "phpunit/php-timer": "^5.0.3", - "sebastian/cli-parser": "^1.0.2", - "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.6", - "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.7", - "sebastian/object-enumerator": "^4.0.4", - "sebastian/resource-operations": "^3.0.4", - "sebastian/type": "^3.2.1", - "sebastian/version": "^3.0.2" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.6-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2024-07-10T11:45:39+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:27:43+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-09-14T12:41:17+00:00" - }, - { - "name": "sebastian/complexity", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-22T06:19:30+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:30:58+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:03:51+00:00" - }, - { - "name": "sebastian/exporter", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:33:00+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.7", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:35:11+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-22T06:20:34+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:07:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-14T16:00:52+00:00" - }, - { - "name": "sebastian/type", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:13:03+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "symfony/config", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", - "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^7.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<6.4", - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v7.1.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:57:53+00:00" - }, - { - "name": "symfony/console", - "version": "v7.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "0aa29ca177f432ab68533432db0de059f39c92ae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0aa29ca177f432ab68533432db0de059f39c92ae", - "reference": "0aa29ca177f432ab68533432db0de059f39c92ae", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v7.1.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-28T10:03:55+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v7.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "6e108cded928bdafaf1da3fabe30dd5af20e36b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6e108cded928bdafaf1da3fabe30dd5af20e36b9", - "reference": "6e108cded928bdafaf1da3fabe30dd5af20e36b9", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4|^7.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.4", - "symfony/finder": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "symfony/config": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.1.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-28T10:03:55+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/service-contracts": "<2.5" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:57:53+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v7.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "92a91985250c251de9b947a14bb2c9390b1a562c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/92a91985250c251de9b947a14bb2c9390b1a562c", - "reference": "92a91985250c251de9b947a14bb2c9390b1a562c", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "require-dev": { - "symfony/process": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-28T10:03:55+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T15:07:36+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T15:07:36+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T15:07:36+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-19T12:30:46+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "symfony/string", - "version": "v7.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/14221089ac66cf82e3cf3d1c1da65de305587ff8", - "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" - }, - "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v7.1.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-28T09:27:18+00:00" - }, - { - "name": "symfony/translation", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", - "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" - }, - "require-dev": { - "nikic/php-parser": "^4.18|^5.0", - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to internationalize your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:57:53+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v7.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-28T08:00:31+00:00" - }, - { - "name": "symfony/yaml", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:57:53+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:36:25+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=8.1.0" - }, - "platform-dev": [], - "plugin-api-version": "2.3.0" -} diff --git a/behat.yml b/behat.yml index cb64c869..f8dbed6a 100644 --- a/behat.yml +++ b/behat.yml @@ -1,10 +1,19 @@ default: - autoload: - - "%paths.base%/tests/features/bootstrap/" - suites: - access: - paths: [ "%paths.base%/tests/features/bootstrap/access" ] - contexts: [ AccessManagerContext ] - utilities: - paths: [ "%paths.base%/tests/features/bootstrap/utilities" ] - contexts: [ TimeContext ] \ No newline at end of file + autoload: + '': "%paths.base%/tests/Acceptance/" + + suites: + custom-message-type: + paths: + - "%paths.base%/tests/Acceptance/CustomMessageType" + contexts: + - PubNubTests\Acceptance\CustomMessageType\CustomMessageTypeContext + subscribe: + paths: + - "%paths.base%/tests/Acceptance/Subscribe" + contexts: + - PubNubTests\Acceptance\Subscribe\SubscribeContext + formatters: + pretty: true + junit: + output_path: "%paths.base%/tests/Acceptance/report.xml" \ No newline at end of file diff --git a/composer.json b/composer.json index f73aa6c8..2e0f1104 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "keywords": ["api", "real-time", "realtime", "real time", "ajax", "push"], "homepage": "http://www.pubnub.com/", "license": "proprietary", - "version": "7.0.2", + "version": "7.1.0", "authors": [ { "name": "PubNub", @@ -13,10 +13,18 @@ } ], "scripts": { - "test": "./vendor/bin/phpunit tests/ --verbose --coverage-clover=coverage.clover" + "test": "./vendor/bin/phpunit tests/ --verbose --coverage-clover=coverage.clover", + "acceptance-test": [ + "mkdir -p tests/Acceptance/reports", + "cp sdk-specifications/features/publish/publish-custom-mssg-type.feature tests/Acceptance/CustomMessageType/publish-custom-mssg-type.feature", + "cp sdk-specifications/features/publish/signal-custom-mssg-type.feature tests/Acceptance/CustomMessageType/signal-custom-mssg-type.feature", + "cp sdk-specifications/features/history/history-custom-mssg-type.feature tests/Acceptance/CustomMessageType/history-custom-mssg-type.feature", + "cp sdk-specifications/features/subscribe/subscribe-custom-mssg-type.feature tests/Acceptance/Subscribe/subscribe-custom-mssg-type.feature", + "vendor/bin/behat" + ] }, "require": { - "php": "^7.4|>=8.0", + "php": ">=8.0", "rmccue/requests": "^2.0", "psr/log": "^1.1|^2.0|^3.0" }, @@ -29,7 +37,8 @@ }, "autoload": { "psr-4": { - "PubNub\\": "src/PubNub" + "PubNub\\": "src/PubNub", + "PubNubTests\\": "tests" } }, "autoload-dev": { diff --git a/examples/cli/file.php b/examples/cli/file.php new file mode 100644 index 00000000..a0e1d49c --- /dev/null +++ b/examples/cli/file.php @@ -0,0 +1,35 @@ + \n"; + exit(1); +} + +$pnUuid = $argv[1] . '-pn-610da4553bb079.92567429'; + +$pnConfig = new PNConfiguration(); +$pnConfig->setPublishKey(getenv('PN_KEY_PUBLISH')); +$pnConfig->setSubscribeKey(getenv('PN_KEY_SUBSCRIBE')); +$pnConfig->setUuid($pnUuid); + +$pubnub = new PubNub($pnConfig); +$file = fopen('pn.jpg', 'rb'); +$pubResult = $pubnub->sendFile() + ->channel($argv[2]) + ->message($argv[3]) + ->customMessageType($argv[4]) + ->fileHandle($file) + ->fileName('pn.jpg') + ->sync(); + +print("Published file"); diff --git a/examples/cli/hist.php b/examples/cli/hist.php index 991905ac..d63b90b2 100644 --- a/examples/cli/hist.php +++ b/examples/cli/hist.php @@ -15,24 +15,30 @@ $pnConfig = new PNConfiguration(); $pnConfig->setPublishKey(getenv('PN_KEY_PUBLISH')); $pnConfig->setSubscribeKey(getenv('PN_KEY_SUBSCRIBE')); -// $pnConfig->setSecretKey('sec-c-YjZiZWQzZWItMmZlNS00NjBlLTkyNTUtOGFhZjZiY2E1ZDc1'); + $pnConfig->setUuid($pnUuid); -if (array_key_exists(2, $argv)) { - $pnConfig->setCrypto(CryptoModule::aesCbcCryptor($argv[2], true)); -} $pubnub = new PubNub($pnConfig); $ts = $pubnub->time()->sync(); $channelName = $argv[1]; -$history = $pubnub->history() - ->channel($channelName) - ->reverse(false) +$history = $pubnub->fetchMessages() + ->channels($channelName) ->end((int)($ts->getTimetoken() - 3000000000)) + ->includeCustomMessageType(true) ->count(50) ->sync(); -foreach ($history->getMessages() as $key => $message) { - print($message); +$messages = $history->getChannels()[$channelName]; +print("Received " . count($messages) . " messages\n"); + +foreach ($messages as $key => $message) { + printf("Message %d:\n", $key + 1); + printf( + "\n %s\n Timetoken: %s\n Custom message type: %s\n", + $message->getMessage(), + $message->getTimetoken(), + $message->getCustomMessageType(), + ); } diff --git a/examples/cli/pub.php b/examples/cli/pub.php index 0218abbd..ce509492 100644 --- a/examples/cli/pub.php +++ b/examples/cli/pub.php @@ -9,7 +9,11 @@ use PubNub\PubNub; use PubNub\PNConfiguration; -use PubNub\CryptoModule; + +if ($argc < 5) { + echo "Usage: php pub.php \n"; + exit(1); +} $pnUuid = $argv[1] . '-pn-610da4553bb079.92567429'; @@ -17,10 +21,13 @@ $pnConfig->setPublishKey(getenv('PN_KEY_PUBLISH')); $pnConfig->setSubscribeKey(getenv('PN_KEY_SUBSCRIBE')); $pnConfig->setUuid($pnUuid); -if (array_key_exists(4, $argv)) { - $pnConfig->setCrypto(CryptoModule::aesCbcCryptor($argv[4], true)); -} $pubnub = new PubNub($pnConfig); -$pubResult = $pubnub->publish()->channel($argv[2])->message($argv[3])->sync(); +$pubResult = $pubnub->publish() + ->channel($argv[2]) + ->message($argv[3]) + ->customMessageType($argv[4]) + ->sync(); + +printf("Published message at timetoken: %d\n", $pubResult->getTimetoken()); diff --git a/examples/cli/sub.php b/examples/cli/sub.php index 07cf96bb..efc664dd 100644 --- a/examples/cli/sub.php +++ b/examples/cli/sub.php @@ -1,5 +1,6 @@ \n"; + exit(1); +} $pnUuid = 'pn-610da4553bb079.92567429'; $pnConfig = new PNConfiguration(); $pnConfig->setPublishKey(getenv('PN_KEY_PUBLISH')); $pnConfig->setSubscribeKey(getenv('PN_KEY_SUBSCRIBE')); -if (array_key_exists(2, $argv)) { - $pnConfig->setCrypto(CryptoModule::aesCbcCryptor($argv[2], true)); -} + $pnConfig->setUuid($pnUuid); $pubnub = new PubNub($pnConfig); $channelName = $argv[1]; -// phpcs:ignore +// phpcs:ignore PSR1.Classes.ClassDeclaration class MySubscribeCallback extends SubscribeCallback { /** @@ -58,12 +60,14 @@ public function status($pubnub, $status) public function message($pubnub, $messageResult) { printf( - "\nMessage %s\n Channel: %s\n Timetoken: %s\n Publisher: %s\n", - $messageResult->getMessage(), + "\nMessage %s\n Channel: %s\n Timetoken: %s\n Publisher: %s\n Custom message type: %s\n", + json_encode($messageResult->getMessage()), $messageResult->getChannel(), $messageResult->getTimetoken(), $messageResult->getPublisher(), + $messageResult->getCustomMessageType(), ); + if ($messageResult->isError()) { printf('\nError occured during parsing the message: %s', $messageResult->getError()->getMessage()); } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index b0ff73e0..c8953629 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -745,16 +745,6 @@ parameters: count: 1 path: src/PubNub/Endpoints/Endpoint.php - - - message: "#^Variable \\$publishKey in empty\\(\\) always exists and is not falsy\\.$#" - count: 1 - path: src/PubNub/Endpoints/Endpoint.php - - - - message: "#^Variable \\$subscribeKey in empty\\(\\) always exists and is not falsy\\.$#" - count: 1 - path: src/PubNub/Endpoints/Endpoint.php - - message: "#^Method PubNub\\\\Endpoints\\\\FileSharing\\\\DeleteFile\\:\\:createResponse\\(\\) has parameter \\$result with no value type specified in iterable type array\\.$#" count: 1 @@ -1215,26 +1205,11 @@ parameters: count: 1 path: src/PubNub/Endpoints/MessageCount.php - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:channels\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:channels\\(\\) has parameter \\$channel with no type specified\\.$#" count: 1 path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:count\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:count\\(\\) has parameter \\$count with no type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:createResponse\\(\\) has invalid return type PubNub\\\\Endpoints\\\\MessagePersistance\\\\PNPublishResult\\.$#" count: 1 @@ -1250,66 +1225,6 @@ parameters: count: 1 path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:end\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:end\\(\\) has parameter \\$end with no type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:includeMessageActions\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:includeMessageActions\\(\\) has parameter \\$includeMessageActions with no type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:includeMessageType\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:includeMessageType\\(\\) has parameter \\$includeMessageType with no type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:includeMeta\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:includeMeta\\(\\) has parameter \\$includeMeta with no type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:includeUuid\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:includeUuid\\(\\) has parameter \\$includeUuid with no type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:start\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:start\\(\\) has parameter \\$start with no type specified\\.$#" - count: 1 - path: src/PubNub/Endpoints/MessagePersistance/FetchMessages.php - - message: "#^Method PubNub\\\\Endpoints\\\\MessagePersistance\\\\FetchMessages\\:\\:validateParams\\(\\) has no return type specified\\.$#" count: 1 @@ -3370,26 +3285,6 @@ parameters: count: 1 path: src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php - - - message: "#^Method PubNub\\\\Models\\\\Consumer\\\\MessagePersistence\\\\PNFetchMessagesItemResult\\:\\:setActions\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php - - - - message: "#^Method PubNub\\\\Models\\\\Consumer\\\\MessagePersistence\\\\PNFetchMessagesItemResult\\:\\:setMessageType\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php - - - - message: "#^Method PubNub\\\\Models\\\\Consumer\\\\MessagePersistence\\\\PNFetchMessagesItemResult\\:\\:setMetadata\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php - - - - message: "#^Method PubNub\\\\Models\\\\Consumer\\\\MessagePersistence\\\\PNFetchMessagesItemResult\\:\\:setUuid\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php - - message: "#^Unsafe usage of new static\\(\\)\\.$#" count: 1 @@ -5100,546 +4995,6 @@ parameters: count: 1 path: tests/PubNubTestCase.php - - - message: "#^Method PubNubFeatures\\\\PubNubContext\\:\\:after\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/PubNubFeatures/PubNubContext.php - - - - message: "#^Method PubNubFeatures\\\\PubNubContext\\:\\:before\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/PubNubFeatures/PubNubContext.php - - - - message: "#^Access to an undefined property AccessManagerContext\\:\\:\\$error\\.$#" - count: 11 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Access to an undefined property AccessManagerContext\\:\\:\\$result\\.$#" - count: 3 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Call to method ttl\\(\\) on an unknown class PubNubFeatures\\\\Access\\\\GrantToken\\.$#" - count: 2 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:aToken\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:anErrorIsReturned\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:denyResourcePermissionGet\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantPatternPermissionDelete\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantPatternPermissionGet\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantPatternPermissionJoin\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantPatternPermissionManage\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantPatternPermissionRead\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantPatternPermissionUpdate\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantPatternPermissionWrite\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantResourcePermissionDelete\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantResourcePermissionGet\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantResourcePermissionJoin\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantResourcePermissionManage\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantResourcePermissionRead\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantResourcePermissionUpdate\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:grantResourcePermissionWrite\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iAttemptToGrantATokenSpecifyingThosePermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iGetConfirmationThatTokenHasBeenRevoked\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iGrantATokenSpecifyingThosePermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iHaveAKeysetWithAccessManagerEnabled\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iHaveAKnownTokenContainingAnAuthorizedUuid\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iHaveAKnownTokenContainingUuidPatternPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iHaveAKnownTokenContainingUuidResourcePermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iParseTheToken\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:iRevokeAToken\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theAuthorizedUuid\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theAuthorizedUuid\\(\\) has parameter \\$uuid with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theChannelGroupPatternAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theChannelGroupPatternAccessPermissions\\(\\) has parameter \\$channelGroup with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theChannelGroupResourceAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theChannelGroupResourceAccessPermissions\\(\\) has parameter \\$channelGroup with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theChannelPatternAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theChannelPatternAccessPermissions\\(\\) has parameter \\$channel with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theChannelResourceAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theChannelResourceAccessPermissions\\(\\) has parameter \\$channel with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorDetailLocationIs\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorDetailLocationIs\\(\\) has parameter \\$detailLocation with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorDetailLocationTypeIs\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorDetailLocationTypeIs\\(\\) has parameter \\$detailLocationType with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorDetailMessageIs\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorDetailMessageIs\\(\\) has parameter \\$detailMessage with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorDetailMessageIsNotEmpty\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorMessageIs\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorMessageIs\\(\\) has parameter \\$errorMessage with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorServiceIs\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorServiceIs\\(\\) has parameter \\$service with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorSourceIs\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorSourceIs\\(\\) has parameter \\$source with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorStatusCodeIs\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theErrorStatusCodeIs\\(\\) has parameter \\$statusCode with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theParsedTokenOutputContainsTheAuthorizedUuid\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theParsedTokenOutputContainsTheAuthorizedUuid\\(\\) has parameter \\$uuid with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenContainsTheAuthorizedUuid\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenContainsTheAuthorizedUuid\\(\\) has parameter \\$uuid with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenContainsTheTtl\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenContainsTheTtl\\(\\) has parameter \\$ttl with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenDoesNotContainAnAuthorizedUuid\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasChannelGroupPatternAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasChannelGroupPatternAccessPermissions\\(\\) has parameter \\$channelGroup with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasChannelGroupResourceAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasChannelGroupResourceAccessPermissions\\(\\) has parameter \\$channelGroup with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasChannelPatternAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasChannelPatternAccessPermissions\\(\\) has parameter \\$channel with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasChannelResourceAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasChannelResourceAccessPermissions\\(\\) has parameter \\$channel with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasUuidPatternAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasUuidPatternAccessPermissions\\(\\) has parameter \\$uuid with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasUuidResourceAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenHasUuidResourceAccessPermissions\\(\\) has parameter \\$uuid with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenString\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTokenString\\(\\) has parameter \\$token with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTtl\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theTtl\\(\\) has parameter \\$ttl with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theUuidPatternAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theUuidPatternAccessPermissions\\(\\) has parameter \\$uuid with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theUuidResourceAccessPermissions\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:theUuidResourceAccessPermissions\\(\\) has parameter \\$uuid with no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenPatternPermissionDelete\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenPatternPermissionGet\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenPatternPermissionJoin\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenPatternPermissionManage\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenPatternPermissionRead\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenPatternPermissionUpdate\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenPatternPermissionWrite\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenResourcePermissionDelete\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenResourcePermissionGet\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenResourcePermissionJoin\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenResourcePermissionManage\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenResourcePermissionRead\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenResourcePermissionUpdate\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method AccessManagerContext\\:\\:tokenResourcePermissionWrite\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^PHPDoc tag @var contains unknown class PubNubFeatures\\\\Access\\\\GrantToken\\.$#" - count: 2 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Property AccessManagerContext\\:\\:\\$context has no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Property AccessManagerContext\\:\\:\\$origin has no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Property AccessManagerContext\\:\\:\\$pattern has no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Property AccessManagerContext\\:\\:\\$pnConfig has no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Property AccessManagerContext\\:\\:\\$pubnub has no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Property AccessManagerContext\\:\\:\\$resource has no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Property AccessManagerContext\\:\\:\\$token has no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/AccessManagerContext.php - - - - message: "#^Method TimeContext\\:\\:iReceiveSuccessfulResponse\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/TimeContext.php - - - - message: "#^Method TimeContext\\:\\:iRequestCurrentTime\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/features/bootstrap/TimeContext.php - - - - message: "#^Property TimeContext\\:\\:\\$response has no type specified\\.$#" - count: 1 - path: tests/features/bootstrap/TimeContext.php - - message: "#^Method Tests\\\\Functional\\\\AddChannelToChannelGroupExposed\\:\\:buildParams\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -8130,11 +7485,6 @@ parameters: count: 1 path: tests/integrational/SubscribeSignalTest.php - - - message: "#^Call to an undefined method Tests\\\\Integrational\\\\PublishThread\\:\\:start\\(\\)\\.$#" - count: 1 - path: tests/integrational/SubscribeTest.php - - message: "#^Class Tests\\\\Integrational\\\\PublishThread constructor invoked with 2 parameters, 1 required\\.$#" count: 1 diff --git a/src/PubNub/Endpoints/FileSharing/PublishFileMessage.php b/src/PubNub/Endpoints/FileSharing/PublishFileMessage.php index 63b06d4c..e073dbaa 100644 --- a/src/PubNub/Endpoints/FileSharing/PublishFileMessage.php +++ b/src/PubNub/Endpoints/FileSharing/PublishFileMessage.php @@ -14,6 +14,10 @@ class PublishFileMessage extends FileSharingEndpoint protected $message; protected $meta; + + /** @var string $customMessageType User defined message type */ + protected ?string $customMessageType; + protected $shouldStore; protected $ttl; @@ -29,6 +33,17 @@ public function meta($meta) return $this; } + /** + * @param string $customMessageType + * @return $this + */ + public function customMessageType(?string $customMessageType) + { + $this->customMessageType = $customMessageType; + + return $this; + } + public function shouldStore(bool $shouldStore) { $this->shouldStore = $shouldStore; @@ -82,6 +97,10 @@ protected function customParams() $params['ttl'] = $this->ttl; $params['store'] = $this->shouldStore ? 1 : 0; + if (isset($this->customMessageType)) { + $params['custom_message_type'] = $this->customMessageType; + } + return $params; } diff --git a/src/PubNub/Endpoints/FileSharing/SendFile.php b/src/PubNub/Endpoints/FileSharing/SendFile.php index 80698972..47eeeeb7 100644 --- a/src/PubNub/Endpoints/FileSharing/SendFile.php +++ b/src/PubNub/Endpoints/FileSharing/SendFile.php @@ -17,6 +17,7 @@ class SendFile extends Endpoint protected string $fileName; protected mixed $message; protected mixed $meta; + protected ?string $customMessageType; protected bool $shouldStore; protected int $ttl; protected mixed $fileContent; @@ -51,6 +52,17 @@ public function meta($meta) return $this; } + /** + * @param string $customMessageType + * @return $this + */ + public function customMessageType(?string $customMessageType) + { + $this->customMessageType = $customMessageType; + + return $this; + } + public function shouldStore($shouldStore) { $this->shouldStore = $shouldStore; @@ -273,6 +285,9 @@ public function sync(): PNPublishFileMessageResult if (isset($this->shouldStore)) { $publishRequest->shouldStore($this->shouldStore); } + if (isset($this->customMessageType)) { + $publishRequest->customMessageType($this->customMessageType); + } if (isset($this->ttl)) { $publishRequest->ttl($this->ttl); } diff --git a/src/PubNub/Endpoints/History.php b/src/PubNub/Endpoints/History.php index ff0fb528..4b262a1f 100644 --- a/src/PubNub/Endpoints/History.php +++ b/src/PubNub/Endpoints/History.php @@ -31,6 +31,8 @@ class History extends Endpoint /** @var bool */ protected ?bool $includeTimetoken; + protected ?bool $includeCustomMessageType; + /** * @param string $channel * @return $this @@ -97,6 +99,17 @@ public function includeTimetoken($includeTimetoken) return $this; } + /** + * @param bool $includeCustomMessageType + * @return $this + */ + public function includeCustomMessageType(bool $includeCustomMessageType) + { + $this->includeCustomMessageType = $includeCustomMessageType; + + return $this; + } + /** * @throws PubNubValidationException */ @@ -138,6 +151,14 @@ protected function customParams() $this->includeTimetoken ? $params['include_token'] = "true" : $params['include_token'] = "false"; } + if (isset($this->includeCustomMessageType)) { + if ($this->includeCustomMessageType) { + $params['include_custom_message_type'] = "true"; + } else { + $params['include_custom_message_type'] = "false"; + } + } + return $params; } diff --git a/src/PubNub/Endpoints/MessagePersistance/FetchMessages.php b/src/PubNub/Endpoints/MessagePersistance/FetchMessages.php index 3a8f1441..ecc60fb4 100644 --- a/src/PubNub/Endpoints/MessagePersistance/FetchMessages.php +++ b/src/PubNub/Endpoints/MessagePersistance/FetchMessages.php @@ -31,8 +31,9 @@ class FetchMessages extends Endpoint protected bool $includeMeta = false; protected bool $includeUuid = false; - protected bool $includeMessageType = false; + protected bool $includeMessageType = true; protected bool $includeMessageActions = false; + protected bool $includeCustomMessageType = false; protected array $customParamMapping = [ 'start' => 'start', @@ -41,9 +42,10 @@ class FetchMessages extends Endpoint 'includeMeta' => 'include_meta', 'includeUuid' => 'include_uuid', 'includeMessageType' => 'include_message_type', + 'includeCustomMessageType' => 'include_custom_message_type', ]; - public function channels(...$channel) + public function channels(...$channel): self { if (is_array($channel[0])) { $this->channels = $channel[0]; @@ -55,43 +57,49 @@ public function channels(...$channel) return $this; } - public function start($start) + public function start(int $start): self { $this->start = $start; return $this; } - public function end($end) + public function end(int $end): self { $this->end = $end; return $this; } - public function count($count) + public function count(int $count): self { $this->count = $count; return $this; } - public function includeMeta($includeMeta) + public function includeMeta(bool $includeMeta): self { $this->includeMeta = $includeMeta; return $this; } - public function includeUuid($includeUuid) + public function includeUuid(bool $includeUuid): self { $this->includeUuid = $includeUuid; return $this; } - public function includeMessageType($includeMessageType) + public function includeMessageType(bool $includeMessageType): self { $this->includeMessageType = $includeMessageType; return $this; } - public function includeMessageActions($includeMessageActions) + public function includeCustomMessageType(bool $includeCustomMessageType): self + { + $this->includeCustomMessageType = $includeCustomMessageType; + return $this; + } + + public function includeMessageActions(bool $includeMessageActions): self { $this->includeMessageActions = $includeMessageActions; return $this; @@ -117,7 +125,12 @@ protected function customParams() { $params = []; foreach ($this->customParamMapping as $customParam => $requestParam) { - if (isset($this->$customParam) && !empty($this->$customParam)) { + // @phpstan-ignore-next-line + if (isset($this->$customParam) && !is_null($this->$customParam)) { + if (strpos($customParam, 'include') === 0) { + $params[$requestParam] = $this->$customParam ? 'true' : 'false'; + continue; + } $params[$requestParam] = $this->$customParam; } } diff --git a/src/PubNub/Endpoints/PubSub/Publish.php b/src/PubNub/Endpoints/PubSub/Publish.php index c7121654..77d804b3 100755 --- a/src/PubNub/Endpoints/PubSub/Publish.php +++ b/src/PubNub/Endpoints/PubSub/Publish.php @@ -27,6 +27,9 @@ final class Publish extends Endpoint /** @var bool $usePost HTTP method instead of default GET */ protected $usePost; + /** @var string $customMessageType User defined message type */ + protected ?string $customMessageType; + /** @var array $meta data */ protected $meta; @@ -93,6 +96,17 @@ public function usePost($usePost) return $this; } + /** + * @param string $customMessageType + * @return $this + */ + public function customMessageType(?string $customMessageType) + { + $this->customMessageType = $customMessageType; + + return $this; + } + /** * @param array $meta * @return $this @@ -166,6 +180,10 @@ protected function customParams() $params['ttl'] = (string) $this->ttl; } + if (isset($this->customMessageType)) { + $params['custom_message_type'] = $this->customMessageType; + } + $params['seqn'] = $this->pubnub->getSequenceId(); if (!$this->replicate) { diff --git a/src/PubNub/Endpoints/PubSub/Signal.php b/src/PubNub/Endpoints/PubSub/Signal.php index e179e586..a4b11fe6 100644 --- a/src/PubNub/Endpoints/PubSub/Signal.php +++ b/src/PubNub/Endpoints/PubSub/Signal.php @@ -20,6 +20,9 @@ class Signal extends Endpoint /** @var string $channel to send message on*/ protected $channel; + /** @var string $customMessageType User defined message type */ + protected ?string $customMessageType; + /** * @param mixed $message * @return $this @@ -42,6 +45,17 @@ public function channel($channel) return $this; } + /** + * @param string $customMessageType + * @return $this + */ + public function customMessageType(?string $customMessageType) + { + $this->customMessageType = $customMessageType; + + return $this; + } + /** * @throws PubNubValidationException */ @@ -84,7 +98,13 @@ protected function buildData() protected function customParams() { - return []; + $params = []; + + if (isset($this->customMessageType)) { + $params['custom_message_type'] = $this->customMessageType; + } + + return $params; } /** diff --git a/src/PubNub/Managers/SubscriptionManager.php b/src/PubNub/Managers/SubscriptionManager.php index e005f76c..64bd71f3 100644 --- a/src/PubNub/Managers/SubscriptionManager.php +++ b/src/PubNub/Managers/SubscriptionManager.php @@ -90,9 +90,9 @@ public function start() if ($e->getStatusCode() === 403) { $pnStatus->setCategory(PNStatusCategory::PNAccessDeniedCategory); - } else if ($e->getStatusCode() === 400) { + } elseif ($e->getStatusCode() === 400) { $pnStatus->setCategory(PNStatusCategory::PNBadRequestCategory); - } else if ($e->getStatusCode() === 530) { + } elseif ($e->getStatusCode() === 530) { $pnStatus->setCategory(PNStatusCategory::PNNoStubMatchedCategory); } else { $pnStatus->setCategory(PNStatusCategory::PNUnknownCategory); @@ -280,7 +280,8 @@ protected function processIncomingPayload($message) $subscriptionMatch, $publishMetadata->getPublishTimetoken(), $publisher, - $messageError + $messageError, + $message->getCustomMessageType() ); $this->listenerManager->announceMessage($pnMessageResult); diff --git a/src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php b/src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php index c65deb55..7ea0b0ec 100644 --- a/src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php +++ b/src/PubNub/Models/Consumer/MessagePersistence/PNFetchMessagesItemResult.php @@ -4,12 +4,13 @@ class PNFetchMessagesItemResult { - protected mixed $message; - protected string $timetoken; - protected mixed $metadata; - protected mixed $actions; - protected string $uuid; - protected string $messageType; + protected mixed $message = null; + protected ?string $timetoken = null; + protected mixed $metadata = null; + protected mixed $actions = null; + protected ?string $uuid = null; + protected ?string $messageType = null; + protected ?string $customMessageType = null; public function __construct(mixed $message, string $timetoken) @@ -18,36 +19,42 @@ public function __construct(mixed $message, string $timetoken) $this->timetoken = $timetoken; } - public function setMetadata(mixed $metadata) + public function setMetadata(mixed $metadata): self { $this->metadata = $metadata; return $this; } - public function setActions(mixed $actions) + public function setActions(mixed $actions): self { $this->actions = $actions; return $this; } - public function setUuid(string $uuid) + public function setUuid(string $uuid): self { $this->uuid = $uuid; return $this; } - public function setMessageType(string $messageType) + public function setMessageType(string $messageType): self { $this->messageType = $messageType; return $this; } + public function setCustomMessageType(string $customMessageType): self + { + $this->customMessageType = $customMessageType; + return $this; + } + public function getMessage(): mixed { return $this->message; } - public function getTimetoken(): string + public function getTimetoken(): ?string { return $this->timetoken; } @@ -62,16 +69,21 @@ public function getActions(): mixed return $this->actions; } - public function getUuid(): string + public function getUuid(): ?string { return $this->uuid; } - public function getMessageType(): string + public function getMessageType(): ?string { return $this->messageType; } + public function getCustomMessageType(): ?string + { + return $this->customMessageType; + } + public static function fromJson($json, $crypto): static { $message = $json['message']; @@ -91,6 +103,10 @@ public static function fromJson($json, $crypto): static $item->setMessageType($json['message_type']); } + if (isset($json['custom_message_type'])) { + $item->setCustomMessageType($json['custom_message_type']); + } + if (isset($json['meta'])) { $item->setMetadata($json['meta']); } diff --git a/src/PubNub/Models/Consumer/PubSub/PNMessageResult.php b/src/PubNub/Models/Consumer/PubSub/PNMessageResult.php index 597d08c0..4c3b98b5 100644 --- a/src/PubNub/Models/Consumer/PubSub/PNMessageResult.php +++ b/src/PubNub/Models/Consumer/PubSub/PNMessageResult.php @@ -21,6 +21,8 @@ class PNMessageResult private $error; + private ?string $customMessageType = null; + /** * PNMessageResult constructor. * @param array $message @@ -29,14 +31,22 @@ class PNMessageResult * @param int $timetoken * @param string $publisher */ - public function __construct($message, $channel, $subscription, $timetoken, $publisher, $error = null) - { + public function __construct( + $message, + $channel, + $subscription, + $timetoken, + $publisher, + $error = null, + ?string $customMessageType = null + ) { $this->message = $message; $this->channel = $channel; $this->subscription = $subscription; $this->timetoken = $timetoken; $this->publisher = $publisher; $this->error = $error; + $this->customMessageType = $customMessageType; } /** @@ -88,4 +98,9 @@ public function getError() { return $this->error; } + + public function getCustomMessageType(): ?string + { + return $this->customMessageType; + } } diff --git a/src/PubNub/Models/Server/MessageType.php b/src/PubNub/Models/Server/MessageType.php new file mode 100644 index 00000000..1f64ba39 --- /dev/null +++ b/src/PubNub/Models/Server/MessageType.php @@ -0,0 +1,12 @@ +type = $jsonInput['e']; } - $message->publishMetaData = PublishMetadata::fromJson($jsonInput['p']); + if (array_key_exists('cmt', $jsonInput)) { + $message->customMessageType = $jsonInput['cmt']; + } + $message->publishMetaData = PublishMetadata::fromJson($jsonInput['p']); return $message; } @@ -155,4 +149,9 @@ public function getMessageType() { return $this->type; } + + public function getCustomMessageType(): ?string + { + return $this->customMessageType; + } } diff --git a/src/PubNub/PubNub.php b/src/PubNub/PubNub.php index f0867bce..00b5754a 100644 --- a/src/PubNub/PubNub.php +++ b/src/PubNub/PubNub.php @@ -57,7 +57,7 @@ class PubNub implements LoggerAwareInterface { - protected const SDK_VERSION = "7.0.2"; + protected const SDK_VERSION = "7.1.0"; protected const SDK_NAME = "PubNub-PHP"; public static $MAX_SEQUENCE = 65535; diff --git a/tests/Acceptance/CustomMessageType/CustomMessageTypeContext.php b/tests/Acceptance/CustomMessageType/CustomMessageTypeContext.php new file mode 100644 index 00000000..1a8619dc --- /dev/null +++ b/tests/Acceptance/CustomMessageType/CustomMessageTypeContext.php @@ -0,0 +1,197 @@ +config = new PNConfiguration(); + } + + /** + * @Given the demo keyset + */ + public function theDemoKeyset(): void + { + $this->config->setOrigin("localhost:8090") + ->setSecure(false) + ->setPublishKey('demo') + ->setSubscribeKey('demo') + ->setUserId('demo'); + $this->pubnub = new PubNub($this->config); + } + + /** + * @Given the demo keyset with enabled storage + */ + public function theDemoKeysetWithEnabledStorage(): void + { + $this->config->setOrigin("localhost:8090") + ->setSecure(false) + ->setPublishKey('demo') + ->setSubscribeKey('demo') + ->setUserId('demo'); + $this->pubnub = new PubNub($this->config); + } + + /** + * @When I fetch message history for :channelName channel + */ + public function iFetchMessageHistoryForChannel(string $channelName): void + { + $this->channelName = $channelName; + try { + $this->response = $this->pubnub->fetchMessages() + ->channels($this->channelName) + ->sync(); + } catch (PubNubServerException $e) { + $this->response = $e; + } + } + + /** + * @When I fetch message history with :attribute set to :value for :channelName channel + */ + public function iFetchMessageHistoryWithSetToForChannel(string $attribute, string $value, string $channelName): void + { + $this->channelName = $channelName; + $builder = $this->pubnub->fetchMessages()->channels($this->channelName); + if ($attribute === "include_custom_message_type") { + $builder->includeCustomMessageType($value === "true" ? true : false); + } + try { + $this->response = $builder->sync(); + } catch (PubNubServerException $e) { + $this->response = $e; + } + } + + /** + * @When I fetch message history with messageType for :channelName channel + */ + public function iFetchMessageHistoryWithMessagetypeForChannel(string $channelName): void + { + $this->channelName = $channelName; + $builder = $this->pubnub->fetchMessages()->channels($this->channelName)->includeMessageType(true); + try { + $this->response = $builder->sync(); + } catch (PubNubServerException $e) { + $this->response = $e; + } + } + + /** + * @When I fetch message history with customMessageType for :channelName channel + */ + public function iFetchMessageHistoryWithCustommessagetypeForChannel(string $channelName): void + { + $this->channelName = $channelName; + $builder = $this->pubnub->fetchMessages()->channels($this->channelName)->includeCustomMessageType(true); + + try { + $this->response = $builder->sync(); + } catch (PubNubServerException $e) { + $this->response = $e; + } + } + + /** + * @Then history response contains messages with :messageType1 and :messageType2 message types + */ + public function historyResponseContainsMessagesWithAndMessageTypes(string $messageType1, string $messageType2): void + { + $messages = $this->response->getChannels()[$this->channelName]; + assert((int)$messages[0]->getMessageType() === (int)$messageType1); + assert((int)$messages[1]->getMessageType() === (int)$messageType2); + } + + /** + * @Then history response contains messages with :customType1 and :customType2 types + */ + public function historyResponseContainsMessagesWithAndTypes(string $customType1, string $customType2): void + { + $messages = $this->response->getChannels()[$this->channelName]; + assert($messages[0]->getCustomMessageType() === $customType1); + assert($messages[1]->getCustomMessageType() === $customType2); + } + + /** + * @Then history response contains messages without customMessageType + */ + public function historyResponseContainsMessagesWithoutCustommessagetype(): void + { + foreach ($this->response->getChannels()[$this->channelName] as $message) { + assert(is_null($message->getCustomMessageType())); + } + } + + /** + * @When I publish message with :customMessageType customMessageType + */ + public function iPublishMessageWithCustommessagetype(string $customMessageType): void + { + try { + $this->response = $this->pubnub->publish() + ->channel("ch") + ->message("msg") + ->customMessageType($customMessageType) + ->sync(); + } catch (PubNubServerException $e) { + $this->response = $e; + } + } + + /** + * @Then I receive a successful response + */ + public function iReceiveASuccessfulResponse(): void + { + assert($this->response instanceof PNPublishResult || $this->response instanceof PNSignalResult + || $this->response instanceof PNFetchMessagesResult); + } + + /** + * @Then I receive an error response + */ + public function iReceiveAnErrorResponse(): void + { + assert($this->response instanceof PubNubServerException); + } + + /** + * @When I send a signal with :customMessageType customMessageType + */ + public function iSendASignalWithCustommessagetype(string $customMessageType): void + { + try { + $this->response = $this->pubnub->signal() + ->channel("ch") + ->message("msg") + ->customMessageType($customMessageType) + ->sync(); + } catch (PubNubServerException $e) { + $this->response = $e; + } + } +} diff --git a/tests/features/PubNubFeatures/PubNubContext.php b/tests/Acceptance/PubNubContext.php similarity index 86% rename from tests/features/PubNubFeatures/PubNubContext.php rename to tests/Acceptance/PubNubContext.php index abc7a50d..b8c7b4e9 100644 --- a/tests/features/PubNubFeatures/PubNubContext.php +++ b/tests/Acceptance/PubNubContext.php @@ -1,6 +1,6 @@ context = $context; + } + + /** @phpstan-ignore-next-line */ + public function status($pubnub, $status) + { + } + + /** @phpstan-ignore-next-line */ + public function message($pubnub, $messageResult) + { + $this->context->addMessage($messageResult); + } + + /** @phpstan-ignore-next-line */ + public function presence($pubnub, $presence) + { + } + + /** @phpstan-ignore-next-line */ + public function signal($pubnub, $signal) + { + } +} diff --git a/tests/Acceptance/Subscribe/SubscribeContext.php b/tests/Acceptance/Subscribe/SubscribeContext.php new file mode 100644 index 00000000..30266174 --- /dev/null +++ b/tests/Acceptance/Subscribe/SubscribeContext.php @@ -0,0 +1,74 @@ +config = new PNConfiguration(); + } + + public function addMessage(PNMessageResult $message): void + { + $this->messageResults[] = $message; + } + + /** + * @Given the demo keyset + */ + public function theDemoKeyset(): void + { + $this->config->setOrigin("localhost:8090") + ->setSecure(false) + ->setPublishKey('demo') + ->setSubscribeKey('demo') + ->setUserId('demo') + ->setSubscribeTimeout(1); + $this->pubnub = new PubNub($this->config); + } + + /** + * @When I subscribe to :channelName channel + */ + public function iSubscribeToChannel(string $channelName): void + { + $callback = new AcceptanceTestSubscribeCallback($this); + $this->pubnub->addListener($callback); + $this->channelName = $channelName; + $this->pubnub->subscribe()->channels($this->channelName)->execute(); + } + + /** + * @Then I receive :numberOf messages in my subscribe response + */ + public function iReceiveMessagesInMySubscribeResponse(string $numberOf): void + { + assert(count($this->messageResults) === (int)$numberOf); + } + + /** + * @Then response contains messages with :firstCustomType and :secondCustomType types + */ + public function responseContainsMessagesWithAndTypes(string $firstCustomType, string $secondCustomType): void + { + assert($this->messageResults[0]->getCustomMessageType() === $firstCustomType); + assert($this->messageResults[1]->getCustomMessageType() === $secondCustomType); + } +} diff --git a/tests/Acceptance/Subscribe/subscribe-custom-mssg-type.feature b/tests/Acceptance/Subscribe/subscribe-custom-mssg-type.feature new file mode 100644 index 00000000..ef857859 --- /dev/null +++ b/tests/Acceptance/Subscribe/subscribe-custom-mssg-type.feature @@ -0,0 +1,14 @@ +@featureSet=subscribeCustomMssgType @beta +Feature: Subscribe for VSP + As a PubNub user I want to subscribe and receive custom message type. + Client should be able to receive custom message type from subscribe response without any + additional options set (like `include_custom_message_type`for other API). + + Background: + Given the demo keyset + + @contract=subscribeReceiveMessagesWithTypes + Scenario: Client can subscribe and receive messages with types + When I subscribe to 'some-channel' channel + Then I receive 2 messages in my subscribe response + And response contains messages with 'custom-message-type' and 'user-custom-message-type' types diff --git a/tests/bootstrap.php b/tests/bootstrap.php index dc71934e..c4a002ff 100755 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,5 +1,7 @@ context['ttl'] = (int)$ttl; - } - - /** - * @Given the authorized UUID :uuid - */ - public function theAuthorizedUuid($uuid) - { - $this->context['authorizedUuid'] = $uuid; - } - - /** - * @Given the :channel CHANNEL resource access permissions - */ - public function theChannelResourceAccessPermissions($channel) - { - $this->context['resource']['channel'][$channel] = []; - $this->resource = &$this->context['resource']['channel'][$channel]; - } - - /** - * @Given the :channelGroup CHANNEL_GROUP resource access permissions - */ - public function theChannelGroupResourceAccessPermissions($channelGroup) - { - $this->context['resource']['channelGroup'][$channelGroup] = []; - $this->resource = &$this->context['resource']['channelGroup'][$channelGroup]; - } - - /** - * @Given the :uuid UUID resource access permissions - */ - public function theUuidResourceAccessPermissions($uuid) - { - $this->context['resource']['uuid'][$uuid] = []; - $this->resource = &$this->context['resource']['uuid'][$uuid]; - } - - /** - * @Given grant resource permission READ - */ - public function grantResourcePermissionRead() - { - $this->resource['read'] = true; - } - - /** - * @Given grant resource permission WRITE - */ - public function grantResourcePermissionWrite() - { - $this->resource['write'] = true; - } - - /** - * @Given grant resource permission GET - */ - public function grantResourcePermissionGet() - { - $this->resource['get'] = true; - } - - /** - * @Given grant resource permission MANAGE - */ - public function grantResourcePermissionManage() - { - $this->resource['manage'] = true; - } - - /** - * @Given grant resource permission UPDATE - */ - public function grantResourcePermissionUpdate() - { - $this->resource['update'] = true; - } - - /** - * @Given grant resource permission JOIN - */ - public function grantResourcePermissionJoin() - { - $this->resource['join'] = true; - } - - /** - * @Given grant resource permission DELETE - */ - public function grantResourcePermissionDelete() - { - $this->resource['delete'] = true; - } - - /** - * @Given I have a keyset with access manager enabled - */ - public function iHaveAKeysetWithAccessManagerEnabled() - { - $this->pubnub = new PubNub($this->pnConfig); - } - - /** - * @Given the :channel CHANNEL pattern access permissions - */ - public function theChannelPatternAccessPermissions($channel) - { - $this->context['pattern']['channel'][$channel] = []; - $this->resource = &$this->context['pattern']['channel'][$channel]; - } - - /** - * @Given the :channelGroup CHANNEL_GROUP pattern access permissions - */ - public function theChannelGroupPatternAccessPermissions($channelGroup) - { - $this->context['pattern']['channelGroup'][$channelGroup] = []; - $this->resource = &$this->context['pattern']['channelGroup'][$channelGroup]; - } - - /** - * @Given the :uuid UUID pattern access permissions - */ - public function theUuidPatternAccessPermissions($uuid) - { - $this->context['pattern']['uuid'][$uuid] = []; - $this->resource = &$this->context['pattern']['uuid'][$uuid]; - } - - /** - * @Given grant pattern permission READ - */ - public function grantPatternPermissionRead() - { - $this->resource['read'] = true; - } - - /** - * @Given grant pattern permission WRITE - */ - public function grantPatternPermissionWrite() - { - $this->resource['write'] = true; - } - - /** - * @Given grant pattern permission GET - */ - public function grantPatternPermissionGet() - { - $this->resource['get'] = true; - } - - /** - * @Given grant pattern permission MANAGE - */ - public function grantPatternPermissionManage() - { - $this->resource['manage'] = true; - } - - /** - * @Given grant pattern permission UPDATE - */ - public function grantPatternPermissionUpdate() - { - $this->resource['update'] = true; - } - - /** - * @Given grant pattern permission JOIN - */ - public function grantPatternPermissionJoin() - { - $this->resource['join'] = true; - } - - /** - * @Given grant pattern permission DELETE - */ - public function grantPatternPermissionDelete() - { - $this->resource['delete'] = true; - } - - /** - * @Given deny resource permission GET - */ - public function denyResourcePermissionGet() - { - $this->resource['read'] = false; - } - - /** - * @Given I have a known token containing an authorized UUID - */ - public function iHaveAKnownTokenContainingAnAuthorizedUuid() - { - $this->token = 'qEF2AkF0GmGEQqhDdHRsGDxDcmVzpURjaGFuoWljaGFubmVsLTEY70NncnChb2NoYW5uZWxfZ3JvdXAtMQVDdXNyoENzcGO' - . 'gRHV1aWShZnV1aWQtMRhoQ3BhdKVEY2hhbqFtXmNoYW5uZWwtXFMqJBjvQ2dycKF0XjpjaGFubmVsX2dyb3VwLVxTKiQFQ3VzcqBDc3B' - . 'joER1dWlkoWpedXVpZC1cUyokGGhEbWV0YaBEdXVpZHR0ZXN0LWF1dGhvcml6ZWQtdXVpZENzaWdYIDuyE8oo74oI9LVWTwp_OBrvirh' - . 'srR88KgoMPmQT7Cqo'; - } - - /** - * @Given I have a known token containing UUID resource permissions - */ - public function iHaveAKnownTokenContainingUuidResourcePermissions() - { - $this->token = 'qEF2AkF0GmGEQqhDdHRsGDxDcmVzpURjaGFuoWljaGFubmVsLTEY70NncnChb2NoYW5uZWxfZ3JvdXAtMQVDdXNyoENzcGO' - . 'gRHV1aWShZnV1aWQtMRhoQ3BhdKVEY2hhbqFtXmNoYW5uZWwtXFMqJBjvQ2dycKF0XjpjaGFubmVsX2dyb3VwLVxTKiQFQ3VzcqBDc3B' - . 'joER1dWlkoWpedXVpZC1cUyokGGhEbWV0YaBEdXVpZHR0ZXN0LWF1dGhvcml6ZWQtdXVpZENzaWdYIDuyE8oo74oI9LVWTwp_OBrvirh' - . 'srR88KgoMPmQT7Cqo'; - } - - /** - * @Given I have a known token containing UUID pattern Permissions - */ - public function iHaveAKnownTokenContainingUuidPatternPermissions() - { - $this->token = 'qEF2AkF0GmGEQqhDdHRsGDxDcmVzpURjaGFuoWljaGFubmVsLTEY70NncnChb2NoYW5uZWxfZ3JvdXAtMQVDdXNyoENzcGO' - . 'gRHV1aWShZnV1aWQtMRhoQ3BhdKVEY2hhbqFtXmNoYW5uZWwtXFMqJBjvQ2dycKF0XjpjaGFubmVsX2dyb3VwLVxTKiQFQ3VzcqBDc3B' - . 'joER1dWlkoWpedXVpZC1cUyokGGhEbWV0YaBEdXVpZHR0ZXN0LWF1dGhvcml6ZWQtdXVpZENzaWdYIDuyE8oo74oI9LVWTwp_OBrvirh' - . 'srR88KgoMPmQT7Cqo'; - } - - /** - * @Given a token - */ - public function aToken() - { - $this->token = PNContextHelper::PAM_TOKEN_WITH_ALL_PERMS_GRANTED; - return true; - } - - /** - * @Given the token string :token - */ - public function theTokenString($token) - { - $this->token = $token; - } -} diff --git a/tests/features/PubNubFeatures/Access/Then.php b/tests/features/PubNubFeatures/Access/Then.php deleted file mode 100644 index a2638064..00000000 --- a/tests/features/PubNubFeatures/Access/Then.php +++ /dev/null @@ -1,289 +0,0 @@ -token->getUuid()); - } - - /** - * @Then the token contains the TTL :ttl - */ - public function theTokenContainsTheTtl($ttl) - { - Assert::assertEquals($ttl, $this->token->getTtl()); - } - - /** - * @Then the token has :channel CHANNEL resource access permissions - */ - public function theTokenHasChannelResourceAccessPermissions($channel) - { - $this->resource = $this->token->getChannelResource($channel); - Assert::assertNotEquals(false, $this->resource); - } - - /** - * @Then token resource permission READ - */ - public function tokenResourcePermissionRead() - { - Assert::assertTrue($this->resource->hasRead()); - } - - /** - * @Then token resource permission WRITE - */ - public function tokenResourcePermissionWrite() - { - Assert::assertTrue($this->resource->hasWrite()); - } - - /** - * @Then token resource permission GET - */ - public function tokenResourcePermissionGet() - { - Assert::assertTrue($this->resource->hasGet()); - } - - /** - * @Then token resource permission MANAGE - */ - public function tokenResourcePermissionManage() - { - Assert::assertTrue($this->resource->hasManage()); - } - - /** - * @Then token resource permission UPDATE - */ - public function tokenResourcePermissionUpdate() - { - Assert::assertTrue($this->resource->hasUpdate()); - } - - /** - * @Then token resource permission JOIN - */ - public function tokenResourcePermissionJoin() - { - Assert::assertTrue($this->resource->hasJoin()); - } - - /** - * @Then token resource permission DELETE - */ - public function tokenResourcePermissionDelete() - { - Assert::assertTrue($this->resource->hasDelete()); - } - - /** - * @Then the token has :channelGroup CHANNEL_GROUP resource access permissions - */ - public function theTokenHasChannelGroupResourceAccessPermissions($channelGroup) - { - $this->resource = $this->token->getChannelGroupResource($channelGroup); - Assert::assertNotEquals(false, $this->resource); - } - - /** - * @Then the token has :uuid UUID resource access permissions - */ - public function theTokenHasUuidResourceAccessPermissions($uuid) - { - $this->resource = $this->token->getUuidResource($uuid); - Assert::assertNotEquals(false, $this->resource); - } - - /** - * @Then the token has :channel CHANNEL pattern access permissions - */ - public function theTokenHasChannelPatternAccessPermissions($channel) - { - $this->pattern = $this->token->getChannelPattern($channel); - Assert::assertNotEquals(false, $this->pattern); - } - - /** - * @Then token pattern permission READ - */ - public function tokenPatternPermissionRead() - { - Assert::assertTrue($this->pattern->hasRead()); - } - - /** - * @Then token pattern permission WRITE - */ - public function tokenPatternPermissionWrite() - { - Assert::assertTrue($this->pattern->hasWrite()); - } - - /** - * @Then token pattern permission GET - */ - public function tokenPatternPermissionGet() - { - Assert::assertTrue($this->pattern->hasGet()); - } - - /** - * @Then token pattern permission MANAGE - */ - public function tokenPatternPermissionManage() - { - Assert::assertTrue($this->pattern->hasManage()); - } - - /** - * @Then token pattern permission UPDATE - */ - public function tokenPatternPermissionUpdate() - { - Assert::assertTrue($this->pattern->hasUpdate()); - } - - /** - * @Then token pattern permission JOIN - */ - public function tokenPatternPermissionJoin() - { - Assert::assertTrue($this->pattern->hasJoin()); - } - - /** - * @Then token pattern permission DELETE - */ - public function tokenPatternPermissionDelete() - { - Assert::assertTrue($this->pattern->hasDelete()); - } - - /** - * @Then the token has :channelGroup CHANNEL_GROUP pattern access permissions - */ - public function theTokenHasChannelGroupPatternAccessPermissions($channelGroup) - { - $this->pattern = $this->token->getChannelGroupPattern($channelGroup); - Assert::assertNotEquals(false, $this->pattern); - } - - /** - * @Then the token has :uuid UUID pattern access permissions - */ - public function theTokenHasUuidPatternAccessPermissions($uuid) - { - $this->pattern = $this->token->getUuidPattern($uuid); - Assert::assertNotEquals(false, $this->pattern); - } - - /** - * @Then the token does not contain an authorized uuid - */ - public function theTokenDoesNotContainAnAuthorizedUuid() - { - Assert::assertNull($this->token->getUuid()); - } - - /** - * @Then the error status code is :statusCode - */ - public function theErrorStatusCodeIs($statusCode) - { - Assert::assertEquals($statusCode, $this->error->getStatusCode()); - } - - /** - * @Then the error message is :errorMessage - */ - public function theErrorMessageIs($errorMessage) - { - Assert::assertEquals($errorMessage, $this->error->getServerErrorMessage()); - } - - /** - * @Then the error source is :source - */ - public function theErrorSourceIs($source) - { - Assert::assertEquals($source, $this->error->getServerErrorSource()); - } - - /** - * @Then the error detail message is :detailMessage - */ - public function theErrorDetailMessageIs($detailMessage) - { - Assert::assertEquals($detailMessage, $this->error->getServerErrorDetails()->message); - } - - /** - * @Then the error detail location is :detailLocation - */ - public function theErrorDetailLocationIs($detailLocation) - { - Assert::assertEquals($detailLocation, $this->error->getServerErrorDetails()->location); - } - - /** - * @Then the error detail location type is :detailLocationType - */ - public function theErrorDetailLocationTypeIs($detailLocationType) - { - Assert::assertEquals($detailLocationType, $this->error->getServerErrorDetails()->locationType); - } - - /** - * @Then the parsed token output contains the authorized UUID :uuid - */ - public function theParsedTokenOutputContainsTheAuthorizedUuid($uuid) - { - Assert::assertEquals($uuid, $this->token->getUuid()); - } - - /** - * @Then I get confirmation that token has been revoked - */ - public function iGetConfirmationThatTokenHasBeenRevoked() - { - Assert::assertEquals(PNRequestResult::class, get_class($this->result)); - Assert::assertEquals('Success'::class, $this->result->getMessage()); - } - - /** - * @Then an error is returned - */ - public function anErrorIsReturned() - { - Assert::assertEquals(PubNubServerException::class, get_class($this->error)); - } - - /** - * @Then the error detail message is not empty - */ - public function theErrorDetailMessageIsNotEmpty() - { - Assert::assertNotEmpty($this->error->getServerErrorDetails()->message); - } - - /** - * @Then the error service is :service - */ - public function theErrorServiceIs($service) - { - Assert::assertEquals($service, $this->error->getBody()->service); - } -} diff --git a/tests/features/PubNubFeatures/Access/When.php b/tests/features/PubNubFeatures/Access/When.php deleted file mode 100644 index 14934896..00000000 --- a/tests/features/PubNubFeatures/Access/When.php +++ /dev/null @@ -1,77 +0,0 @@ -pubnub->grantToken(); - $token = $grantToken->ttl($this->context['ttl']) - ->authorizedUuid($this->context['authorizedUuid'] ?? null) - ->addChannelResources($this->context['resource']['channel'] ?? null) - ->addChannelGroupResources($this->context['resource']['channelGroup'] ?? null) - ->addUuidResources($this->context['resource']['uuid'] ?? null) - ->addChannelPatterns($this->context['pattern']['channel'] ?? null) - ->addChannelGroupPatterns($this->context['pattern']['channelGroup'] ?? null) - ->addUuidPatterns($this->context['pattern']['uuid'] ?? null) - ->sync(); - $this->token = $this->pubnub->parseToken($token); - } - - /** - * @When I attempt to grant a token specifying those permissions - */ - public function iAttemptToGrantATokenSpecifyingThosePermissions() - { - $this->error = false; - try { - /** @var GrantToken */ - $grantToken = $this->pubnub->grantToken(); - $grantToken->ttl($this->context['ttl']) - ->authorizedUuid($this->context['authorizedUuid'] ?? null) - ->addChannelResources($this->context['resource']['channel'] ?? null) - ->addChannelGroupResources($this->context['resource']['channelGroup'] ?? null) - ->addUuidResources($this->context['resource']['uuid'] ?? null) - ->addChannelPatterns($this->context['pattern']['channel'] ?? null) - ->addChannelGroupPatterns($this->context['pattern']['channelGroup'] ?? null) - ->addUuidPatterns($this->context['pattern']['uuid'] ?? null) - ->sync(); - } catch (PubNubServerException $exception) { - $this->error = $exception; - return true; - } - - return false; - } - - /** - * @When I parse the token - */ - public function iParseTheToken() - { - $this->pubnub = new PubNub($this->pnConfig); - $this->token = $this->pubnub->parseToken($this->token); - } - - /** - * @When I revoke a token - */ - public function iRevokeAToken() - { - try { - $this->result = $this->pubnub->revokeToken() - ->token($this->token) - ->sync(); - } catch (PubNubServerException $exception) { - $this->error = $exception; - } - } -} diff --git a/tests/features/PubNubFeatures/PNContextHelper.php b/tests/features/PubNubFeatures/PNContextHelper.php deleted file mode 100644 index 3abb655c..00000000 --- a/tests/features/PubNubFeatures/PNContextHelper.php +++ /dev/null @@ -1,21 +0,0 @@ -pnConfig = new PNConfiguration(); - $this->pnConfig->setPublishKey('pub-c-mock-key'); - $this->pnConfig->setSubscribeKey('sub-c-mock-key'); - $this->pnConfig->setSecretKey('sec-c-mock-key'); - $this->pnConfig->setOrigin($this->origin); - $this->pnConfig->setSecure(false); - } -} diff --git a/tests/features/bootstrap/TimeContext.php b/tests/features/bootstrap/TimeContext.php deleted file mode 100644 index 1799c9fb..00000000 --- a/tests/features/bootstrap/TimeContext.php +++ /dev/null @@ -1,31 +0,0 @@ -response = $pubnub->time()->sync(); - return true; - } - - /** - * @Then I receive successful response - */ - public function iReceiveSuccessfulResponse() - { - return ('PubNub\Models\Consumer\PNTimeResult' === get_class($this->response)); - } -} diff --git a/tests/integrational/FetchMessagesTest.php b/tests/integrational/FetchMessagesTest.php index 0d92c0af..ddf4cc93 100644 --- a/tests/integrational/FetchMessagesTest.php +++ b/tests/integrational/FetchMessagesTest.php @@ -22,13 +22,18 @@ class FetchMessagesTest extends PubNubTestCase public function testFetchWithDefaults() { - $fetchMessages = new FetchMessagesExposed($this->pubnub); + $subKey = $this->pubnub_demo->getConfiguration()->getSubscribeKey(); + $fetchMessages = new FetchMessagesExposed($this->pubnub_demo); $fetchMessages ->stubFor("/v3/history/sub-key/demo/channel/TheMessageHistoryChannelHD") ->withQuery([ - "uuid" => $this->pubnub->getConfiguration()->getUserId(), - "pnsdk" => $this->encodedSdkName + "uuid" => $this->pubnub_demo->getConfiguration()->getUserId(), + "pnsdk" => $this->encodedSdkName, + "include_meta" => "false", + "include_uuid" => "false", + "include_message_type" => "true", + "include_custom_message_type" => "false", ]) ->setResponseBody('{"status": 200, "error": false, "error_message": "", "channels": {"TheMessageHistoryChannelHD":[ @@ -55,14 +60,19 @@ public function testFetchWithDefaults() public function testFetchWithCount() { - $fetchMessages = new FetchMessagesExposed($this->pubnub); + $subKey = $this->pubnub_demo->getConfiguration()->getSubscribeKey(); + $fetchMessages = new FetchMessagesExposed($this->pubnub_demo); $fetchMessages - ->stubFor("/v3/history/sub-key/demo/channel/TheMessageHistoryChannelHD") + ->stubFor("/v3/history/sub-key/{$subKey}/channel/TheMessageHistoryChannelHD") ->withQuery([ "max" => "5", - "uuid" => $this->pubnub->getConfiguration()->getUserId(), - "pnsdk" => $this->encodedSdkName + "uuid" => $this->pubnub_demo->getConfiguration()->getUserId(), + "pnsdk" => $this->encodedSdkName, + "include_meta" => "false", + "include_uuid" => "false", + "include_message_type" => "true", + "include_custom_message_type" => "false", ]) ->setResponseBody('{"status": 200, "error": false, "error_message": "", "channels": {"TheMessageHistoryChannelHD":[ @@ -84,15 +94,20 @@ public function testFetchWithCount() public function testFetchWithStartEnd() { - $fetchMessages = new FetchMessagesExposed($this->pubnub); + $subKey = $this->pubnub_demo->getConfiguration()->getSubscribeKey(); + $fetchMessages = new FetchMessagesExposed($this->pubnub_demo); $fetchMessages - ->stubFor("/v3/history/sub-key/demo/channel/TheMessageHistoryChannelHD") + ->stubFor("/v3/history/sub-key/{$subKey}/channel/TheMessageHistoryChannelHD") ->withQuery([ "start" => "17165627042258346", "end" => "17165627042258546", - "uuid" => $this->pubnub->getConfiguration()->getUserId(), - "pnsdk" => $this->encodedSdkName + "uuid" => $this->pubnub_demo->getConfiguration()->getUserId(), + "pnsdk" => $this->encodedSdkName, + "include_meta" => "false", + "include_uuid" => "false", + "include_message_type" => "true", + "include_custom_message_type" => "false", ]) ->setResponseBody('{"status": 200, "error": false, "error_message": "", "channels": {"TheMessageHistoryChannelHD":[ @@ -114,13 +129,18 @@ public function testFetchWithStartEnd() public function testFetchEncrypted() { + $subKey = $this->pubnub_enc->getConfiguration()->getSubscribeKey(); $fetchMessages = new FetchMessagesExposed($this->pubnub_enc); $fetchMessages - ->stubFor("/v3/history/sub-key/demo/channel/TheMessageHistoryChannelHD-ENCRYPTED") + ->stubFor("/v3/history/sub-key/{$subKey}/channel/TheMessageHistoryChannelHD-ENCRYPTED") ->withQuery([ - "uuid" => $this->pubnub->getConfiguration()->getUserId(), - "pnsdk" => $this->encodedSdkName + "uuid" => $this->pubnub_enc->getConfiguration()->getUserId(), + "pnsdk" => $this->encodedSdkName, + "include_meta" => "false", + "include_uuid" => "false", + "include_message_type" => "true", + "include_custom_message_type" => "false", ]) ->setResponseBody('{"status": 200, "error": false, "error_message": "", "channels": { diff --git a/tests/integrational/SubscribeTest.php b/tests/integrational/SubscribeTest.php index ab42f3b8..91331070 100644 --- a/tests/integrational/SubscribeTest.php +++ b/tests/integrational/SubscribeTest.php @@ -2,7 +2,6 @@ namespace Tests\Integrational; - use PubNub\Enums\PNStatusCategory; use PubNub\Exceptions\PubNubUnsubscribeException; use PubNub\Models\Consumer\PubSub\PNMessageResult; @@ -11,12 +10,10 @@ use PubNub\Models\ResponseHelpers\PNStatus; use PubNub\PubNub; - const CHANNEL = 'ch1'; const MESSAGE = 'hey'; const GROUP = 'gr1'; - /** * Class SubscribeTest * @requires extension pthreads @@ -59,6 +56,7 @@ public function xtestCGSubscribePublishUnsubscribe() } } +//phpcs:ignore PSR1.Classes.ClassDeclaration class MySubscribeCallback extends SubscribeCallback { protected $config; @@ -67,12 +65,12 @@ class MySubscribeCallback extends SubscribeCallback * MySubscribeCallback constructor. * @param $config */ - function __construct(PNConfiguration $config) + public function __construct(PNConfiguration $config) { $this->config = $config; } - function status($pubnub, $status) + public function status($pubnub, $status) { if ($status->getCategory() === PNStatusCategory::PNConnectedCategory) { throw new PubNubUnsubscribeException(); @@ -84,22 +82,22 @@ function status($pubnub, $status) * @param PNMessageResult $message * @throws PubNubUnsubscribeException */ - function message($pubnub, $message) + public function message($pubnub, $message) { } - function presence($pubnub, $presence) + public function presence($pubnub, $presence) { } } - +//phpcs:ignore PSR1.Classes.ClassDeclaration class MySubscribePublishCallback extends SubscribeCallback { /** @var PNConfiguration */ protected $config; - function __construct($config) + public function __construct($config) { $this->config = $config; } @@ -108,7 +106,7 @@ function __construct($config) * @param PubNub $pubnub * @param PNStatus $status */ - function status($pubnub, $status) + public function status($pubnub, $status) { if ($status->getCategory() === PNStatusCategory::PNConnectedCategory) { $publishThread = new PublishThread($this->config, false); @@ -122,20 +120,21 @@ function status($pubnub, $status) * @param PNMessageResult $message * @throws PubNubUnsubscribeException */ - function message($pubnub, $message) + public function message($pubnub, $message) { if ($message->getMessage() === MESSAGE) { throw new PubNubUnsubscribeException(); } } - function presence($pubnub, $presence) + public function presence($pubnub, $presence) { } } - -class PublishThread extends \Thread { +//phpcs:ignore PSR1.Classes.ClassDeclaration +class PublishThread extends \Thread +{ /** @var PNConfiguration */ protected $config; @@ -156,11 +155,11 @@ public function run() $pubnub->publish()->channel(CHANNEL)->message(MESSAGE)->sync(); } - function message($pubnub, $message) + public function message($pubnub, $message) { } - function presence($pubnub, $presence) + public function presence($pubnub, $presence) { } } diff --git a/tests/integrational/objects/channel/GetAllChannelMetadataEndpointTest.php b/tests/integrational/objects/channel/GetAllChannelMetadataEndpointTest.php index a495ef68..10ac146e 100644 --- a/tests/integrational/objects/channel/GetAllChannelMetadataEndpointTest.php +++ b/tests/integrational/objects/channel/GetAllChannelMetadataEndpointTest.php @@ -4,7 +4,6 @@ use PubNubTestCase; - class GetAllChannelMetadataEndpointTest extends PubNubTestCase { public function testGetAllChannelMetadata() @@ -53,11 +52,15 @@ public function testGetAllChannelMetadata() ->sync(); $this->assertNotEmpty($response); - // $this->assertEquals(3, $response->getTotalCount()); $data = $response->getData(); - // $this->assertEquals(3, count($data)); + // since we share keys between all SDK's we need to filter out other test data and focus only on our own + $data = array_values(array_filter($data, function ($element) { + return in_array($element->getId(), ['ch', 'ch1', 'ch2']); + })); + + $this->assertEquals(3, count($data)); $value = $data[0]; $this->assertEquals("ch", $value->getId()); @@ -84,6 +87,11 @@ public function testGetAllChannelMetadata() $custom = $value->getCustom(); $this->assertNotEmpty($custom); $this->assertEquals("aa2", $custom->a); - $this->assertEquals("bb2", $custom->b); + $this->assertEquals("bb2", $custom->b); + + // cleanup + $this->pubnub->removeChannelMetadata()->channel("ch")->sync(); + $this->pubnub->removeChannelMetadata()->channel("ch1")->sync(); + $this->pubnub->removeChannelMetadata()->channel("ch2")->sync(); } }