diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml
index e91919f34..df8de8bc3 100644
--- a/.github/workflows/php.yml
+++ b/.github/workflows/php.yml
@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- php-versions: [8.1]
+ php-versions: [8.2]
nextcloud-versions: ['stable28', 'master']
include:
- - php: 8.1
+ - php: 8.2
nextcloud-version: master
name: Nextcloud ${{ matrix.nextcloud-versions }} php${{ matrix.php-versions }} unit tests
diff --git a/appinfo/info.xml b/appinfo/info.xml
index 0220aa74a..76878b21f 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -78,6 +78,11 @@ For this version, you should refresh your browser from the Workspace app with `C
https://raw.githubusercontent.com/arawa/workspace/main/screenshots/workspace-add-users.png
https://raw.githubusercontent.com/arawa/workspace/main/screenshots/workspace-subgroups.png
+
+ OCA\Workspace\Commands\Create
+ OCA\Workspace\Commands\Import
+
+
Workspace
diff --git a/composer.json b/composer.json
index 04bfcf1e8..0f1f5f77f 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,8 @@
"require-dev": {
"phpunit/phpunit": "^9.5",
"nextcloud/coding-standard": "^1.1",
- "nextcloud/ocp": "^26.0"
+ "nextcloud/ocp": "^26.0",
+ "symfony/console": "^6.3"
},
"scripts": {
"test": "phpunit -c tests/phpunit.unit.xml --fail-on-warning",
diff --git a/composer.lock b/composer.lock
index 4d5968a5e..debf59616 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,40 +4,40 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "7ca3efbad44eb0baa98644fe14af494f",
+ "content-hash": "495b287108645e9f713beedbb55466e5",
"packages": [],
"packages-dev": [
{
- "name": "composer/pcre",
- "version": "3.1.0",
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
"source": {
"type": "git",
- "url": "https://github.com/composer/pcre.git",
- "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2"
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
- "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
"shasum": ""
},
"require": {
- "php": "^7.4 || ^8.0"
+ "php": "^8.1"
},
"require-dev": {
- "phpstan/phpstan": "^1.3",
- "phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^5"
+ "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",
- "extra": {
- "branch-alias": {
- "dev-main": "3.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "Composer\\Pcre\\": "src"
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -46,147 +46,118 @@
],
"authors": [
{
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
}
],
- "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
"keywords": [
- "PCRE",
- "preg",
- "regex",
- "regular expression"
+ "constructor",
+ "instantiate"
],
"support": {
- "issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/3.1.0"
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
},
"funding": [
{
- "url": "https://packagist.com",
+ "url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
- "url": "https://github.com/composer",
- "type": "github"
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
},
{
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
"type": "tidelift"
}
],
- "time": "2022-11-17T09:50:14+00:00"
+ "time": "2022-12-30T00:23:10+00:00"
},
{
- "name": "composer/semver",
- "version": "3.3.2",
+ "name": "myclabs/deep-copy",
+ "version": "1.11.1",
"source": {
"type": "git",
- "url": "https://github.com/composer/semver.git",
- "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
- "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"shasum": ""
},
"require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3,<3.2.2"
},
"require-dev": {
- "phpstan/phpstan": "^1.4",
- "symfony/phpunit-bridge": "^4.2 || ^5"
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "3.x-dev"
- }
- },
"autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
"psr-4": {
- "Composer\\Semver\\": "src"
+ "DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
- },
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- },
- {
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
- }
- ],
- "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "description": "Create deep copies (clones) of your objects",
"keywords": [
- "semantic",
- "semver",
- "validation",
- "versioning"
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
],
"support": {
- "irc": "irc://irc.freenode.org/composer",
- "issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.3.2"
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
},
"funding": [
{
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
- "time": "2022-04-01T19:23:25+00:00"
+ "time": "2023-03-08T13:26:56+00:00"
},
{
- "name": "composer/xdebug-handler",
- "version": "3.0.3",
+ "name": "nextcloud/coding-standard",
+ "version": "v1.2.1",
"source": {
"type": "git",
- "url": "https://github.com/composer/xdebug-handler.git",
- "reference": "ced299686f41dce890debac69273b47ffe98a40c"
+ "url": "https://github.com/nextcloud/coding-standard.git",
+ "reference": "cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
- "reference": "ced299686f41dce890debac69273b47ffe98a40c",
+ "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e",
+ "reference": "cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e",
"shasum": ""
},
"require": {
- "composer/pcre": "^1 || ^2 || ^3",
- "php": "^7.2.5 || ^8.0",
- "psr/log": "^1 || ^2 || ^3"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^6.0"
+ "php": "^7.3|^8.0",
+ "php-cs-fixer/shim": "^3.17"
},
"type": "library",
"autoload": {
"psr-4": {
- "Composer\\XdebugHandler\\": "src"
+ "Nextcloud\\CodingStandard\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -195,1361 +166,328 @@
],
"authors": [
{
- "name": "John Stevenson",
- "email": "john-stevenson@blueyonder.co.uk"
+ "name": "Christoph Wurst",
+ "email": "christoph@winzerhof-wurst.at"
}
],
- "description": "Restarts a process without Xdebug.",
- "keywords": [
- "Xdebug",
- "performance"
- ],
+ "description": "Nextcloud coding standards for the php cs fixer",
"support": {
- "irc": "irc://irc.freenode.org/composer",
- "issues": "https://github.com/composer/xdebug-handler/issues",
- "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
+ "issues": "https://github.com/nextcloud/coding-standard/issues",
+ "source": "https://github.com/nextcloud/coding-standard/tree/v1.2.1"
},
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
- }
- ],
- "time": "2022-02-25T21:32:43+00:00"
+ "time": "2024-02-01T14:54:37+00:00"
},
{
- "name": "doctrine/annotations",
- "version": "2.0.1",
+ "name": "nextcloud/ocp",
+ "version": "v26.0.9",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/annotations.git",
- "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f"
+ "url": "https://github.com/nextcloud-deps/ocp.git",
+ "reference": "43bc0a0267d97b02966e0270e00e9d51192564af"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
- "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
+ "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/43bc0a0267d97b02966e0270e00e9d51192564af",
+ "reference": "43bc0a0267d97b02966e0270e00e9d51192564af",
"shasum": ""
},
"require": {
- "doctrine/lexer": "^2 || ^3",
- "ext-tokenizer": "*",
- "php": "^7.2 || ^8.0",
- "psr/cache": "^1 || ^2 || ^3"
- },
- "require-dev": {
- "doctrine/cache": "^2.0",
- "doctrine/coding-standard": "^10",
- "phpstan/phpstan": "^1.8.0",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "symfony/cache": "^5.4 || ^6",
- "vimeo/psalm": "^4.10"
- },
- "suggest": {
- "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+ "php": "^7.4 || ~8.0 || ~8.1",
+ "psr/container": "^1.1.1",
+ "psr/event-dispatcher": "^1.0",
+ "psr/log": "^1.1"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "26.0.0-dev"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "AGPL-3.0-or-later"
],
"authors": [
{
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
+ "name": "Christoph Wurst",
+ "email": "christoph@winzerhof-wurst.at"
}
],
- "description": "Docblock Annotations Parser",
- "homepage": "https://www.doctrine-project.org/projects/annotations.html",
- "keywords": [
- "annotations",
- "docblock",
- "parser"
- ],
+ "description": "Composer package containing Nextcloud's public API (classes, interfaces)",
"support": {
- "issues": "https://github.com/doctrine/annotations/issues",
- "source": "https://github.com/doctrine/annotations/tree/2.0.1"
+ "issues": "https://github.com/nextcloud-deps/ocp/issues",
+ "source": "https://github.com/nextcloud-deps/ocp/tree/v26.0.9"
},
- "time": "2023-02-02T22:02:53+00:00"
+ "time": "2023-11-10T00:31:54+00:00"
},
{
- "name": "doctrine/deprecations",
- "version": "v1.0.0",
+ "name": "nikic/php-parser",
+ "version": "v5.0.2",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/deprecations.git",
- "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de"
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
- "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13",
+ "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13",
"shasum": ""
},
"require": {
- "php": "^7.1|^8.0"
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
},
"require-dev": {
- "doctrine/coding-standard": "^9",
- "phpunit/phpunit": "^7.5|^8.5|^9.5",
- "psr/log": "^1|^2|^3"
- },
- "suggest": {
- "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
+ "bin": [
+ "bin/php-parse"
+ ],
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
"autoload": {
"psr-4": {
- "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
+ "PhpParser\\": "lib/PhpParser"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
],
- "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
- "homepage": "https://www.doctrine-project.org/",
"support": {
- "issues": "https://github.com/doctrine/deprecations/issues",
- "source": "https://github.com/doctrine/deprecations/tree/v1.0.0"
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2"
},
- "time": "2022-05-02T15:47:09+00:00"
+ "time": "2024-03-05T20:51:40+00:00"
},
{
- "name": "doctrine/instantiator",
- "version": "1.5.0",
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
- "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
- },
- "require-dev": {
- "doctrine/coding-standard": "^9 || ^11",
- "ext-pdo": "*",
+ "ext-dom": "*",
+ "ext-libxml": "*",
"ext-phar": "*",
- "phpbench/phpbench": "^0.16 || ^1",
- "phpstan/phpstan": "^1.4",
- "phpstan/phpstan-phpunit": "^1",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "vimeo/psalm": "^4.30 || ^5.4"
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
}
},
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com",
- "homepage": "https://ocramius.github.io/"
+ "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": "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"
- ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
- "issues": "https://github.com/doctrine/instantiator/issues",
- "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
},
"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"
+ "url": "https://github.com/theseer",
+ "type": "github"
}
],
- "time": "2022-12-30T00:15:36+00:00"
+ "time": "2024-03-03T12:33:53+00:00"
},
{
- "name": "doctrine/lexer",
- "version": "2.1.0",
+ "name": "phar-io/version",
+ "version": "3.2.1",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/lexer.git",
- "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124"
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
- "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
"shasum": ""
},
"require": {
- "doctrine/deprecations": "^1.0",
- "php": "^7.1 || ^8.0"
- },
- "require-dev": {
- "doctrine/coding-standard": "^9 || ^10",
- "phpstan/phpstan": "^1.3",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "psalm/plugin-phpunit": "^0.18.3",
- "vimeo/psalm": "^4.11 || ^5.0"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"autoload": {
- "psr-4": {
- "Doctrine\\Common\\Lexer\\": "src"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
- }
- ],
- "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
- "homepage": "https://www.doctrine-project.org/projects/lexer.html",
- "keywords": [
- "annotations",
- "docblock",
- "lexer",
- "parser",
- "php"
- ],
- "support": {
- "issues": "https://github.com/doctrine/lexer/issues",
- "source": "https://github.com/doctrine/lexer/tree/2.1.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%2Flexer",
- "type": "tidelift"
- }
- ],
- "time": "2022-12-14T08:49:07+00:00"
- },
- {
- "name": "friendsofphp/php-cs-fixer",
- "version": "v3.16.0",
- "source": {
- "type": "git",
- "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
- "reference": "d40f9436e1c448d309fa995ab9c14c5c7a96f2dc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d40f9436e1c448d309fa995ab9c14c5c7a96f2dc",
- "reference": "d40f9436e1c448d309fa995ab9c14c5c7a96f2dc",
- "shasum": ""
- },
- "require": {
- "composer/semver": "^3.3",
- "composer/xdebug-handler": "^3.0.3",
- "doctrine/annotations": "^2",
- "doctrine/lexer": "^2 || ^3",
- "ext-json": "*",
- "ext-tokenizer": "*",
- "php": "^7.4 || ^8.0",
- "sebastian/diff": "^4.0 || ^5.0",
- "symfony/console": "^5.4 || ^6.0",
- "symfony/event-dispatcher": "^5.4 || ^6.0",
- "symfony/filesystem": "^5.4 || ^6.0",
- "symfony/finder": "^5.4 || ^6.0",
- "symfony/options-resolver": "^5.4 || ^6.0",
- "symfony/polyfill-mbstring": "^1.27",
- "symfony/polyfill-php80": "^1.27",
- "symfony/polyfill-php81": "^1.27",
- "symfony/process": "^5.4 || ^6.0",
- "symfony/stopwatch": "^5.4 || ^6.0"
- },
- "require-dev": {
- "justinrainbow/json-schema": "^5.2",
- "keradus/cli-executor": "^2.0",
- "mikey179/vfsstream": "^1.6.11",
- "php-coveralls/php-coveralls": "^2.5.3",
- "php-cs-fixer/accessible-object": "^1.1",
- "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2",
- "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1",
- "phpspec/prophecy": "^1.16",
- "phpspec/prophecy-phpunit": "^2.0",
- "phpunit/phpunit": "^9.5",
- "phpunitgoodpractices/polyfill": "^1.6",
- "phpunitgoodpractices/traits": "^1.9.2",
- "symfony/phpunit-bridge": "^6.2.3",
- "symfony/yaml": "^5.4 || ^6.0"
- },
- "suggest": {
- "ext-dom": "For handling output formats in XML",
- "ext-mbstring": "For handling non-UTF8 characters."
- },
- "bin": [
- "php-cs-fixer"
- ],
- "type": "application",
- "autoload": {
- "psr-4": {
- "PhpCsFixer\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Dariusz RumiĆski",
- "email": "dariusz.ruminski@gmail.com"
- }
- ],
- "description": "A tool to automatically fix PHP code style",
- "keywords": [
- "Static code analysis",
- "fixer",
- "standards",
- "static analysis"
- ],
- "support": {
- "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
- "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.16.0"
- },
- "funding": [
- {
- "url": "https://github.com/keradus",
- "type": "github"
- }
- ],
- "time": "2023-04-02T19:30:06+00:00"
- },
- {
- "name": "myclabs/deep-copy",
- "version": "1.11.1",
- "source": {
- "type": "git",
- "url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
- "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",
- "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.11.1"
- },
- "funding": [
- {
- "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
- "type": "tidelift"
- }
- ],
- "time": "2023-03-08T13:26:56+00:00"
- },
- {
- "name": "nextcloud/coding-standard",
- "version": "v1.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/nextcloud/coding-standard.git",
- "reference": "20efa30db5240a5f078e03b04c685735a89dfc9e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/20efa30db5240a5f078e03b04c685735a89dfc9e",
- "reference": "20efa30db5240a5f078e03b04c685735a89dfc9e",
- "shasum": ""
- },
- "require": {
- "friendsofphp/php-cs-fixer": "^3.9",
- "php": "^7.3|^8.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Nextcloud\\CodingStandard\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christoph Wurst",
- "email": "christoph@winzerhof-wurst.at"
- }
- ],
- "description": "Nextcloud coding standards for the php cs fixer",
- "support": {
- "issues": "https://github.com/nextcloud/coding-standard/issues",
- "source": "https://github.com/nextcloud/coding-standard/tree/v1.1.0"
- },
- "time": "2023-04-13T10:52:46+00:00"
- },
- {
- "name": "nextcloud/ocp",
- "version": "v26.0.9",
- "source": {
- "type": "git",
- "url": "https://github.com/nextcloud-deps/ocp.git",
- "reference": "43bc0a0267d97b02966e0270e00e9d51192564af"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/43bc0a0267d97b02966e0270e00e9d51192564af",
- "reference": "43bc0a0267d97b02966e0270e00e9d51192564af",
- "shasum": ""
- },
- "require": {
- "php": "^7.4 || ~8.0 || ~8.1",
- "psr/container": "^1.1.1",
- "psr/event-dispatcher": "^1.0",
- "psr/log": "^1.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "26.0.0-dev"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "AGPL-3.0-or-later"
- ],
- "authors": [
- {
- "name": "Christoph Wurst",
- "email": "christoph@winzerhof-wurst.at"
- }
- ],
- "description": "Composer package containing Nextcloud's public API (classes, interfaces)",
- "support": {
- "issues": "https://github.com/nextcloud-deps/ocp/issues",
- "source": "https://github.com/nextcloud-deps/ocp/tree/v26.0.9"
- },
- "time": "2023-11-10T00:31:54+00:00"
- },
- {
- "name": "nikic/php-parser",
- "version": "v5.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13",
- "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13",
- "shasum": ""
- },
- "require": {
- "ext-ctype": "*",
- "ext-json": "*",
- "ext-tokenizer": "*",
- "php": ">=7.4"
- },
- "require-dev": {
- "ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^7.0 || ^8.0 || ^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.0.2"
- },
- "time": "2024-03-05T20:51:40+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.18",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "32c2c2d6580b1d8ab3c10b1e9e4dc263cc69bb04"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/32c2c2d6580b1d8ab3c10b1e9e4dc263cc69bb04",
- "reference": "32c2c2d6580b1d8ab3c10b1e9e4dc263cc69bb04",
- "shasum": ""
- },
- "require": {
- "doctrine/instantiator": "^1.3.1 || ^2",
- "ext-dom": "*",
- "ext-json": "*",
- "ext-libxml": "*",
- "ext-mbstring": "*",
- "ext-xml": "*",
- "ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.10.1",
- "phar-io/manifest": "^2.0.3",
- "phar-io/version": "^3.0.2",
- "php": ">=7.3",
- "phpunit/php-code-coverage": "^9.2.28",
- "phpunit/php-file-iterator": "^3.0.5",
- "phpunit/php-invoker": "^3.1.1",
- "phpunit/php-text-template": "^2.0.3",
- "phpunit/php-timer": "^5.0.2",
- "sebastian/cli-parser": "^1.0.1",
- "sebastian/code-unit": "^1.0.6",
- "sebastian/comparator": "^4.0.8",
- "sebastian/diff": "^4.0.3",
- "sebastian/environment": "^5.1.3",
- "sebastian/exporter": "^4.0.5",
- "sebastian/global-state": "^5.0.1",
- "sebastian/object-enumerator": "^4.0.3",
- "sebastian/resource-operations": "^3.0.3",
- "sebastian/type": "^3.2",
- "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.18"
- },
- "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-03-21T12:07:32+00:00"
- },
- {
- "name": "psr/cache",
- "version": "3.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/cache.git",
- "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
- "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
- "shasum": ""
- },
- "require": {
- "php": ">=8.0.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Cache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common interface for caching libraries",
- "keywords": [
- "cache",
- "psr",
- "psr-6"
- ],
- "support": {
- "source": "https://github.com/php-fig/cache/tree/3.0.0"
- },
- "time": "2021-02-03T23:26:27+00:00"
- },
- {
- "name": "psr/container",
- "version": "1.1.2",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
- "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
- "shasum": ""
- },
- "require": {
- "php": ">=7.4.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Psr\\Container\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
{
- "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/1.1.2"
- },
- "time": "2021-11-05T16:50:12+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": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
{
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
}
],
- "description": "Standard interfaces for event handling.",
- "keywords": [
- "events",
- "psr",
- "psr-14"
- ],
+ "description": "Library for handling version information and constraints",
"support": {
- "issues": "https://github.com/php-fig/event-dispatcher/issues",
- "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
},
- "time": "2019-01-08T18:20:26+00:00"
+ "time": "2022-02-21T01:04:05+00:00"
},
{
- "name": "psr/log",
- "version": "1.1.4",
+ "name": "php-cs-fixer/shim",
+ "version": "v3.57.2",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+ "url": "https://github.com/PHP-CS-Fixer/shim.git",
+ "reference": "2141067497145f224111eee89a0b4a0d0f3fe487"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/2141067497145f224111eee89a0b4a0d0f3fe487",
+ "reference": "2141067497145f224111eee89a0b4a0d0f3fe487",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1.x-dev"
- }
+ "replace": {
+ "friendsofphp/php-cs-fixer": "self.version"
},
- "autoload": {
- "psr-4": {
- "Psr\\Log\\": "Psr/Log/"
- }
+ "suggest": {
+ "ext-dom": "For handling output formats in XML",
+ "ext-mbstring": "For handling non-UTF8 characters."
},
+ "bin": [
+ "php-cs-fixer",
+ "php-cs-fixer.phar"
+ ],
+ "type": "application",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Dariusz RumiĆski",
+ "email": "dariusz.ruminski@gmail.com"
}
],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ],
+ "description": "A tool to automatically fix PHP code style",
"support": {
- "source": "https://github.com/php-fig/log/tree/1.1.4"
+ "issues": "https://github.com/PHP-CS-Fixer/shim/issues",
+ "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.57.2"
},
- "time": "2021-05-03T11:20:27+00:00"
+ "time": "2024-05-20T20:42:23+00:00"
},
{
- "name": "sebastian/cli-parser",
- "version": "1.0.2",
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.31",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
- "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965",
+ "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "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": "1.0-dev"
+ "dev-master": "9.2-dev"
}
},
"autoload": {
@@ -1568,11 +506,17 @@
"role": "lead"
}
],
- "description": "Library for parsing CLI options",
- "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "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/cli-parser/issues",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
+ "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": [
{
@@ -1580,20 +524,20 @@
"type": "github"
}
],
- "time": "2024-03-02T06:27:43+00:00"
+ "time": "2024-03-02T06:37:42+00:00"
},
{
- "name": "sebastian/code-unit",
- "version": "1.0.8",
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/code-unit.git",
- "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
- "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
"shasum": ""
},
"require": {
@@ -1605,7 +549,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -1624,11 +568,15 @@
"role": "lead"
}
],
- "description": "Collection of value objects that represent the PHP code units",
- "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "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/code-unit/issues",
- "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
},
"funding": [
{
@@ -1636,32 +584,36 @@
"type": "github"
}
],
- "time": "2020-10-26T13:08:54+00:00"
+ "time": "2021-12-02T12:48:52+00:00"
},
{
- "name": "sebastian/code-unit-reverse-lookup",
- "version": "2.0.3",
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
- "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "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": "2.0-dev"
+ "dev-master": "3.1-dev"
}
},
"autoload": {
@@ -1676,14 +628,18 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Looks up which function or method a line of code belongs to",
- "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
"support": {
- "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
- "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
},
"funding": [
{
@@ -1691,26 +647,24 @@
"type": "github"
}
],
- "time": "2020-09-28T05:30:19+00:00"
+ "time": "2020-09-28T05:58:55+00:00"
},
{
- "name": "sebastian/comparator",
- "version": "4.0.8",
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
- "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/diff": "^4.0",
- "sebastian/exporter": "^4.0"
+ "php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
@@ -1718,7 +672,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -1733,31 +687,18 @@
"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"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Provides the functionality to compare PHP values for equality",
- "homepage": "https://github.com/sebastianbergmann/comparator",
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
"keywords": [
- "comparator",
- "compare",
- "equality"
+ "template"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/comparator/issues",
- "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
},
"funding": [
{
@@ -1765,24 +706,23 @@
"type": "github"
}
],
- "time": "2022-09-14T12:41:17+00:00"
+ "time": "2020-10-26T05:33:50+00:00"
},
{
- "name": "sebastian/complexity",
- "version": "2.0.3",
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
- "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@@ -1791,7 +731,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
@@ -1810,11 +750,14 @@
"role": "lead"
}
],
- "description": "Library for calculating the complexity of PHP code units",
- "homepage": "https://github.com/sebastianbergmann/complexity",
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
"support": {
- "issues": "https://github.com/sebastianbergmann/complexity/issues",
- "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
},
"funding": [
{
@@ -1822,36 +765,68 @@
"type": "github"
}
],
- "time": "2023-12-22T06:19:30+00:00"
+ "time": "2020-10-26T13:16:10+00:00"
},
{
- "name": "sebastian/diff",
- "version": "4.0.6",
+ "name": "phpunit/phpunit",
+ "version": "9.6.19",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
- "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8",
+ "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "doctrine/instantiator": "^1.3.1 || ^2",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.3",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.28",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.8",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.5",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^3.2",
+ "sebastian/version": "^3.0.2"
},
- "require-dev": {
- "phpunit/phpunit": "^9.3",
- "symfony/process": "^4.2 || ^5"
+ "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": "4.0-dev"
+ "dev-master": "9.6-dev"
}
},
"autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
"classmap": [
"src/"
]
@@ -1863,203 +838,210 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Diff implementation",
- "homepage": "https://github.com/sebastianbergmann/diff",
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
"keywords": [
- "diff",
- "udiff",
- "unidiff",
- "unified diff"
+ "phpunit",
+ "testing",
+ "xunit"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19"
},
"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-03-02T06:30:58+00:00"
+ "time": "2024-04-05T04:35:58+00:00"
},
{
- "name": "sebastian/environment",
- "version": "5.1.5",
+ "name": "psr/container",
+ "version": "1.1.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
- "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=7.4.0"
},
- "require-dev": {
- "phpunit/phpunit": "^9.3"
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
},
- "suggest": {
- "ext-posix": "*"
+ "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/1.1.2"
+ },
+ "time": "2021-11-05T16:50:12+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": "5.1-dev"
+ "dev-master": "1.0.x-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
}
],
- "description": "Provides functionality to handle HHVM/PHP environments",
- "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "description": "Standard interfaces for event handling.",
"keywords": [
- "Xdebug",
- "environment",
- "hhvm"
+ "events",
+ "psr",
+ "psr-14"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
},
- "funding": [
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- }
- ],
- "time": "2023-02-03T06:03:51+00:00"
+ "time": "2019-01-08T18:20:26+00:00"
},
{
- "name": "sebastian/exporter",
- "version": "4.0.6",
+ "name": "psr/log",
+ "version": "1.1.4",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72"
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72",
- "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/recursion-context": "^4.0"
- },
- "require-dev": {
- "ext-mbstring": "*",
- "phpunit/phpunit": "^9.3"
+ "php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-master": "1.1.x-dev"
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"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"
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
}
],
- "description": "Provides the functionality to export PHP variables for visualization",
- "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
"keywords": [
- "export",
- "exporter"
+ "log",
+ "psr",
+ "psr-3"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/exporter/issues",
- "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6"
+ "source": "https://github.com/php-fig/log/tree/1.1.4"
},
- "funding": [
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- }
- ],
- "time": "2024-03-02T06:33:00+00:00"
+ "time": "2021-05-03T11:20:27+00:00"
},
{
- "name": "sebastian/global-state",
- "version": "5.0.7",
+ "name": "sebastian/cli-parser",
+ "version": "1.0.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9"
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
- "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/object-reflector": "^2.0",
- "sebastian/recursion-context": "^4.0"
+ "php": ">=7.3"
},
"require-dev": {
- "ext-dom": "*",
"phpunit/phpunit": "^9.3"
},
- "suggest": {
- "ext-uopz": "*"
- },
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.0-dev"
+ "dev-master": "1.0-dev"
}
},
"autoload": {
@@ -2074,17 +1056,15 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Snapshotting of global state",
- "homepage": "http://www.github.com/sebastianbergmann/global-state",
- "keywords": [
- "global state"
- ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
- "issues": "https://github.com/sebastianbergmann/global-state/issues",
- "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7"
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
},
"funding": [
{
@@ -2092,24 +1072,23 @@
"type": "github"
}
],
- "time": "2024-03-02T06:35:11+00:00"
+ "time": "2024-03-02T06:27:43+00:00"
},
{
- "name": "sebastian/lines-of-code",
- "version": "1.0.4",
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
- "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@@ -2137,11 +1116,11 @@
"role": "lead"
}
],
- "description": "Library for counting the lines of code in PHP source code",
- "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
- "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
},
"funding": [
{
@@ -2149,26 +1128,24 @@
"type": "github"
}
],
- "time": "2023-12-22T06:20:34+00:00"
+ "time": "2020-10-26T13:08:54+00:00"
},
{
- "name": "sebastian/object-enumerator",
- "version": "4.0.4",
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
- "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/object-reflector": "^2.0",
- "sebastian/recursion-context": "^4.0"
+ "php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
@@ -2176,7 +1153,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -2194,11 +1171,11 @@
"email": "sebastian@phpunit.de"
}
],
- "description": "Traverses array structures and object graphs to enumerate all referenced objects",
- "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "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/object-enumerator/issues",
- "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
},
"funding": [
{
@@ -2206,24 +1183,26 @@
"type": "github"
}
],
- "time": "2020-10-26T13:12:34+00:00"
+ "time": "2020-09-28T05:30:19+00:00"
},
{
- "name": "sebastian/object-reflector",
- "version": "2.0.4",
+ "name": "sebastian/comparator",
+ "version": "4.0.8",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/object-reflector.git",
- "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
- "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
@@ -2231,7 +1210,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -2247,13 +1226,30 @@
{
"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": "Allows reflection of object attributes, including inherited and non-public ones",
- "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "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/object-reflector/issues",
- "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
},
"funding": [
{
@@ -2261,23 +1257,24 @@
"type": "github"
}
],
- "time": "2020-10-26T13:14:26+00:00"
+ "time": "2022-09-14T12:41:17+00:00"
},
{
- "name": "sebastian/recursion-context",
- "version": "4.0.5",
+ "name": "sebastian/complexity",
+ "version": "2.0.3",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
- "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "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": {
@@ -2286,7 +1283,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -2301,22 +1298,15 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Provides functionality to recursively process PHP variables",
- "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
- "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
},
"funding": [
{
@@ -2324,32 +1314,33 @@
"type": "github"
}
],
- "time": "2023-02-03T06:07:39+00:00"
+ "time": "2023-12-22T06:19:30+00:00"
},
{
- "name": "sebastian/resource-operations",
- "version": "3.0.4",
+ "name": "sebastian/diff",
+ "version": "4.0.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e"
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
- "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^9.0"
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -2365,12 +1356,23 @@
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
}
],
- "description": "Provides a list of PHP built-in functions that operate on resources",
- "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
"support": {
- "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4"
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
},
"funding": [
{
@@ -2378,32 +1380,35 @@
"type": "github"
}
],
- "time": "2024-03-14T16:00:52+00:00"
+ "time": "2024-03-02T06:30:58+00:00"
},
{
- "name": "sebastian/type",
- "version": "3.2.1",
+ "name": "sebastian/environment",
+ "version": "5.1.5",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/type.git",
- "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
- "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^9.5"
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "5.1-dev"
}
},
"autoload": {
@@ -2418,15 +1423,19 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Collection of value objects that represent the types of the PHP type system",
- "homepage": "https://github.com/sebastianbergmann/type",
+ "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/type/issues",
- "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
},
"funding": [
{
@@ -2434,29 +1443,34 @@
"type": "github"
}
],
- "time": "2023-02-03T06:13:03+00:00"
+ "time": "2023-02-03T06:03:51+00:00"
},
{
- "name": "sebastian/version",
- "version": "3.0.2",
+ "name": "sebastian/exporter",
+ "version": "4.0.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/version.git",
- "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
- "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72",
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -2471,15 +1485,34 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "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": "Library that helps with managing the version number of Git-hosted PHP projects",
- "homepage": "https://github.com/sebastianbergmann/version",
+ "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/version/issues",
- "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6"
},
"funding": [
{
@@ -2487,642 +1520,519 @@
"type": "github"
}
],
- "time": "2020-09-28T06:39:44+00:00"
+ "time": "2024-03-02T06:33:00+00:00"
},
{
- "name": "symfony/console",
- "version": "v6.0.19",
+ "name": "sebastian/global-state",
+ "version": "5.0.7",
"source": {
"type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed"
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/c3ebc83d031b71c39da318ca8b7a07ecc67507ed",
- "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/service-contracts": "^1.1|^2|^3",
- "symfony/string": "^5.4|^6.0"
- },
- "conflict": {
- "symfony/dependency-injection": "<5.4",
- "symfony/dotenv": "<5.4",
- "symfony/event-dispatcher": "<5.4",
- "symfony/lock": "<5.4",
- "symfony/process": "<5.4"
- },
- "provide": {
- "psr/log-implementation": "1.0|2.0|3.0"
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
},
"require-dev": {
- "psr/log": "^1|^2|^3",
- "symfony/config": "^5.4|^6.0",
- "symfony/dependency-injection": "^5.4|^6.0",
- "symfony/event-dispatcher": "^5.4|^6.0",
- "symfony/lock": "^5.4|^6.0",
- "symfony/process": "^5.4|^6.0",
- "symfony/var-dumper": "^5.4|^6.0"
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
},
"suggest": {
- "psr/log": "For using the console logger",
- "symfony/event-dispatcher": "",
- "symfony/lock": "",
- "symfony/process": ""
+ "ext-uopz": "*"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
"autoload": {
- "psr-4": {
- "Symfony\\Component\\Console\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Eases the creation of beautiful and testable command line interfaces",
- "homepage": "https://symfony.com",
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
"keywords": [
- "cli",
- "command line",
- "console",
- "terminal"
+ "global state"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.0.19"
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7"
},
"funding": [
{
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
}
],
- "time": "2023-01-01T08:36:10+00:00"
+ "time": "2024-03-02T06:35:11+00:00"
},
{
- "name": "symfony/deprecation-contracts",
- "version": "v3.0.2",
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.4",
"source": {
"type": "git",
- "url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
- "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
"shasum": ""
},
"require": {
- "php": ">=8.0.2"
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "dev-master": "1.0-dev"
}
},
"autoload": {
- "files": [
- "function.php"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "A generic function and convention to trigger deprecation notices",
- "homepage": "https://symfony.com",
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
},
"funding": [
{
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2023-12-22T06:20:34+00:00"
},
{
- "name": "symfony/event-dispatcher",
- "version": "v6.0.19",
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a"
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2eaf8e63bc5b8cefabd4a800157f0d0c094f677a",
- "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
- "symfony/event-dispatcher-contracts": "^2|^3"
- },
- "conflict": {
- "symfony/dependency-injection": "<5.4"
- },
- "provide": {
- "psr/event-dispatcher-implementation": "1.0",
- "symfony/event-dispatcher-implementation": "2.0|3.0"
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
},
"require-dev": {
- "psr/log": "^1|^2|^3",
- "symfony/config": "^5.4|^6.0",
- "symfony/dependency-injection": "^5.4|^6.0",
- "symfony/error-handler": "^5.4|^6.0",
- "symfony/expression-language": "^5.4|^6.0",
- "symfony/http-foundation": "^5.4|^6.0",
- "symfony/service-contracts": "^1.1|^2|^3",
- "symfony/stopwatch": "^5.4|^6.0"
- },
- "suggest": {
- "symfony/dependency-injection": "",
- "symfony/http-kernel": ""
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
"autoload": {
- "psr-4": {
- "Symfony\\Component\\EventDispatcher\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
- "homepage": "https://symfony.com",
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.19"
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
},
"funding": [
{
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
}
],
- "time": "2023-01-01T08:36:10+00:00"
+ "time": "2020-10-26T13:12:34+00:00"
},
{
- "name": "symfony/event-dispatcher-contracts",
- "version": "v3.0.2",
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "7bc61cc2db649b4637d331240c5346dcc7708051"
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051",
- "reference": "7bc61cc2db649b4637d331240c5346dcc7708051",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
- "psr/event-dispatcher": "^1"
+ "php": ">=7.3"
},
- "suggest": {
- "symfony/event-dispatcher-implementation": ""
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Contracts\\EventDispatcher\\": ""
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Generic abstractions related to dispatching event",
- "homepage": "https://symfony.com",
- "keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
- ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2"
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
},
"funding": [
{
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2020-10-26T13:14:26+00:00"
},
{
- "name": "symfony/filesystem",
- "version": "v6.0.19",
+ "name": "sebastian/recursion-context",
+ "version": "4.0.5",
"source": {
"type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214"
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
- "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-mbstring": "~1.8"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
"autoload": {
- "psr-4": {
- "Symfony\\Component\\Filesystem\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
}
],
- "description": "Provides basic utilities for the filesystem",
- "homepage": "https://symfony.com",
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v6.0.19"
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
},
"funding": [
{
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
}
],
- "time": "2023-01-20T17:44:14+00:00"
+ "time": "2023-02-03T06:07:39+00:00"
},
{
- "name": "symfony/finder",
- "version": "v6.0.19",
+ "name": "sebastian/resource-operations",
+ "version": "3.0.4",
"source": {
"type": "git",
- "url": "https://github.com/symfony/finder.git",
- "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11"
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/5cc9cac6586fc0c28cd173780ca696e419fefa11",
- "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
"shasum": ""
},
"require": {
- "php": ">=8.0.2"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
"autoload": {
- "psr-4": {
- "Symfony\\Component\\Finder\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Finds files and directories via an intuitive fluent interface",
- "homepage": "https://symfony.com",
+ "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/symfony/finder/tree/v6.0.19"
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4"
},
"funding": [
{
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
}
],
- "time": "2023-01-20T17:44:14+00:00"
+ "time": "2024-03-14T16:00:52+00:00"
},
{
- "name": "symfony/options-resolver",
- "version": "v6.0.19",
+ "name": "sebastian/type",
+ "version": "3.2.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/options-resolver.git",
- "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3"
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/6a180d1c45e0d9797470ca9eb46215692de00fa3",
- "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
- "symfony/deprecation-contracts": "^2.1|^3"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
"autoload": {
- "psr-4": {
- "Symfony\\Component\\OptionsResolver\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Provides an improved replacement for the array_replace PHP function",
- "homepage": "https://symfony.com",
- "keywords": [
- "config",
- "configuration",
- "options"
- ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v6.0.19"
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
},
"funding": [
{
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
}
],
- "time": "2023-01-01T08:36:10+00:00"
+ "time": "2023-02-03T06:13:03+00:00"
},
{
- "name": "symfony/polyfill-ctype",
- "version": "v1.27.0",
+ "name": "sebastian/version",
+ "version": "3.0.2",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
- "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
"shasum": ""
},
"require": {
- "php": ">=7.1"
- },
- "provide": {
- "ext-ctype": "*"
- },
- "suggest": {
- "ext-ctype": "For best performance"
+ "php": ">=7.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.27-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "BackEndTea@gmail.com"
- },
+ "authors": [
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Symfony polyfill for ctype functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
},
"funding": [
{
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2020-09-28T06:39:44+00:00"
},
{
- "name": "symfony/polyfill-intl-grapheme",
- "version": "v1.27.0",
+ "name": "symfony/console",
+ "version": "v6.4.7",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
+ "url": "https://github.com/symfony/console.git",
+ "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
- "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
+ "url": "https://api.github.com/repos/symfony/console/zipball/a170e64ae10d00ba89e2acbb590dc2e54da8ad8f",
+ "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0|^7.0"
},
- "suggest": {
- "ext-intl": "For best performance"
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
},
+ "type": "library",
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
- }
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3130,26 +2040,24 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for intl's grapheme_* functions",
+ "description": "Eases the creation of beautiful and testable command line interfaces",
"homepage": "https://symfony.com",
"keywords": [
- "compatibility",
- "grapheme",
- "intl",
- "polyfill",
- "portable",
- "shim"
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
+ "source": "https://github.com/symfony/console/tree/v6.4.7"
},
"funding": [
{
@@ -3165,47 +2073,38 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-04-18T09:22:46+00:00"
},
{
- "name": "symfony/polyfill-intl-normalizer",
- "version": "v1.27.0",
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.5.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
- "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": ""
},
"require": {
- "php": ">=7.1"
- },
- "suggest": {
- "ext-intl": "For best performance"
+ "php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.27-dev"
+ "dev-main": "3.5-dev"
},
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
- },
- "classmap": [
- "Resources/stubs"
+ "function.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3222,18 +2121,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "intl",
- "normalizer",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -3249,36 +2140,33 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-04-18T09:32:20+00:00"
},
{
- "name": "symfony/polyfill-mbstring",
- "version": "v1.27.0",
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.29.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
- "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
+ "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"provide": {
- "ext-mbstring": "*"
+ "ext-ctype": "*"
},
"suggest": {
- "ext-mbstring": "For best performance"
+ "ext-ctype": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3289,7 +2177,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
+ "Symfony\\Polyfill\\Ctype\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -3298,25 +2186,24 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for the Mbstring extension",
+ "description": "Symfony polyfill for ctype functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
- "mbstring",
+ "ctype",
"polyfill",
- "portable",
- "shim"
+ "portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
},
"funding": [
{
@@ -3332,30 +2219,30 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-01-29T20:11:03+00:00"
},
{
- "name": "symfony/polyfill-php80",
- "version": "v1.27.0",
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.29.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
- "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f",
+ "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3366,21 +2253,14 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php80\\": ""
- },
- "classmap": [
- "Resources/stubs"
- ]
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
- {
- "name": "Ion Bazan",
- "email": "ion.bazan@gmail.com"
- },
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
@@ -3390,16 +2270,18 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "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-php80/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0"
},
"funding": [
{
@@ -3415,30 +2297,30 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-01-29T20:11:03+00:00"
},
{
- "name": "symfony/polyfill-php81",
- "version": "v1.27.0",
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.29.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php81.git",
- "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a"
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a",
- "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
+ "reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3449,7 +2331,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php81\\": ""
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
},
"classmap": [
"Resources/stubs"
@@ -3469,16 +2351,18 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "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-php81/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0"
},
"funding": [
{
@@ -3494,33 +2378,45 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-01-29T20:11:03+00:00"
},
{
- "name": "symfony/process",
- "version": "v6.0.19",
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.29.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "2114fd60f26a296cc403a7939ab91478475a33d4"
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/2114fd60f26a296cc403a7939ab91478475a33d4",
- "reference": "2114fd60f26a296cc403a7939ab91478475a33d4",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
+ "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
"shasum": ""
},
"require": {
- "php": ">=8.0.2"
+ "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\\Component\\Process\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3528,18 +2424,25 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Executes commands in sub-processes",
+ "description": "Symfony polyfill for the Mbstring extension",
"homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
"support": {
- "source": "https://github.com/symfony/process/tree/v6.0.19"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
},
"funding": [
{
@@ -3555,37 +2458,34 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:36:10+00:00"
+ "time": "2024-01-29T20:11:03+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v2.5.2",
+ "version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c"
+ "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
- "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+ "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/container": "^1.1",
- "symfony/deprecation-contracts": "^2.1|^3"
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"ext-psr": "<1.1|>=2"
},
- "suggest": {
- "symfony/service-implementation": ""
- },
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.5-dev"
+ "dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -3595,7 +2495,10 @@
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Service\\": ""
- }
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3622,69 +2525,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v2.5.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": "2022-05-30T19:17:29+00:00"
- },
- {
- "name": "symfony/stopwatch",
- "version": "v6.0.19",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/stopwatch.git",
- "reference": "011e781839dd1d2eb8119f65ac516a530f60226d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/011e781839dd1d2eb8119f65ac516a530f60226d",
- "reference": "011e781839dd1d2eb8119f65ac516a530f60226d",
- "shasum": ""
- },
- "require": {
- "php": ">=8.0.2",
- "symfony/service-contracts": "^1|^2|^3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Stopwatch\\": ""
- },
- "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 a way to profile code",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/stopwatch/tree/v6.0.19"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -3700,37 +2541,38 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:36:10+00:00"
+ "time": "2024-04-18T09:32:20+00:00"
},
{
"name": "symfony/string",
- "version": "v6.0.19",
+ "version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a"
+ "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a",
- "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a",
+ "url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63",
+ "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
+ "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.0"
+ "symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/error-handler": "^5.4|^6.0",
- "symfony/http-client": "^5.4|^6.0",
- "symfony/translation-contracts": "^2.0|^3.0",
- "symfony/var-exporter": "^5.4|^6.0"
+ "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": {
@@ -3769,7 +2611,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.0.19"
+ "source": "https://github.com/symfony/string/tree/v7.0.7"
},
"funding": [
{
@@ -3785,7 +2627,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:36:10+00:00"
+ "time": "2024-04-18T09:29:19+00:00"
},
{
"name": "theseer/tokenizer",
@@ -3847,5 +2689,5 @@
"php": ">=7.4 <=8.3"
},
"platform-dev": [],
- "plugin-api-version": "2.6.0"
+ "plugin-api-version": "2.3.0"
}
diff --git a/lib/Commands/Create.php b/lib/Commands/Create.php
new file mode 100644
index 000000000..b80ea93ec
--- /dev/null
+++ b/lib/Commands/Create.php
@@ -0,0 +1,265 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Commands;
+
+use OCA\Workspace\Group\Admin\AdminGroup;
+use OCA\Workspace\Group\Admin\AdminGroupManager;
+use OCA\Workspace\Group\User\UserGroup;
+use OCA\Workspace\Group\User\UserGroupManager;
+use OCA\Workspace\Helper\GroupfolderHelper;
+use OCA\Workspace\Space\SpaceManager;
+use OCA\Workspace\User\UserFinder;
+use OCA\Workspace\User\UserPresenceChecker;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Create extends Command {
+
+ public const OUTPUT_FORMAT_PLAIN = 'plain';
+ public const OUTPUT_FORMAT_JSON_PRETTY = 'json_pretty';
+ public const OPTION_FORMAT_AVAILABLE = [ 'json' ];
+
+ public function __construct(private SpaceManager $spaceManager,
+ private AdminGroup $adminGroup,
+ private LoggerInterface $logger,
+ private UserGroup $userGroup,
+ private UserPresenceChecker $userChecker,
+ private UserFinder $userFinder,
+ private GroupfolderHelper $groupfolderHelper) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->addOption(
+ 'output',
+ null,
+ InputOption::VALUE_OPTIONAL,
+ 'Output format (plain, json or json_pretty, default is plain)',
+ self::OUTPUT_FORMAT_PLAIN
+ );
+
+ $this
+ ->setName('workspace:create')
+ ->setDescription('This command allows you to create a workspace')
+ ->addArgument('name', InputArgument::REQUIRED, 'The name of your workspace.')
+ ->addOption(
+ 'format',
+ 'F',
+ InputOption::VALUE_REQUIRED,
+ 'Output json',
+ 'json'
+ )
+ ->addOption(
+ 'user-workspace-manager',
+ 'uwm',
+ InputOption::VALUE_REQUIRED,
+ 'The user will be workspace manager of your workspace. Please, use its user-id or email address'
+ )
+ ->addOption(
+ 'quota',
+ 'qt',
+ InputOption::VALUE_OPTIONAL,
+ 'The quota of the workspace in Gb. Default it\'s illimited.'
+ );
+
+ parent::configure();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int {
+
+ $outputMessage = 'success';
+ $spacename = $input->getArgument('name');
+
+ if ($input->hasParameterOption('--user-workspace-manager')) {
+ $pattern = $input->getOption('user-workspace-manager');
+ if (!$this->userChecker->checkUserExist($pattern)) {
+ $this->logger->error("$pattern could not be found. Please, make sure user-id or email exists in the Nextcloud instance.");
+ throw new \Exception("$pattern could not be found. Please, make sure user-id or email exists in the Nextcloud instance.");
+ }
+ }
+
+ if ($this->checkValueFormatOptionIsValid($input)) {
+ $this->logger->error(
+ sprintf(
+ "The format value is not valid.\nPlease, add a valid option : %s",
+ implode(', ', self::OPTION_FORMAT_AVAILABLE)
+ )
+ );
+ throw new \Exception(
+ sprintf(
+ "The format value is not valid.\nPlease, add a valid option : %s",
+ implode(', ', self::OPTION_FORMAT_AVAILABLE)
+ )
+ );
+ }
+
+ if ($input->hasParameterOption('--quota')) {
+ $value = $input->getOption('quota');
+
+ preg_match('/[a-zA-Z].*/', $value, $matches);
+ $unit = strtolower($matches[0]);
+
+ if (!$this->checkUnitBytes($unit)) {
+ throw new \Exception('You didn\'t define the good unit for quota. Allowed units are: kb, mb, gb or tb');
+ }
+ }
+
+ $workspace = $this->spaceManager->create($spacename);
+
+ if ($input->hasParameterOption('--user-workspace-manager')) {
+ $userManagerName = $input->getOption('user-workspace-manager');
+
+ $this->addUserToAdminGroupManager(
+ $userManagerName,
+ $workspace
+ );
+
+ $this->addUserToUserGroupManager(
+ $userManagerName,
+ $workspace
+ );
+ }
+
+ if ($input->hasParameterOption('--format')) {
+ $value = $input->getOption('format');
+ if (in_array($value, self::OPTION_FORMAT_AVAILABLE)) {
+ $outputMessage = $this->formatOutput($input, $workspace);
+ }
+ }
+
+ if ($input->hasParameterOption('--quota')) {
+ $value = $input->getOption('quota');
+
+ preg_match('/[a-zA-Z].*/', $value, $matches);
+ $unit = strtolower($matches[0]);
+
+ if (!$this->checkUnitBytes($unit)) {
+ throw new \Exception('You didn\'t define the good unit for quota. Allowed units are: kb, mb, gb or tb');
+ }
+
+ $bytes = $this->convertToByte($value);
+
+ $this->groupfolderHelper->setFolderQuota($workspace['folder_id'], $bytes);
+
+ }
+
+ $this->logger->info(sprintf("The workspace created with %s", $outputMessage));
+ $output->writeln($outputMessage);
+
+ return 0;
+ }
+
+ private function checkUnitBytes(string $unit): bool {
+ $unit = strtolower($unit);
+
+ $units = [ 'kb', 'mb', 'gb', 'tb'];
+
+ if (in_array($unit, $units)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ private function convertToByte(string $value): int {
+
+ preg_match('/[0-9]+/', $value, $matches);
+ $valueOfUnit = (int)$matches[0];
+
+ preg_match('/[a-zA-Z].*/', $value, $matches);
+ $unit = strtolower($matches[0]);
+
+ if ($valueOfUnit === 0) {
+ return -3;
+ }
+
+ switch ($unit) {
+ case 'kb':
+ $valueInByte = $valueOfUnit * 1024;
+ break;
+ case 'mb':
+ $valueInByte = $valueOfUnit * 1024 ** 2;
+ break;
+ case 'gb':
+ $valueInByte = $valueOfUnit * 1024 ** 3;
+ break;
+ case 'tb':
+ $valueInByte = $valueOfUnit * 1024 ** 4;
+ break;
+ }
+
+ return $valueInByte;
+ }
+
+ private function addUserToAdminGroupManager(string $username, array $workspace): bool {
+ $user = $this->userFinder->findUser($username);
+ $groupname = AdminGroupManager::findWorkspaceManager($workspace);
+ $this->adminGroup->addUser($user, $groupname);
+
+ return true;
+ }
+
+ private function addUserToUserGroupManager(string $username, array $workspace): bool {
+ $user = $this->userFinder->findUser($username);
+ $groupname = UserGroupManager::findWorkspaceManager($workspace);
+ $this->userGroup->addUser($user, $groupname);
+
+ return true;
+ }
+
+ private function checkValueFormatOptionIsValid(InputInterface $input): bool {
+ if ($input->hasParameterOption('--format')) {
+ $value = $input->getOption('format');
+ if ($value !== 'json') {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private function formatOutput(InputInterface $input, array $items): string {
+ switch ($input->getOption('output')) {
+ case self::OUTPUT_FORMAT_JSON_PRETTY:
+ return json_encode($items, JSON_PRETTY_PRINT);
+ break;
+ case self::OUTPUT_FORMAT_PLAIN:
+ if (!is_array($items)) {
+ return (string)$items;
+ } else {
+ return json_encode($items);
+ }
+ break;
+ default:
+ return json_encode($items);
+ break;
+ }
+ }
+}
diff --git a/lib/Commands/Import.php b/lib/Commands/Import.php
new file mode 100644
index 000000000..037ac6131
--- /dev/null
+++ b/lib/Commands/Import.php
@@ -0,0 +1,292 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Commands;
+
+use OCA\Workspace\Files\MassiveWorkspaceCreation\Csv;
+use OCA\Workspace\Group\Admin\AdminGroup;
+use OCA\Workspace\Group\Admin\AdminGroupManager;
+use OCA\Workspace\Group\User\UserGroup;
+use OCA\Workspace\Group\User\UserGroupManager;
+use OCA\Workspace\Helper\GroupfolderHelper;
+use OCA\Workspace\Service\Workspace\WorkspaceCheckService;
+use OCA\Workspace\Space\SpaceManager;
+use OCA\Workspace\User\UserFinder;
+use OCA\Workspace\User\UserPresenceChecker;
+use OCP\IGroupManager;
+use OCP\IRequest;
+use OCP\IUserManager;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Import extends Command {
+
+ public function __construct(
+ private AdminGroup $adminGroup,
+ private Csv $csvCreatingWorkspaces,
+ private GroupfolderHelper $groupfolderHelper,
+ private IGroupManager $groupManager,
+ private IRequest $request,
+ private IUserManager $userManager,
+ private SpaceManager $spaceManager,
+ private UserFinder $userFinder,
+ private UserGroup $userGroup,
+ private UserPresenceChecker $userChecker,
+ private WorkspaceCheckService $workspaceCheckService,
+ private LoggerInterface $logger) {
+ parent::__construct();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int {
+ $path = realpath($input->getArgument('path'));
+
+ if (!$this->csvCreatingWorkspaces->isCsvFile($path)) {
+ $this->logger->critical("It's not a csv file. Your file is a " . (string)$this->csvCreatingWorkspaces->getMimeType($path) . " mimetype.");
+ throw new \Exception("It's not a csv file. Your file is a " . (string)$this->csvCreatingWorkspaces->getMimeType($path) . " mimetype.");
+ }
+
+ if (!$this->csvCreatingWorkspaces->hasProperHeader($path)) {
+ $this->logger->error(sprintf(
+ "No respect the glossary headers. "
+ . "Please, you must define these 2 headers : "
+ . "%s : To specify the workspace name."
+ . "%s : To specify the user's user-id or email address."
+ . "%s : To specify the workspace quota.",
+ implode(", ", Csv::WORKSPACE_FIELD),
+ implode(", ", Csv::USER_FIELD),
+ implode(", ", Csv::QUOTA_FIELD)
+ ));
+ throw new \Exception(
+ sprintf(
+ "No respect the glossary headers.\n\n"
+ . "Please, you must define these 2 headers :\n"
+ . " - %s : To specify the workspace name.\n"
+ . " - %s : To specify the user's user-id or email address.\n"
+ . " - %s : To specify the workspace quota.",
+ implode(", ", Csv::WORKSPACE_FIELD),
+ implode(", ", Csv::USER_FIELD),
+ implode(", ", Csv::QUOTA_FIELD)
+ )
+ );
+ }
+
+ $dataFormated = $this->csvCreatingWorkspaces->parser($path);
+
+ foreach ($dataFormated as $data) {
+ if ($this->checkIllimitedQuota($data['quota'])) {
+ continue;
+ }
+
+ preg_match('/[a-zA-Z].*/', $data['quota'], $matches);
+ $unit = strtolower($matches[0]);
+
+ if (!$this->checkUnitBytes($unit)) {
+ throw new \Exception('You didn\'t define the good unit for quota. Allowed units are: kb, mb, gb or tb');
+ }
+ }
+
+ $spacenamesWithCharacterSpecials = $this->getWorkspacesWithCharacterSpecials($dataFormated);
+
+ if (!is_null($spacenamesWithCharacterSpecials)) {
+ $this->logger->error($spacenamesWithCharacterSpecials);
+ throw new \Exception($spacenamesWithCharacterSpecials);
+ }
+
+ if ($this->workspaceCheckService->spacenamesIsDuplicated($dataFormated)) {
+ $message = "Impossible to import your workspaces from the csv file.\n";
+ $message .= $this->getSpacenamesFromCsvFileDuplicated($dataFormated);
+ throw new \Exception($message);
+ }
+
+ $message = $this->getSpacenamesDuplicated($dataFormated);
+ $message .= $this->getUsersArentExist($dataFormated);
+
+ if (!empty($message)) {
+ $this->logger->error($message);
+ throw new \Exception($message);
+ }
+
+ foreach ($dataFormated as $data) {
+
+ $user = $this->userFinder->findUser($data['user_uid']);
+
+ $workspace = $this->spaceManager->create($data['workspace_name']);
+ $adminGroupname = AdminGroupManager::findWorkspaceManager($workspace);
+ $userGroupname = UserGroupManager::findWorkspaceManager($workspace);
+
+ $quota = $this->convertToByte($data['quota']);
+ $this->groupfolderHelper->setFolderQuota($workspace['folder_id'], $quota);
+
+ $this->adminGroup->addUser($user, $adminGroupname);
+ $this->userGroup->addUser($user, $userGroupname);
+ }
+
+ $this->logger->info("workspaces import done");
+ $output->writeln("workspaces import done");
+
+ return 0;
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('workspace:import')
+ ->setDescription('This command allows you to import a csv file to create workspaces and define their managers.')
+ ->addArgument('path', InputArgument::REQUIRED, 'The path of the csv file.');
+ parent::configure();
+ }
+
+ private function checkUnitBytes(string $unit): bool {
+ $unit = strtolower($unit);
+
+ $units = [ 'kb', 'mb', 'gb', 'tb'];
+
+ if (in_array($unit, $units)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ private function checkIllimitedQuota(string $unit): bool {
+ if ($unit === '-3') {
+ return true;
+ }
+
+ return false;
+ }
+
+ private function convertToByte(string $value): int {
+
+ if ($this->checkIllimitedQuota($value)) {
+ return -3;
+ }
+
+ preg_match('/[0-9]+/', $value, $matches);
+ $valueOfUnit = (int)$matches[0];
+
+ preg_match('/[a-zA-Z].*/', $value, $matches);
+ $unit = strtolower($matches[0]);
+
+ switch ($unit) {
+ case 'kb':
+ $valueInByte = $valueOfUnit * 1024;
+ break;
+ case 'mb':
+ $valueInByte = $valueOfUnit * 1024 ** 2;
+ break;
+ case 'gb':
+ $valueInByte = $valueOfUnit * 1024 ** 3;
+ break;
+ case 'tb':
+ $valueInByte = $valueOfUnit * 1024 ** 4;
+ break;
+ }
+
+ return $valueInByte;
+ }
+
+ private function getSpacenamesFromCsvFileDuplicated(array $spaces): string {
+ $workspaceNames = [];
+ $message = '';
+
+ foreach ($spaces as $space) {
+ $workspaceNames[] = $space['workspace_name'];
+ }
+
+ $workspaceNamesDiff = array_values(
+ array_diff_assoc($workspaceNames, array_unique($workspaceNames))
+ );
+
+ $spacenamesFormated = array_map(fn ($spacename) => "- $spacename\n", $workspaceNamesDiff);
+
+ $message .= "The Workspace names below are duplicated:\n" . implode('', $spacenamesFormated);
+
+ return $message;
+ }
+
+ private function getSpacenamesDuplicated(array $dataResponse): ?string {
+ $workspacesAreNotExist = [];
+ $message = "";
+
+ foreach ($dataResponse as $data) {
+ if ($this->workspaceCheckService->isExist($data['workspace_name'])) {
+ $workspacesAreNotExist[] = $data['workspace_name'];
+ }
+ }
+
+ if (!empty($workspacesAreNotExist)) {
+ $workspacesAreNotExist = array_map(fn ($spacename) => " - $spacename\n", $workspacesAreNotExist);
+ $message .= "The Workspace names below already exist:\n" . implode('', $workspacesAreNotExist);
+ $message .= "\n";
+
+ return $message;
+ }
+
+ return null;
+ }
+
+ private function getUsersArentExist(array $dataResponse): ?string {
+ $usersAreNotExist = [];
+ $message = "";
+
+ foreach ($dataResponse as $data) {
+ if (!$this->userChecker->checkUserExist($data['user_uid'])) {
+ $usersAreNotExist[] = $data['user_uid'];
+ }
+ }
+
+ if (!empty($usersAreNotExist)) {
+ $usersAreNotExist = array_map(fn ($username) => " - $username\n", $usersAreNotExist);
+ $message .= "The below users do not exist:\n" . implode('', $usersAreNotExist);
+
+ return $message;
+ }
+
+ return null;
+ }
+
+ private function getWorkspacesWithCharacterSpecials(array $dataResponse): ?string {
+ $spacenamesWithCharacterSpecials = [];
+ $message = "";
+
+ foreach ($dataResponse as $data) {
+ if ($this->workspaceCheckService->containSpecialChar($data['workspace_name'])) {
+ $spacenamesWithCharacterSpecials[] = $data['workspace_name'];
+ }
+ }
+
+ if (!empty($spacenamesWithCharacterSpecials)) {
+ $spacenamesStringify = array_map(fn ($spacename) => " - $spacename\n", $spacenamesWithCharacterSpecials);
+ $message .= "The below workspace names contain special characters :\n" . implode('', $spacenamesStringify);
+ $message .= "\nPlease, make sure the Workspace names do not contain one of the following characters: " . implode(" ", str_split(WorkspaceCheckService::CHARACTERS_SPECIAL));
+
+ return $message;
+ }
+
+ return null;
+ }
+}
diff --git a/lib/Controller/WorkspaceController.php b/lib/Controller/WorkspaceController.php
index b4d7677bb..44f1c096d 100644
--- a/lib/Controller/WorkspaceController.php
+++ b/lib/Controller/WorkspaceController.php
@@ -30,6 +30,9 @@
use OCA\Workspace\Exceptions\BadRequestException;
use OCA\Workspace\Exceptions\CreateGroupException;
use OCA\Workspace\Exceptions\CreateWorkspaceException;
+use OCA\Workspace\Exceptions\WorkspaceNameExistException;
+use OCA\Workspace\Folder\RootFolder;
+use OCA\Workspace\Helper\GroupfolderHelper;
use OCA\Workspace\Service\Group\GroupFormatter;
use OCA\Workspace\Service\Group\ManagersWorkspace;
use OCA\Workspace\Service\Group\UserGroup;
@@ -49,7 +52,9 @@
class WorkspaceController extends Controller {
public function __construct(
IRequest $request,
+ private GroupfolderHelper $folderHelper,
private IGroupManager $groupManager,
+ private RootFolder $rootFolder,
private IUserManager $userManager,
private LoggerInterface $logger,
private SpaceMapper $spaceMapper,
@@ -91,8 +96,13 @@ public function createWorkspace(string $spaceName,
throw new BadRequestException('spaceName must be provided');
}
- $this->workspaceCheck->containSpecialChar($spaceName);
- $this->workspaceCheck->isExist($spaceName);
+ if($this->workspaceCheck->containSpecialChar($spaceName)) {
+ throw new BadRequestException('Your Workspace name must not contain the following characters: ' . implode(" ", str_split(WorkspaceCheckService::CHARACTERS_SPECIAL)));
+ }
+
+ if ($this->workspaceCheck->isExist($spaceName)) {
+ throw new WorkspaceNameExistException("The $spaceName space name already exist", Http::STATUS_CONFLICT);
+ }
$spaceName = $this->deleteBlankSpaceName($spaceName);
@@ -174,16 +184,34 @@ public function destroy(array $workspace): JSONResponse {
*/
public function findAll(): JSONResponse {
$workspaces = $this->workspaceService->getAll();
+ $spaces = [];
+ foreach ($workspaces as $workspace) {
+ $space = array_merge(
+ $this->folderHelper->getFolder(
+ $workspace['groupfolder_id'],
+ $this->rootFolder->getRootFolderStorageId()
+ ),
+ $workspace
+ );
+
+ $gids = array_keys($space['groups']);
+ $groups = array_map(fn ($gid) => $this->groupManager->get($gid), $gids);
+
+ $space['groups'] = GroupFormatter::formatGroups($groups);
+ $space['users'] = $this->workspaceService->addUsersInfo($space);
+
+ $spaces[] = $space;
+ }
// We only want to return those workspaces for which the connected user is a manager
if (!$this->userService->isUserGeneralAdmin()) {
$this->logger->debug('Filtering workspaces');
- $filteredWorkspaces = array_values(array_filter($workspaces, function ($workspace) {
- return $this->userService->isSpaceManagerOfSpace($workspace);
+ $filteredWorkspaces = array_values(array_filter($spaces, function ($space) {
+ return $this->userService->isSpaceManagerOfSpace($space);
}));
- $workspaces = $filteredWorkspaces;
+ $spaces = $filteredWorkspaces;
}
- return new JSONResponse($workspaces);
+ return new JSONResponse($spaces);
}
/**
@@ -274,7 +302,9 @@ public function renameSpace(array|string $workspace,
$workspace = json_decode($workspace, true);
}
- $this->workspaceCheck->containSpecialChar($newSpaceName);
+ if ($this->workspaceCheck->containSpecialChar($newSpaceName)) {
+ throw new BadRequestException('Your Workspace name must not contain the following characters: ' . implode(" ", str_split(WorkspaceCheckService::CHARACTERS_SPECIAL)));
+ }
if ($newSpaceName === false ||
$newSpaceName === null ||
diff --git a/lib/Exceptions/GroupFolderFunctionException.php b/lib/Exceptions/GroupFolderFunctionException.php
new file mode 100644
index 000000000..90eed8663
--- /dev/null
+++ b/lib/Exceptions/GroupFolderFunctionException.php
@@ -0,0 +1,31 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Exceptions;
+
+class GroupFolderFunctionException extends \Exception {
+ public function __construct(string $message, int $code = 0) {
+ parent::__construct($message, $code);
+ }
+}
diff --git a/lib/Files/Connection/Terminal.php b/lib/Files/Connection/Terminal.php
new file mode 100644
index 000000000..97cdbf470
--- /dev/null
+++ b/lib/Files/Connection/Terminal.php
@@ -0,0 +1,24 @@
+stream = fopen($path, 'r');
+ return $this->stream;
+ }
+
+ public function close(): bool {
+ return fclose($this->stream);
+ }
+}
diff --git a/lib/Files/Csv.php b/lib/Files/Csv.php
index 8dfd7b90f..5b7c8956e 100644
--- a/lib/Files/Csv.php
+++ b/lib/Files/Csv.php
@@ -67,14 +67,10 @@ public function parser(ManagerConnectionFileInterface $file) {
}
public function hasProperHeader(ManagerConnectionFileInterface $file): bool {
- // var_dump($path);
- // die();
$res = false;
if (($handle = $file->open()) !== false) {
$tableHeader = fgetcsv($handle, 1000, ",");
$tableHeader = array_map('strtolower', $tableHeader);
- // var_dump($tableHeader);
- // die();
$nameIndex = $this->getIndex(self::DISPLAY_NAME, $tableHeader);
$roleIndex = $this->getIndex(self::ROLE, $tableHeader);
diff --git a/lib/Files/CsvAbstract.php b/lib/Files/CsvAbstract.php
new file mode 100644
index 000000000..78ea3b0f9
--- /dev/null
+++ b/lib/Files/CsvAbstract.php
@@ -0,0 +1,65 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Files;
+
+abstract class CsvAbstract {
+
+ private const MIME_CSV_TYPES = [ 'text/csv', 'application/csv' ];
+
+ public function __construct() {
+ }
+
+ public function isCsvFile(string $path): bool {
+ $mimetype = $this->getMimeType($path);
+
+ if (in_array($mimetype, self::MIME_CSV_TYPES)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public function getMimeType(string $path): string|false {
+ return mime_content_type($path);
+ }
+
+ public function getIndex(array $haystack, array $needles): int|bool {
+ $index = null;
+ foreach($haystack as $key => $value) {
+ $index = array_search($value, $needles);
+ if ($index !== false) {
+ return $index;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param resource $stream
+ */
+ protected function next($stream): array|false {
+ return fgetcsv($stream, 1000, ',');
+ }
+}
diff --git a/lib/Files/CsvInterface.php b/lib/Files/CsvInterface.php
new file mode 100644
index 000000000..5e1c7e5b3
--- /dev/null
+++ b/lib/Files/CsvInterface.php
@@ -0,0 +1,30 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Files;
+
+interface CsvInterface {
+ public function parser(string $path): array;
+ public function hasProperHeader(string $path): bool;
+}
diff --git a/lib/Files/InternalFile.php b/lib/Files/InternalFile.php
index 13cf5eb40..c96fa0e06 100644
--- a/lib/Files/InternalFile.php
+++ b/lib/Files/InternalFile.php
@@ -13,7 +13,7 @@ public function __construct(private string $path, private IStorage $store) {
/**
* @return resource|false
*/
- public function open() {
+ public function open(?string $path = null) {
$this->resource = $this->store->fopen($this->path, "r");
return $this->resource;
}
diff --git a/lib/Files/LocalFile.php b/lib/Files/LocalFile.php
index 0f9d4f42f..bd9ce08af 100644
--- a/lib/Files/LocalFile.php
+++ b/lib/Files/LocalFile.php
@@ -11,7 +11,7 @@ public function __construct(private string $path) {
/**
* @return resource|false
*/
- public function open() {
+ public function open(?string $path = null) {
$this->resource = fopen($this->path, "r");
return $this->resource;
}
diff --git a/lib/Files/ManagerConnectionFileInterface.php b/lib/Files/ManagerConnectionFileInterface.php
index c35bbdcc8..99529b76a 100644
--- a/lib/Files/ManagerConnectionFileInterface.php
+++ b/lib/Files/ManagerConnectionFileInterface.php
@@ -3,6 +3,6 @@
namespace OCA\Workspace\Files;
interface ManagerConnectionFileInterface {
- public function open();
+ public function open(?string $path = null);
public function close();
}
diff --git a/lib/Files/MassiveWorkspaceCreation/Csv.php b/lib/Files/MassiveWorkspaceCreation/Csv.php
new file mode 100644
index 000000000..64ab6ec6f
--- /dev/null
+++ b/lib/Files/MassiveWorkspaceCreation/Csv.php
@@ -0,0 +1,105 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Files\MassiveWorkspaceCreation;
+
+use OCA\Workspace\Files\Connection\Terminal;
+use OCA\Workspace\Files\CsvAbstract;
+use OCA\Workspace\Files\CsvInterface;
+
+/**
+ * Allow to parse a csv file to create massive workspaces.
+ */
+class Csv extends CsvAbstract implements CsvInterface {
+
+ public const WORKSPACE_FIELD = ["workspace-name", "spacename"];
+ public const USER_FIELD = ["user", "uid", "WorkspaceManager", "workspace-manager"];
+ public const QUOTA_FIELD = [ 'quota' ];
+
+ public function __construct(private Terminal $managerConnectionFile) {
+ parent::__construct();
+ }
+
+ public function parser(string $path): array {
+ $stream = $this->managerConnectionFile->open($path);
+
+ // ignore the header
+ $tableHeader = $this->next($stream);
+
+ $tableHeader = array_map('strtolower', $tableHeader);
+
+ $workspaceIndex = $this->getIndex($this::WORKSPACE_FIELD, $tableHeader);
+ $userIndex = $this->getIndex($this::USER_FIELD, $tableHeader);
+ $quotaIndex = $this->getIndex($this::QUOTA_FIELD, $tableHeader);
+
+ $data = [];
+
+ while (($dataCsv = $this->next($stream)) !== false) {
+ $userUid = $dataCsv[$userIndex];
+
+ if (empty($dataCsv[$userIndex])) {
+ $userUid = null;
+ }
+
+ $quota = $dataCsv[$quotaIndex];
+ if (empty($dataCsv[$quotaIndex])) {
+ $quota = '-3';
+ }
+
+ $data[] = [
+ 'workspace_name' => $dataCsv[$workspaceIndex],
+ 'user_uid' => $userUid,
+ 'quota' => $quota
+ ];
+ }
+
+ $this->managerConnectionFile->close();
+
+ return $data;
+ }
+
+ public function hasProperHeader(string $path): bool {
+
+ $res = true;
+
+ $stream = $this->managerConnectionFile->open($path);
+
+ // ignore the header
+ $tableHeader = $this->next($stream);
+
+ $tableHeader = array_map('strtolower', $tableHeader);
+
+ $workspaceField = $this->getIndex(self::WORKSPACE_FIELD, $tableHeader);
+ $uidField = $this->getIndex(self::USER_FIELD, $tableHeader);
+ $quotaField = $this->getIndex(self::QUOTA_FIELD, $tableHeader);
+
+ $res = ($workspaceField !== false)
+ && ($uidField !== false)
+ && ($quotaField !== false);
+
+ $this->managerConnectionFile->close();
+
+ return $res;
+ }
+}
diff --git a/lib/Folder/RootFolder.php b/lib/Folder/RootFolder.php
new file mode 100644
index 000000000..5f19aec69
--- /dev/null
+++ b/lib/Folder/RootFolder.php
@@ -0,0 +1,14 @@
+rootFolder->getMountPoint()->getNumericStorageId();
+ }
+}
diff --git a/lib/Group/Admin/AdminGroup.php b/lib/Group/Admin/AdminGroup.php
new file mode 100644
index 000000000..d1a2e6cfd
--- /dev/null
+++ b/lib/Group/Admin/AdminGroup.php
@@ -0,0 +1,46 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Group\Admin;
+
+use OCP\IUser;
+
+/**
+ * This class represents a Workspace Manager (GE-) group.
+ */
+class AdminGroup {
+ public const GID_PREFIX = 'SPACE-GE-';
+
+ public function __construct(private AdminUserGroup $adminUserGroup,
+ private AdminGroupManager $adminGroupManager) {
+ }
+
+ public function addUser(IUser $user, string $gid): bool {
+ $group = $this->adminGroupManager->get($gid);
+ $group->addUser($user);
+ $this->adminUserGroup->addUser($user);
+
+ return true;
+ }
+}
diff --git a/lib/Group/Admin/AdminGroupManager.php b/lib/Group/Admin/AdminGroupManager.php
new file mode 100644
index 000000000..cd41c9b7b
--- /dev/null
+++ b/lib/Group/Admin/AdminGroupManager.php
@@ -0,0 +1,64 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Group\Admin;
+
+use OCP\IGroup;
+use OCP\IGroupManager;
+
+/**
+ * This class represents the manager of the
+ * OCA\Workspace\Group\Admin\AdminGroup.
+ */
+class AdminGroupManager {
+ public function __construct(public IGroupManager $groupManager) {
+ }
+
+ public function get(string $gid): IGroup {
+ $group = $this->groupManager->get($gid);
+
+ if (is_null($group)) {
+ throw new \Exception("The $gid group is not exist.");
+ }
+
+ return $group;
+ }
+
+ public static function findWorkspaceManager(array $workspace): string {
+ if (!array_key_exists('groups', $workspace)) {
+ throw new \Exception('The "groups" key is not present in the $workspace variable.');
+ }
+
+ $gids = array_keys($workspace['groups']);
+
+ $groupname = array_values(
+ array_filter(
+ $gids,
+ fn ($gid) => str_starts_with($gid, AdminGroup::GID_PREFIX)
+ )
+ )[0];
+
+ return $groupname;
+ }
+}
diff --git a/lib/Group/Admin/AdminUserGroup.php b/lib/Group/Admin/AdminUserGroup.php
new file mode 100644
index 000000000..a936cac92
--- /dev/null
+++ b/lib/Group/Admin/AdminUserGroup.php
@@ -0,0 +1,52 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Group\Admin;
+
+use OCP\IGroupManager;
+use OCP\IUser;
+
+/**
+ * This class gathers all users from the
+ * OCA\Workspace\Group\Admin\AdminGroup class
+ * in the "WorkspacesManagers" group.
+ */
+class AdminUserGroup {
+ public const GID = 'WorkspacesManagers';
+
+ public function __construct(private IGroupManager $groupManager) {
+ }
+
+ public function addUser(IUser $user): bool {
+ $group = $this->groupManager->get(self::GID);
+
+ if (is_null($group)) {
+ throw new \Exception(sprintf("Impossible to to find the %s group.", self::GID));
+ }
+
+ $group->addUser($user);
+
+ return true;
+ }
+}
diff --git a/lib/Group/User/UserGroup.php b/lib/Group/User/UserGroup.php
new file mode 100644
index 000000000..8e4f90b02
--- /dev/null
+++ b/lib/Group/User/UserGroup.php
@@ -0,0 +1,44 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Group\User;
+
+use OCP\IUser;
+
+/**
+ * This class represents a Workspace Manager (GE-) group.
+ */
+class UserGroup {
+ public const GID_PREFIX = 'SPACE-U-';
+
+ public function __construct(private UserGroupManager $userGroupManager) {
+ }
+
+ public function addUser(IUser $user, string $gid): bool {
+ $group = $this->userGroupManager->get($gid);
+ $group->addUser($user);
+
+ return true;
+ }
+}
diff --git a/lib/Group/User/UserGroupManager.php b/lib/Group/User/UserGroupManager.php
new file mode 100644
index 000000000..c4f9e0118
--- /dev/null
+++ b/lib/Group/User/UserGroupManager.php
@@ -0,0 +1,64 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Group\User;
+
+use OCP\IGroup;
+use OCP\IGroupManager;
+
+/**
+ * This class represents the manager of the
+ * OCA\Workspace\Group\User\UserGroup.
+ */
+class UserGroupManager {
+ public function __construct(public IGroupManager $groupManager) {
+ }
+
+ public function get(string $gid): IGroup {
+ $group = $this->groupManager->get($gid);
+
+ if (is_null($group)) {
+ throw new \Exception("The $gid group is not exist.");
+ }
+
+ return $group;
+ }
+
+ public static function findWorkspaceManager(array $workspace): string {
+ if (!array_key_exists('groups', $workspace)) {
+ throw new \Exception('The "groups" key is not present in the $workspace variable.');
+ }
+
+ $gids = array_keys($workspace['groups']);
+
+ $groupname = array_values(
+ array_filter(
+ $gids,
+ fn ($gid) => str_starts_with($gid, UserGroup::GID_PREFIX)
+ )
+ )[0];
+
+ return $groupname;
+ }
+}
diff --git a/lib/Helper/GroupfolderHelper.php b/lib/Helper/GroupfolderHelper.php
new file mode 100644
index 000000000..d27b625e2
--- /dev/null
+++ b/lib/Helper/GroupfolderHelper.php
@@ -0,0 +1,99 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Helper;
+
+use OCA\GroupFolders\Folder\FolderManager;
+use OCA\Workspace\Exceptions\GroupFolderFunctionException;
+use OCP\AutoloadNotAllowedException;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\ContainerInterface;
+
+class GroupfolderHelper {
+ private ?FolderManager $folderManager = null;
+ private string $dependencyInjectionError = '';
+
+ public function __construct(ContainerInterface $appContainer) {
+ try {
+ $this->folderManager = $appContainer->get(FolderManager::class);
+ } catch (ContainerExceptionInterface|AutoloadNotAllowedException $e) {
+ // Could not instantiate - probably groupfolders is disabled.
+ $this->dependencyInjectionError = $e->getMessage();
+ }
+ }
+
+ /**
+ * Create a groupfolder.
+ *
+ * @param string $mountpoint
+ * @return integer the folder id of the groupfolder created
+ */
+ public function createFolder(string $mountpoint): int {
+ try {
+ return $this->folderManager->createFolder($mountpoint);
+ } catch (\Exception $e) {
+ throw new GroupFolderFunctionException($e->getMessage() . 'Impossible to use the createFolder function from FolderManager.');
+ }
+ }
+
+ public function getFolder(int $folderId, int $rootStorageId) {
+ try {
+ return $this->folderManager->getFolder($folderId, $rootStorageId);
+ } catch(\Exception $e) {
+ throw new GroupFolderFunctionException($e->getMessage() . 'Impossible to use the getFolder function from FolderManager.');
+ }
+ }
+
+ public function setFolderAcl(int $folderId, bool $acl): void {
+ try {
+ $this->folderManager->setFolderAcl($folderId, $acl);
+ } catch(\Exception $e) {
+ throw new GroupFolderFunctionException($e->getMessage() . 'Impossible to use the setFolderAcl from FolderManager.');
+ }
+ }
+
+ public function addApplicableGroup(int $id, string $group): void {
+ try {
+ $this->folderManager->addApplicableGroup($id, $group);
+ } catch (\Exception $e) {
+ throw new GroupFolderFunctionException($e->getMessage() . 'Impossible to use the addApplicableGroup from FolderManager.');
+ }
+ }
+
+ public function setManageACL(int $folderId, string $type, string $id, bool $manageAcl): void {
+ try {
+ $this->folderManager->setManageACL($folderId, $type, $id, $manageAcl);
+ } catch (\Exception $e) {
+ throw new GroupFolderFunctionException($e->getMessage() . 'Impossible to use the setManageACL from FolderManager.');
+ }
+ }
+
+ public function setFolderQuota(int $folderId, int $quota): void {
+ try {
+ $this->folderManager->setFolderQuota($folderId, $quota);
+ } catch (\Exception $e) {
+ throw new GroupFolderFunctionException($e->getMessage() . 'Impossible to use the setFolderQuota from FolderManager.');
+ }
+ }
+}
diff --git a/lib/Service/Group/GroupsWorkspaceService.php b/lib/Service/Group/GroupsWorkspaceService.php
index 2b01c06bf..19040d8c0 100644
--- a/lib/Service/Group/GroupsWorkspaceService.php
+++ b/lib/Service/Group/GroupsWorkspaceService.php
@@ -24,9 +24,7 @@
namespace OCA\Workspace\Service\Group;
-use OCA\Workspace\GroupException;
-use OCA\Workspace\UserGroup;
-use OCA\Workspace\WorkspaceManagerGroup;
+use OCA\Workspace\Exceptions\GroupException;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IUser;
diff --git a/lib/Service/Group/WorkspaceManagerGroup.php b/lib/Service/Group/WorkspaceManagerGroup.php
index 5fd6db3d3..7253153ba 100644
--- a/lib/Service/Group/WorkspaceManagerGroup.php
+++ b/lib/Service/Group/WorkspaceManagerGroup.php
@@ -23,8 +23,8 @@
namespace OCA\Workspace\Service\Group;
-use OCA\Workspace\CreateGroupException;
use OCA\Workspace\Db\Space;
+use OCA\Workspace\Exceptions\CreateGroupException;
use OCP\AppFramework\Http;
use OCP\AppFramework\Services\IAppConfig;
use OCP\IGroup;
diff --git a/lib/Service/SpaceService.php b/lib/Service/SpaceService.php
index cde097227..fc89cd566 100644
--- a/lib/Service/SpaceService.php
+++ b/lib/Service/SpaceService.php
@@ -26,8 +26,8 @@
namespace OCA\Workspace\Service;
use OCA\Workspace\BadRequestException;
-use OCA\Workspace\DB\Space;
-use OCA\Workspace\DB\SpaceMapper;
+use OCA\Workspace\Db\Space;
+use OCA\Workspace\Db\SpaceMapper;
use OCP\IGroupManager;
class SpaceService {
@@ -83,7 +83,7 @@ public function checkSpaceNameExist(string $spacename): bool {
$checkSpacename = $this->spaceMapper->checkSpaceNameExist($spacename);
if (!is_bool($checkSpacename)) {
- if (array_key_exists('name', $checkSpacename)) {
+ if (array_key_exists('space_name', $checkSpacename)) {
return true;
}
}
diff --git a/lib/Service/Workspace/WorkspaceCheckService.php b/lib/Service/Workspace/WorkspaceCheckService.php
index b570010ee..f8afe7cad 100644
--- a/lib/Service/Workspace/WorkspaceCheckService.php
+++ b/lib/Service/Workspace/WorkspaceCheckService.php
@@ -25,11 +25,12 @@
namespace OCA\Workspace\Service\Workspace;
use OCA\Workspace\Exceptions\BadRequestException;
-use OCA\Workspace\Exceptions\WorkspaceNameExistException;
use OCA\Workspace\Service\SpaceService;
-use OCP\AppFramework\Http;
class WorkspaceCheckService {
+
+ public const CHARACTERS_SPECIAL = "[~<>{}|;.:,!?\'@#$+()%\\\^=\/&*\[\]]";
+
public function __construct(private SpaceService $spaceService) {
}
@@ -39,24 +40,37 @@ public function __construct(private SpaceService $spaceService) {
* @param string $spacename
* @throws BadRequestException
*/
- public function containSpecialChar(string $spacename): void {
- if (preg_match('/[~<>{}|;.:,!?\'@#$+()%\\\^=\/&*\[\]]/', $spacename)) {
- throw new BadRequestException('Your Workspace name must not contain the following characters: [ ~ < > { } | ; . : , ! ? \' @ # $ + ( ) - % \ ^ = / & * ]');
+ public function containSpecialChar(string $spacename): bool {
+ if (preg_match(sprintf("/%s/", self::CHARACTERS_SPECIAL), $spacename)) {
+ return true;
}
- return;
+ return false;
}
/**
* Check if the space name exist in groupfolders or workspace
- * @throws WorkspaceNameExistException
*/
- public function isExist(string $spacename): void {
+ public function isExist(string $spacename): bool {
if ($this->spaceService->checkSpaceNameExist($spacename)) {
- throw new WorkspaceNameExistException('The ' . $spacename . ' space name already exist', Http::STATUS_CONFLICT);
+ return true;
}
- return;
+ return false;
+ }
+
+ public function spacenamesIsDuplicated(array $spaces): bool {
+ $workspaceNames = [];
+
+ foreach ($spaces as $space) {
+ $workspaceNames[] = $space['workspace_name'];
+ }
+
+ $workspaceNamesDiff = array_values(
+ array_diff_assoc($workspaceNames, array_unique($workspaceNames))
+ );
+
+ return !empty($workspaceNamesDiff);
}
}
diff --git a/lib/Service/WorkspaceService.php b/lib/Service/WorkspaceService.php
index 6a71e0fb0..07aff7377 100644
--- a/lib/Service/WorkspaceService.php
+++ b/lib/Service/WorkspaceService.php
@@ -52,7 +52,9 @@ public function __construct(
/**
* @param string $term
- * @return OCP\IUser[]
+ * @return IUser[]
+ * @deprecated since 3.0.1
+ * @uses OCA\Workspace\User\UserSearcher
*/
private function searchUsersByMailing(string $term): array {
return $this->userManager->getByEmail($term);
@@ -60,7 +62,9 @@ private function searchUsersByMailing(string $term): array {
/**
* @param string $term
- * @return OCP\IUser[]
+ * @return IUser[]
+ * @deprecated since 3.0.1
+ * @uses OCA\Workspace\User\UserSearcher
*/
private function searchUsersByDisplayName(string $term): array {
$users = [];
@@ -75,9 +79,11 @@ private function searchUsersByDisplayName(string $term): array {
/**
* @param string $term
- * @return OCP\IUser[]
+ * @return IUser[]
+ * @deprecated since 3.0.1
+ * @uses OCA\Workspace\User\UserSearcher
*/
- private function searchUsers(string $term): array {
+ public function searchUsers(string $term): array {
$users = [];
$REGEX_FULL_MAIL = '/^[a-zA-Z0-9_.+-].+@[a-zA-Z0-9_.+-]/';
@@ -87,6 +93,11 @@ private function searchUsers(string $term): array {
$users = $this->searchUsersByDisplayName($term);
}
+ /**
+ * Change OC\User\LazyUser to OC\User\User.
+ */
+ $users = array_map(fn ($user) => $this->userManager->get($user->getUID()), $users);
+
return $users;
}
@@ -136,9 +147,6 @@ public function autoComplete(string $term, array|string $space): array {
return $data;
}
- /**
- * @return Space[] - all spaces
- */
public function getAll(): array {
// Gets all spaces
$spaces = $this->spaceMapper->findAll();
@@ -151,13 +159,9 @@ public function getAll(): array {
}
/**
- *
* Adds users information to a workspace
- *
- * @param string|array The workspace to which we want to add users info
- *
*/
- public function addUsersInfo(string|array $workspace): array {
+ public function addUsersInfo(string|array $workspace): \stdClass {
// Caution: It is important to add users from the workspace's user group before adding the users
// from the workspace's manager group, as users may be members of both groups
$this->logger->debug('Adding users information to workspace');
@@ -176,9 +180,8 @@ public function addUsersInfo(string|array $workspace): array {
$users[$user->getUID()] = $this->userService->formatUser($user, $workspace, 'admin');
};
}
- $workspace['users'] = (object) $users;
- return $workspace;
+ return (object) $users;
}
/**
diff --git a/lib/Space/SpaceManager.php b/lib/Space/SpaceManager.php
new file mode 100644
index 000000000..df7a77d96
--- /dev/null
+++ b/lib/Space/SpaceManager.php
@@ -0,0 +1,133 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\Space;
+
+use OCA\Workspace\Db\Space;
+use OCA\Workspace\Db\SpaceMapper;
+use OCA\Workspace\Exceptions\BadRequestException;
+use OCA\Workspace\Exceptions\CreateWorkspaceException;
+use OCA\Workspace\Exceptions\WorkspaceNameExistException;
+use OCA\Workspace\Folder\RootFolder;
+use OCA\Workspace\Helper\GroupfolderHelper;
+use OCA\Workspace\Service\Group\GroupFormatter;
+use OCA\Workspace\Service\Group\UserGroup;
+use OCA\Workspace\Service\Group\WorkspaceManagerGroup;
+use OCA\Workspace\Service\Workspace\WorkspaceCheckService;
+use OCP\AppFramework\Http;
+
+class SpaceManager {
+ public function __construct(
+ private GroupfolderHelper $folderHelper,
+ private RootFolder $rootFolder,
+ private WorkspaceCheckService $workspaceCheck,
+ private UserGroup $userGroup,
+ private SpaceMapper $spaceMapper,
+ private WorkspaceManagerGroup $workspaceManagerGroup,
+ ) {
+ }
+
+ public function create(string $spacename): array {
+ if ($spacename === false ||
+ $spacename === null ||
+ $spacename === ''
+ ) {
+ throw new BadRequestException('spaceName must be provided');
+ }
+
+ if ($this->workspaceCheck->containSpecialChar($spacename)) {
+ throw new BadRequestException('Your Workspace name must not contain the following characters: ' . implode(" ", str_split(WorkspaceCheckService::CHARACTERS_SPECIAL)));
+ }
+
+ if ($this->workspaceCheck->isExist($spacename)) {
+ throw new WorkspaceNameExistException("The $spacename space name already exist", Http::STATUS_CONFLICT);
+ }
+
+ $spacename = $this->deleteBlankSpaceName($spacename);
+
+ $folderId = $this->folderHelper->createFolder($spacename);
+
+ $space = new Space();
+ $space->setSpaceName($spacename);
+ $space->setGroupfolderId($folderId);
+ $space->setColorCode('#' . substr(md5(mt_rand()), 0, 6)); // mt_rand() (MT - Mersenne Twister) is taller efficient than rand() function.
+ $this->spaceMapper->insert($space);
+
+
+ if (is_null($space)) {
+ throw new CreateWorkspaceException('Error to create a space.', Http::STATUS_CONFLICT);
+ }
+
+ $newSpaceManagerGroup = $this->workspaceManagerGroup->create($space);
+ $newSpaceUsersGroup = $this->userGroup->create($space);
+
+ $this->folderHelper->setFolderAcl($folderId, true);
+
+ $this->folderHelper->addApplicableGroup(
+ $folderId,
+ $newSpaceManagerGroup->getGID(),
+ );
+
+ $this->folderHelper->addApplicableGroup(
+ $folderId,
+ $newSpaceUsersGroup->getGID(),
+ );
+
+ $this->folderHelper->setManageACL(
+ $folderId,
+ 'group',
+ $newSpaceManagerGroup->getGID(),
+ true
+ );
+
+ $groupfolder = $this->folderHelper->getFolder(
+ $folderId,
+ $this->rootFolder->getRootFolderStorageId()
+ );
+
+ return [
+ 'name' => $space->getSpaceName(),
+ 'id_space' => $space->getId(),
+ 'folder_id' => $space->getGroupfolderId(),
+ 'color' => $space->getColorCode(),
+ 'groups' => GroupFormatter::formatGroups([
+ $newSpaceManagerGroup,
+ $newSpaceUsersGroup
+ ]),
+ 'quota' => $groupfolder['quota'],
+ 'size' => $groupfolder['size'],
+ 'acl' => $groupfolder['acl'],
+ 'manage' => $groupfolder['manage']
+ ];
+ }
+
+ /**
+ * @param string $spaceName it's the space name
+ * @return string whithout the blank to start and end of the space name
+ * @todo move this method
+ */
+ private function deleteBlankSpaceName(string $spaceName): string {
+ return trim($spaceName);
+ }
+}
diff --git a/lib/User/UserFinder.php b/lib/User/UserFinder.php
new file mode 100644
index 000000000..964d3229a
--- /dev/null
+++ b/lib/User/UserFinder.php
@@ -0,0 +1,64 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\User;
+
+use OCP\IUser;
+use OCP\IUserManager;
+
+class UserFinder {
+ public function __construct(private IUserManager $userManager) {
+ }
+
+ /**
+ * @param string $email
+ */
+ public function findByEmail(string $email): ?IUser {
+ $users = $this->userManager->getByEmail($email);
+ return $users[0];
+ }
+
+ /**
+ * @param string $uid
+ */
+ public function findByUID(string $uid): ?IUser {
+ $user = $this->userManager->get($uid);
+ return $user;
+ }
+
+ /**
+ * @param string $pattern
+ */
+ public function findUser(string $pattern): ?IUser {
+ $REGEX_FULL_MAIL = '/^[a-zA-Z0-9_.+-].+@[a-zA-Z0-9_.+-]/';
+
+ if (preg_match($REGEX_FULL_MAIL, $pattern) === 1) {
+ $user = $this->findByEmail($pattern);
+ } else {
+ $user = $this->findByUID($pattern);
+ }
+
+ return $user;
+ }
+}
diff --git a/lib/User/UserPresenceChecker.php b/lib/User/UserPresenceChecker.php
new file mode 100644
index 000000000..ab2953373
--- /dev/null
+++ b/lib/User/UserPresenceChecker.php
@@ -0,0 +1,41 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\User;
+
+use OCP\IUserManager;
+
+class UserPresenceChecker {
+ public function __construct(private IUserManager $userManager,
+ private UserFinder $userFinder) {
+ }
+
+ public function checkUserExist(string $pattern): bool {
+ $user = $this->userFinder->findUser($pattern);
+ if (is_null($user)) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/lib/User/UserSearcher.php b/lib/User/UserSearcher.php
new file mode 100644
index 000000000..1ffd44bf2
--- /dev/null
+++ b/lib/User/UserSearcher.php
@@ -0,0 +1,78 @@
+
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Workspace\User;
+
+use OCP\IUser;
+use OCP\IUserManager;
+
+class UserSearcher {
+ public function __construct(private IUserManager $userManager) {
+ }
+
+ /**
+ * @param string $email
+ * @return IUser[]
+ */
+ public function searchUsersByMailing(string $email): array {
+ return $this->userManager->getByEmail($email);
+ }
+
+ /**
+ * @param string $displayname
+ * @return IUser[]
+ */
+ public function searchUsersByDisplayName(string $displayname): array {
+ $users = [];
+
+ $displayname = $displayname === '*' ? '' : $displayname;
+ $users = $this->userManager->searchDisplayName($displayname, 50);
+
+ $users = array_unique($users, SORT_REGULAR);
+
+ return $users;
+ }
+
+ /**
+ * @param string $pattern
+ * @return IUser[]
+ */
+ public function searchUsers(string $pattern): array {
+ $users = [];
+ $REGEX_FULL_MAIL = '/^[a-zA-Z0-9_.+-].+@[a-zA-Z0-9_.+-]/';
+
+ if (preg_match($REGEX_FULL_MAIL, $pattern) === 1) {
+ $users = $this->searchUsersByMailing($pattern);
+ } else {
+ $users = $this->searchUsersByDisplayName($pattern);
+ }
+
+ /**
+ * Change OC\User\LazyUser to OC\User\User.
+ */
+ $users = array_map(fn ($user) => $this->userManager->get($user->getUID()), $users);
+
+ return $users;
+ }
+}
diff --git a/src/WorkspaceContent.vue b/src/WorkspaceContent.vue
index 09e0d5ce9..a40b69c78 100644
--- a/src/WorkspaceContent.vue
+++ b/src/WorkspaceContent.vue
@@ -42,7 +42,6 @@
import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'
import showNotificationError from './services/Notifications/NotificationError.js'
-import { get, formatGroups, formatUsers } from './services/groupfoldersService.js'
import NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'
import NcAppContentDetails from '@nextcloud/vue/dist/Components/NcAppContentDetails.js'
import NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'
@@ -65,18 +64,27 @@ export default {
this.$store.state.loading = false
return
}
- this.generateDataCreated(resp.data)
- // resp return [ undefined, undefined, undefined, undefined]
- // it is serious ?
- .then(resp => {
- // Finished loading
- // When all promises is finished
- this.$store.state.loading = false
- })
- .catch(error => {
- console.error('The generateDataCreated method has a problem in promises', error)
- this.$store.state.loading = false
+
+ resp.data.forEach(space => {
+ let quota = this.convertQuotaForFrontend(space.quota)
+ if (quota === 'unlimited') {
+ quota = t('workspace', 'unlimited')
+ }
+
+ this.$store.commit('addSpace', {
+ color: space.color_code,
+ groupfolderId: space.groupfolder_id,
+ groups: space.groups,
+ id: space.id,
+ isOpen: false,
+ name: space.name,
+ quota,
+ users: space.users,
})
+ })
+
+ this.$store.state.loading = false
+
})
.catch((e) => {
console.error('Problem to load spaces only', e)
@@ -87,70 +95,6 @@ export default {
}
},
methods: {
- // Method to generate the data when this component is created.
- // It is necessary to await promises and catch the response to
- // stop the loading.
- // data object/json from space
- generateDataCreated(data) {
- // It possible which the data is not an array but an object.
- // Because, the `/apps/workspace/spaces` route return an object if there is one element.
- if (!Array.isArray(data)) {
- data = [data]
- }
- // loop to build the json final
- const result = Promise.all(data.map(async space => {
- await get(space.groupfolder_id)
- .then((resp) => {
- space.acl = resp.acl
- space.groups = resp.groups
- space.quota = resp.quota
- space.size = resp.size
- return space
- })
- .catch((e) => {
- console.error('Impossible to format the spaces', e)
- })
- const spaceWithUsers = await formatUsers(space)
- .then((resp) => {
- return resp.data
- })
- .catch((error) => {
- console.error('Impossible to generate a space with users format', error)
- })
- const spaceWithUsersAndGroups = await formatGroups(spaceWithUsers)
- .then((resp) => {
- return resp.data
- })
- .catch((error) => {
- console.error('Impossible to generate a space with groups format', error)
- })
- // Initialises the store
- let codeColor = spaceWithUsersAndGroups.color_code
- if (spaceWithUsersAndGroups.color_code === null) {
- codeColor = '#' + (Math.floor(Math.random() * 2 ** 24)).toString(16).padStart(0, 6)
- }
- let quota = this.convertQuotaForFrontend(spaceWithUsersAndGroups.quota)
- if (quota === 'unlimited') {
- quota = t('workspace', 'unlimited')
- }
- // Convert an array empty to object
- if (Array.isArray(spaceWithUsersAndGroups.users)
- && spaceWithUsersAndGroups.users.length === 0) {
- spaceWithUsersAndGroups.users = { }
- }
- this.$store.commit('addSpace', {
- color: codeColor,
- groupfolderId: spaceWithUsersAndGroups.groupfolder_id,
- groups: spaceWithUsersAndGroups.groups,
- id: spaceWithUsersAndGroups.id,
- isOpen: false,
- name: spaceWithUsersAndGroups.name,
- quota,
- users: spaceWithUsersAndGroups.users,
- })
- }))
- return result
- },
// Shows a space quota in a user-friendly way
convertQuotaForFrontend(quota) {
if (quota === -3 || quota === '-3') {