Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/data_request.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Schwan <carl@carlschwan.eu>2022-04-14 15:40:21 +0300
committerGitHub <noreply@github.com>2022-04-14 15:40:21 +0300
commitb5a4dcfe4ee8a31d4ed8dedb2a4a0bfd1c2f1d92 (patch)
tree90d2c9f82b8028c262bcf1dcaf87b002646f8364
parent0ec4f8a55666978b50ccaa6adf8e2655821df908 (diff)
parent850b0a963415cc1f123205b60176da25f694a5d4 (diff)
Merge pull request #68 from nextcloud/cleanup/psalm-php-74
Add psalm and cleanup for php 7.4
-rw-r--r--.github/workflows/static-analysis.yml26
-rw-r--r--composer.json13
-rw-r--r--composer.lock786
-rw-r--r--lib/Controller/DataRequestController.php22
-rw-r--r--lib/Exceptions/HintedRuntime.php8
-rw-r--r--lib/Services/Request.php55
-rw-r--r--psalm.xml37
-rw-r--r--tests/psalm-baseline.xml2
-rw-r--r--tests/unit/Services/RequestTest.php17
9 files changed, 851 insertions, 115 deletions
diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml
new file mode 100644
index 0000000..8fa3c9e
--- /dev/null
+++ b/.github/workflows/static-analysis.yml
@@ -0,0 +1,26 @@
+name: Static analysis
+
+on: [pull_request]
+
+jobs:
+ static-psalm-analysis:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ ocp-version: [ 'dev-master' ]
+ name: Nextcloud ${{ matrix.ocp-version }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: Set up php
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 7.4
+ tools: composer:v1
+ coverage: none
+ - name: Install dependencies
+ run: composer i
+ - name: Install dependencies
+ run: composer require --dev christophwurst/nextcloud:${{ matrix.ocp-version }}
+ - name: Run coding standards check
+ run: composer run psalm
diff --git a/composer.json b/composer.json
index 9fabd99..83c347d 100644
--- a/composer.json
+++ b/composer.json
@@ -1,5 +1,6 @@
{
"name": "nextcloud/data_request",
+ "license": "AGPL",
"config": {
"optimize-autoloader": true,
"classmap-authoritative": true,
@@ -8,12 +9,18 @@
}
},
"scripts": {
- "cs:fix": "php-cs-fixer fix",
+ "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './build/*' -print0 | xargs -0 -n1 php -l",
"cs:check": "php-cs-fixer fix --dry-run --diff",
- "lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l"
+ "cs:fix": "php-cs-fixer fix",
+ "psalm": "psalm --threads=1",
+ "psalm:update-baseline": "psalm --threads=1 --update-baseline",
+ "psalm:clear": "psalm --clear-cache && psalm --clear-global-cache",
+ "psalm:fix": "psalm --alter --issues=InvalidReturnType,InvalidNullableReturnType,MissingParamType,InvalidFalsableReturnType"
},
"require-dev": {
+ "phpunit/phpunit": "^9.5",
"nextcloud/coding-standard": "^1.0.0",
- "phpunit/phpunit": "^9.5"
+ "christophwurst/nextcloud": "dev-master",
+ "vimeo/psalm": "^4.22.0"
}
}
diff --git a/composer.lock b/composer.lock
index b80efcb..33463ef 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,35 +4,318 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "4c791b25deffa9fb5d2c1523b62c8312",
+ "content-hash": "e21bafa1e69714f08f4bf77f929ff772",
"packages": [],
"packages-dev": [
{
+ "name": "amphp/amp",
+ "version": "v2.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/amp.git",
+ "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
+ "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1",
+ "ext-json": "*",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^7 | ^8 | ^9",
+ "psalm/phar": "^3.11@dev",
+ "react/promise": "^2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/functions.php",
+ "lib/Internal/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\": "lib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniel Lowrey",
+ "email": "rdlowrey@php.net"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Bob Weinand",
+ "email": "bobwei9@hotmail.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A non-blocking concurrency framework for PHP applications.",
+ "homepage": "https://amphp.org/amp",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "awaitable",
+ "concurrency",
+ "event",
+ "event-loop",
+ "future",
+ "non-blocking",
+ "promise"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/amphp",
+ "issues": "https://github.com/amphp/amp/issues",
+ "source": "https://github.com/amphp/amp/tree/v2.6.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-20T17:52:18+00:00"
+ },
+ {
+ "name": "amphp/byte-stream",
+ "version": "v1.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/byte-stream.git",
+ "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd",
+ "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1.4",
+ "friendsofphp/php-cs-fixer": "^2.3",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^6 || ^7 || ^8",
+ "psalm/phar": "^3.11.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\ByteStream\\": "lib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A stream abstraction to make working with non-blocking I/O simple.",
+ "homepage": "http://amphp.org/byte-stream",
+ "keywords": [
+ "amp",
+ "amphp",
+ "async",
+ "io",
+ "non-blocking",
+ "stream"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/amphp",
+ "issues": "https://github.com/amphp/byte-stream/issues",
+ "source": "https://github.com/amphp/byte-stream/tree/v1.8.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2021-03-30T17:13:30+00:00"
+ },
+ {
+ "name": "christophwurst/nextcloud",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ChristophWurst/nextcloud_composer.git",
+ "reference": "f58e94d611993906f19a651b4629f4e68cc6fcdf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ChristophWurst/nextcloud_composer/zipball/f58e94d611993906f19a651b4629f4e68cc6fcdf",
+ "reference": "f58e94d611993906f19a651b4629f4e68cc6fcdf",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ~8.0 || ~8.1",
+ "psr/container": "^1.0",
+ "psr/event-dispatcher": "^1.0",
+ "psr/log": "^1.1"
+ },
+ "default-branch": true,
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "24.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/ChristophWurst/nextcloud_composer/issues",
+ "source": "https://github.com/ChristophWurst/nextcloud_composer/tree/master"
+ },
+ "time": "2022-04-14T01:57:06+00:00"
+ },
+ {
+ "name": "composer/package-versions-deprecated",
+ "version": "1.11.99.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/package-versions-deprecated.git",
+ "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d",
+ "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.1.0 || ^2.0",
+ "php": "^7 || ^8"
+ },
+ "replace": {
+ "ocramius/package-versions": "1.11.99"
+ },
+ "require-dev": {
+ "composer/composer": "^1.9.3 || ^2.0@dev",
+ "ext-zip": "^1.13",
+ "phpunit/phpunit": "^6.5 || ^7"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PackageVersions\\Installer",
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PackageVersions\\": "src/PackageVersions"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "support": {
+ "issues": "https://github.com/composer/package-versions-deprecated/issues",
+ "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5"
+ },
+ "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-01-17T14:14:24+00:00"
+ },
+ {
"name": "composer/pcre",
- "version": "1.0.1",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
- "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560"
+ "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560",
- "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd",
+ "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd",
"shasum": ""
},
"require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.3",
"phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^4.2 || ^5"
+ "symfony/phpunit-bridge": "^5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.x-dev"
+ "dev-main": "3.x-dev"
}
},
"autoload": {
@@ -60,7 +343,7 @@
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/1.0.1"
+ "source": "https://github.com/composer/pcre/tree/3.0.0"
},
"funding": [
{
@@ -76,7 +359,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-21T20:24:37+00:00"
+ "time": "2022-02-25T20:21:48+00:00"
},
{
"name": "composer/semver",
@@ -161,27 +444,27 @@
},
{
"name": "composer/xdebug-handler",
- "version": "2.0.5",
+ "version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/composer/xdebug-handler.git",
- "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a"
+ "reference": "ced299686f41dce890debac69273b47ffe98a40c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a",
- "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
+ "reference": "ced299686f41dce890debac69273b47ffe98a40c",
"shasum": ""
},
"require": {
- "composer/pcre": "^1",
- "php": "^5.3.2 || ^7.0 || ^8.0",
+ "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": "^4.2 || ^5.0 || ^6.0"
+ "symfony/phpunit-bridge": "^6.0"
},
"type": "library",
"autoload": {
@@ -207,7 +490,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/xdebug-handler/issues",
- "source": "https://github.com/composer/xdebug-handler/tree/2.0.5"
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
},
"funding": [
{
@@ -223,7 +506,44 @@
"type": "tidelift"
}
],
- "time": "2022-02-24T20:20:32+00:00"
+ "time": "2022-02-25T21:32:43+00:00"
+ },
+ {
+ "name": "dnoegel/php-xdg-base-dir",
+ "version": "v0.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "XdgBaseDir\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "implementation of xdg base directory specification for php",
+ "support": {
+ "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues",
+ "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1"
+ },
+ "time": "2019-12-04T15:06:13+00:00"
},
{
"name": "doctrine/annotations",
@@ -444,53 +764,154 @@
"time": "2022-02-28T11:07:21+00:00"
},
{
+ "name": "felixfbecker/advanced-json-rpc",
+ "version": "v3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
+ "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447",
+ "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447",
+ "shasum": ""
+ },
+ "require": {
+ "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
+ "php": "^7.1 || ^8.0",
+ "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "AdvancedJsonRpc\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Felix Becker",
+ "email": "felix.b@outlook.com"
+ }
+ ],
+ "description": "A more advanced JSONRPC implementation",
+ "support": {
+ "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
+ "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1"
+ },
+ "time": "2021-06-11T22:34:44+00:00"
+ },
+ {
+ "name": "felixfbecker/language-server-protocol",
+ "version": "v1.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-language-server-protocol.git",
+ "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842",
+ "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "*",
+ "squizlabs/php_codesniffer": "^3.1",
+ "vimeo/psalm": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "LanguageServerProtocol\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Felix Becker",
+ "email": "felix.b@outlook.com"
+ }
+ ],
+ "description": "PHP classes for the Language Server Protocol",
+ "keywords": [
+ "language",
+ "microsoft",
+ "php",
+ "server"
+ ],
+ "support": {
+ "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues",
+ "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2"
+ },
+ "time": "2022-03-02T22:36:06+00:00"
+ },
+ {
"name": "friendsofphp/php-cs-fixer",
- "version": "v3.4.0",
+ "version": "v3.8.0",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
- "reference": "47177af1cfb9dab5d1cc4daf91b7179c2efe7fad"
+ "reference": "cbad1115aac4b5c3c5540e7210d3c9fba2f81fa3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/47177af1cfb9dab5d1cc4daf91b7179c2efe7fad",
- "reference": "47177af1cfb9dab5d1cc4daf91b7179c2efe7fad",
+ "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/cbad1115aac4b5c3c5540e7210d3c9fba2f81fa3",
+ "reference": "cbad1115aac4b5c3c5540e7210d3c9fba2f81fa3",
"shasum": ""
},
"require": {
"composer/semver": "^3.2",
- "composer/xdebug-handler": "^2.0",
- "doctrine/annotations": "^1.12",
+ "composer/xdebug-handler": "^3.0.3",
+ "doctrine/annotations": "^1.13",
"ext-json": "*",
"ext-tokenizer": "*",
- "php": "^7.2.5 || ^8.0",
+ "php": "^7.4 || ^8.0",
"php-cs-fixer/diff": "^2.0",
- "symfony/console": "^4.4.20 || ^5.1.3 || ^6.0",
- "symfony/event-dispatcher": "^4.4.20 || ^5.0 || ^6.0",
- "symfony/filesystem": "^4.4.20 || ^5.0 || ^6.0",
- "symfony/finder": "^4.4.20 || ^5.0 || ^6.0",
- "symfony/options-resolver": "^4.4.20 || ^5.0 || ^6.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.23",
- "symfony/polyfill-php80": "^1.23",
- "symfony/polyfill-php81": "^1.23",
- "symfony/process": "^4.4.20 || ^5.0 || ^6.0",
- "symfony/stopwatch": "^4.4.20 || ^5.0 || ^6.0"
+ "symfony/polyfill-php80": "^1.25",
+ "symfony/polyfill-php81": "^1.25",
+ "symfony/process": "^5.4 || ^6.0",
+ "symfony/stopwatch": "^5.4 || ^6.0"
},
"require-dev": {
"justinrainbow/json-schema": "^5.2",
"keradus/cli-executor": "^1.5",
- "mikey179/vfsstream": "^1.6.8",
+ "mikey179/vfsstream": "^1.6.10",
"php-coveralls/php-coveralls": "^2.5.2",
"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.15",
- "phpspec/prophecy-phpunit": "^1.1 || ^2.0",
- "phpunit/phpunit": "^8.5.21 || ^9.5",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.5",
"phpunitgoodpractices/polyfill": "^1.5",
"phpunitgoodpractices/traits": "^1.9.1",
- "symfony/phpunit-bridge": "^5.2.4 || ^6.0",
- "symfony/yaml": "^4.4.20 || ^5.0 || ^6.0"
+ "symfony/phpunit-bridge": "^6.0",
+ "symfony/yaml": "^5.4 || ^6.0"
},
"suggest": {
"ext-dom": "For handling output formats in XML",
@@ -522,7 +943,7 @@
"description": "A tool to automatically fix PHP code style",
"support": {
"issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues",
- "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.4.0"
+ "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.8.0"
},
"funding": [
{
@@ -530,7 +951,7 @@
"type": "github"
}
],
- "time": "2021-12-11T16:25:08+00:00"
+ "time": "2022-03-18T17:20:59+00:00"
},
{
"name": "myclabs/deep-copy",
@@ -592,6 +1013,57 @@
"time": "2022-03-03T13:19:32+00:00"
},
{
+ "name": "netresearch/jsonmapper",
+ "version": "v4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cweiske/jsonmapper.git",
+ "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
+ "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0",
+ "squizlabs/php_codesniffer": "~3.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "JsonMapper": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "OSL-3.0"
+ ],
+ "authors": [
+ {
+ "name": "Christian Weiske",
+ "email": "cweiske@cweiske.de",
+ "homepage": "http://github.com/cweiske/jsonmapper/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Map nested JSON structures onto PHP classes",
+ "support": {
+ "email": "cweiske@cweiske.de",
+ "issues": "https://github.com/cweiske/jsonmapper/issues",
+ "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0"
+ },
+ "time": "2020-12-01T19:48:11+00:00"
+ },
+ {
"name": "nextcloud/coding-standard",
"version": "v1.0.0",
"source": {
@@ -689,6 +1161,59 @@
"time": "2021-11-30T19:35:32+00:00"
},
{
+ "name": "openlss/lib-array2xml",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nullivex/lib-array2xml.git",
+ "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
+ "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "LSS": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Bryan Tong",
+ "email": "bryan@nullivex.com",
+ "homepage": "https://www.nullivex.com"
+ },
+ {
+ "name": "Tony Butler",
+ "email": "spudz76@gmail.com",
+ "homepage": "https://www.nullivex.com"
+ }
+ ],
+ "description": "Array2XML conversion library credit to lalit.org",
+ "homepage": "https://www.nullivex.com",
+ "keywords": [
+ "array",
+ "array conversion",
+ "xml",
+ "xml conversion"
+ ],
+ "support": {
+ "issues": "https://github.com/nullivex/lib-array2xml/issues",
+ "source": "https://github.com/nullivex/lib-array2xml/tree/master"
+ },
+ "time": "2019-03-29T20:06:56+00:00"
+ },
+ {
"name": "phar-io/manifest",
"version": "2.0.3",
"source": {
@@ -1550,20 +2075,20 @@
},
{
"name": "psr/container",
- "version": "1.1.1",
+ "version": "1.1.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
- "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
- "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"shasum": ""
},
"require": {
- "php": ">=7.2.0"
+ "php": ">=7.4.0"
},
"type": "library",
"autoload": {
@@ -1592,9 +2117,9 @@
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/1.1.1"
+ "source": "https://github.com/php-fig/container/tree/1.1.2"
},
- "time": "2021-03-05T17:36:06+00:00"
+ "time": "2021-11-05T16:50:12+00:00"
},
{
"name": "psr/event-dispatcher",
@@ -4101,6 +4626,112 @@
"time": "2021-07-28T10:34:58+00:00"
},
{
+ "name": "vimeo/psalm",
+ "version": "4.22.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vimeo/psalm.git",
+ "reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vimeo/psalm/zipball/fc2c6ab4d5fa5d644d8617089f012f3bb84b8703",
+ "reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2.4.2",
+ "amphp/byte-stream": "^1.5",
+ "composer/package-versions-deprecated": "^1.8.0",
+ "composer/semver": "^1.4 || ^2.0 || ^3.0",
+ "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0",
+ "dnoegel/php-xdg-base-dir": "^0.1.1",
+ "ext-ctype": "*",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "felixfbecker/advanced-json-rpc": "^3.0.3",
+ "felixfbecker/language-server-protocol": "^1.5",
+ "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
+ "nikic/php-parser": "^4.13",
+ "openlss/lib-array2xml": "^1.0",
+ "php": "^7.1|^8",
+ "sebastian/diff": "^3.0 || ^4.0",
+ "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0",
+ "webmozart/path-util": "^2.3"
+ },
+ "provide": {
+ "psalm/psalm": "self.version"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.2",
+ "brianium/paratest": "^4.0||^6.0",
+ "ext-curl": "*",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpdocumentor/reflection-docblock": "^5",
+ "phpmyadmin/sql-parser": "5.1.0||dev-master",
+ "phpspec/prophecy": ">=1.9.0",
+ "phpunit/phpunit": "^9.0",
+ "psalm/plugin-phpunit": "^0.16",
+ "slevomat/coding-standard": "^7.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "symfony/process": "^4.3 || ^5.0 || ^6.0",
+ "weirdan/prophecy-shim": "^1.0 || ^2.0"
+ },
+ "suggest": {
+ "ext-curl": "In order to send data to shepherd",
+ "ext-igbinary": "^2.0.5 is required, used to serialize caching data"
+ },
+ "bin": [
+ "psalm",
+ "psalm-language-server",
+ "psalm-plugin",
+ "psalm-refactor",
+ "psalter"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev",
+ "dev-3.x": "3.x-dev",
+ "dev-2.x": "2.x-dev",
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php",
+ "src/spl_object_id.php"
+ ],
+ "psr-4": {
+ "Psalm\\": "src/Psalm/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matthew Brown"
+ }
+ ],
+ "description": "A static analysis tool for finding errors in PHP applications",
+ "keywords": [
+ "code",
+ "inspection",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/vimeo/psalm/issues",
+ "source": "https://github.com/vimeo/psalm/tree/4.22.0"
+ },
+ "time": "2022-02-24T20:34:05+00:00"
+ },
+ {
"name": "webmozart/assert",
"version": "1.10.0",
"source": {
@@ -4157,11 +4788,64 @@
"source": "https://github.com/webmozarts/assert/tree/1.10.0"
},
"time": "2021-03-09T10:59:23+00:00"
+ },
+ {
+ "name": "webmozart/path-util",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/path-util.git",
+ "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+ "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "webmozart/assert": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\PathUtil\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.",
+ "support": {
+ "issues": "https://github.com/webmozart/path-util/issues",
+ "source": "https://github.com/webmozart/path-util/tree/2.3.0"
+ },
+ "abandoned": "symfony/filesystem",
+ "time": "2015-12-17T08:42:14+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {
+ "christophwurst/nextcloud": 20
+ },
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
@@ -4169,5 +4853,5 @@
"platform-overrides": {
"php": "7.4"
},
- "plugin-api-version": "2.3.0"
+ "plugin-api-version": "2.2.0"
}
diff --git a/lib/Controller/DataRequestController.php b/lib/Controller/DataRequestController.php
index 6b86200..be67f70 100644
--- a/lib/Controller/DataRequestController.php
+++ b/lib/Controller/DataRequestController.php
@@ -31,17 +31,15 @@ use OCP\AppFramework\OCSController;
use OCP\IRequest;
class DataRequestController extends OCSController {
-
- /** @var Request */
- private $dataRequest;
+ private Request $dataRequest;
public function __construct(
- $appName,
+ string $appName,
IRequest $request,
Request $dataRequest,
- $corsMethods = 'PUT, POST, GET, DELETE, PATCH',
- $corsAllowedHeaders = 'Authorization, Content-Type, Accept',
- $corsMaxAge = 1728000
+ string $corsMethods = 'PUT, POST, GET, DELETE, PATCH',
+ string $corsAllowedHeaders = 'Authorization, Content-Type, Accept',
+ int $corsMaxAge = 1728000
) {
parent::__construct($appName, $request, $corsMethods, $corsAllowedHeaders, $corsMaxAge);
$this->dataRequest = $dataRequest;
@@ -51,8 +49,8 @@ class DataRequestController extends OCSController {
* @NoAdminRequired
* @PasswordConfirmationRequired
*/
- public function export() {
- return $this->processRequest(function () {
+ public function export(): DataResponse {
+ return $this->processRequest(function (): void {
$this->dataRequest->sendExportRequest();
});
}
@@ -61,13 +59,13 @@ class DataRequestController extends OCSController {
* @NoAdminRequired
* @PasswordConfirmationRequired
*/
- public function deletion() {
- return $this->processRequest(function () {
+ public function deletion(): DataResponse {
+ return $this->processRequest(function (): void {
$this->dataRequest->sendDeleteRequest();
});
}
- protected function processRequest(callable $serviceMethod) {
+ protected function processRequest(callable $serviceMethod): DataResponse {
try {
$serviceMethod();
return new DataResponse();
diff --git a/lib/Exceptions/HintedRuntime.php b/lib/Exceptions/HintedRuntime.php
index 16338ee..bb57671 100644
--- a/lib/Exceptions/HintedRuntime.php
+++ b/lib/Exceptions/HintedRuntime.php
@@ -26,16 +26,14 @@ namespace OCA\DataRequest\Exceptions;
use Throwable;
class HintedRuntime extends \RuntimeException {
+ protected string $hint;
- /** @var string */
- protected $hint;
-
- public function __construct($message = '', $hint = '', $code = 0, Throwable $previous = null) {
+ public function __construct(string $message = '', string $hint = '', int $code = 0, Throwable $previous = null) {
parent::__construct($message, $code, $previous);
$this->hint = $hint;
}
- public function getHint() {
+ public function getHint(): string {
if (empty($this->hint)) {
return $this->message;
}
diff --git a/lib/Services/Request.php b/lib/Services/Request.php
index 7c7156e..fbb7910 100644
--- a/lib/Services/Request.php
+++ b/lib/Services/Request.php
@@ -36,22 +36,14 @@ use OCP\Mail\IMailer;
use OCP\Util;
class Request {
- /** @var string */
- protected $defaultLanguage;
- /** @var IGroupManager */
- private $groupManager;
- /** @var IMailer */
- private $mailer;
- /** @var IFactory */
- private $l10nFactory;
- /** @var IConfig */
- private $config;
- /** @var IUser */
- private $requester;
- /** @var IL10N */
- private $l;
- /** @var Defaults */
- private $defaults;
+ protected ?string $defaultLanguage = null;
+ private IGroupManager $groupManager;
+ private IMailer $mailer;
+ private IFactory $l10nFactory;
+ private IConfig $config;
+ private IUser $requester;
+ private IL10N $l;
+ private Defaults $defaults;
public function __construct(
IGroupManager $groupManager,
@@ -71,19 +63,19 @@ class Request {
$this->defaults = $defaults;
}
- public function sendExportRequest() {
- $this->sendRequest(function (IUser $r) {
+ public function sendExportRequest(): void {
+ $this->sendRequest(function (IUser $r): IEMailTemplate {
return $this->getExportTemplate($r);
});
}
- public function sendDeleteRequest() {
- $this->sendRequest(function (IUser $r) {
+ public function sendDeleteRequest(): void {
+ $this->sendRequest(function (IUser $r): IEMailTemplate {
return $this->getDeletionTemplate($r);
});
}
- protected function sendRequest(callable $templateGenerator) {
+ protected function sendRequest(callable $templateGenerator): void {
$admins = $this->getAdmins();
$oneMailSent = false;
@@ -101,22 +93,25 @@ class Request {
}
}
- protected function getDefaultLang() {
+ protected function getDefaultLang(): string {
if ($this->defaultLanguage === null) {
$this->defaultLanguage = $this->config->getSystemValue('default_language', 'en');
}
return $this->defaultLanguage;
}
- protected function craftEmailTo(IUser $admin, IEMailTemplate $template) {
+ protected function craftEmailTo(IUser $admin, IEMailTemplate $template): bool {
$senderAddress = Util::getDefaultEmailAddress('no-reply');
$senderName = $this->defaults->getName();
+ $adminEmail = $admin->getEMailAddress();
+ if (!$adminEmail) {
+ return false;
+ }
+
$message = $this->mailer->createMessage();
- $message->setTo([$admin->getEMailAddress() => $admin->getDisplayName()]);
- $message->setSubject($template->renderSubject());
- $message->setHtmlBody($template->renderHtml());
- $message->setPlainBody($template->renderText());
+ $message->setTo([$adminEmail => $admin->getDisplayName()]);
+ $message->useTemplate($template);
$message->setFrom([$senderAddress => $senderName]);
try {
@@ -131,7 +126,7 @@ class Request {
return true;
}
- protected function getExportTemplate(IUser $admin) {
+ protected function getExportTemplate(IUser $admin): IEMailTemplate {
$l = $this->l10nFactory->get('data_request', $this->config->getUserValue($admin->getUID(), 'core', 'lang', $this->getDefaultLang()));
$template = $this->mailer->createEMailTemplate('data_request.Export', []);
@@ -146,7 +141,7 @@ class Request {
return $template;
}
- protected function getDeletionTemplate(IUser $admin) {
+ protected function getDeletionTemplate(IUser $admin): IEMailTemplate {
$l = $this->l10nFactory->get('data_request', $this->config->getUserValue($admin->getUID(), 'core', 'lang', $this->getDefaultLang()));
$template = $this->mailer->createEMailTemplate('data_request.Deletion', []);
@@ -161,7 +156,7 @@ class Request {
return $template;
}
- protected function getAdmins() {
+ protected function getAdmins(): array {
$admins = $this->groupManager->get('admin')->searchUsers('');
$admins = array_filter($admins, function (IUser $admin) {
return $admin->getEMailAddress() !== null;
diff --git a/psalm.xml b/psalm.xml
new file mode 100644
index 0000000..8f37a4d
--- /dev/null
+++ b/psalm.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<psalm
+ errorLevel="4"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="https://getpsalm.org/schema/config"
+ xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
+ errorBaseline="tests/psalm-baseline.xml"
+>
+ <projectFiles>
+ <directory name="lib" />
+ <ignoreFiles>
+ <directory name="vendor" />
+ </ignoreFiles>
+ </projectFiles>
+ <extraFiles>
+ <directory name="vendor" />
+ <ignoreFiles>
+ <directory name="vendor/phpunit/php-code-coverage" />
+ </ignoreFiles>
+ </extraFiles>
+ <issueHandlers>
+ <UndefinedClass>
+ <errorLevel type="suppress">
+ <referencedClass name="OC" />
+ <referencedClass name="Doctrine\DBAL\Types\Types" />
+ </errorLevel>
+ </UndefinedClass>
+ <UndefinedDocblockClass>
+ <errorLevel type="suppress">
+ <referencedClass name="Doctrine\DBAL\Schema\Schema" />
+ <referencedClass name="Doctrine\DBAL\Schema\SchemaException" />
+ <referencedClass name="Doctrine\DBAL\Driver\Statement" />
+ <referencedClass name="Doctrine\DBAL\Schema\Table" />
+ </errorLevel>
+ </UndefinedDocblockClass>
+ </issueHandlers>
+</psalm>
diff --git a/tests/psalm-baseline.xml b/tests/psalm-baseline.xml
new file mode 100644
index 0000000..956e90d
--- /dev/null
+++ b/tests/psalm-baseline.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<files psalm-version="4.22.0@fc2c6ab4d5fa5d644d8617089f012f3bb84b8703"/>
diff --git a/tests/unit/Services/RequestTest.php b/tests/unit/Services/RequestTest.php
index 308322e..a5c4ff0 100644
--- a/tests/unit/Services/RequestTest.php
+++ b/tests/unit/Services/RequestTest.php
@@ -48,8 +48,7 @@ class RequestTest extends \Test\TestCase {
protected $session;
/** @var IL10N|PHPUnit_Framework_MockObject_MockObject */
protected $l;
- /** @var Request */
- protected $service;
+ protected Request $service;
/** @var IUser|PHPUnit_Framework_MockObject_MockObject */
protected $user;
/** @var Defaults|PHPUnit_Framework_MockObject_MockObject */
@@ -254,23 +253,13 @@ class RequestTest extends \Test\TestCase {
->willReturn($adminName);
$template = $this->createMock(IEMailTemplate::class);
- $template->expects($this->once())
- ->method('renderSubject');
- $template->expects($this->once())
- ->method('renderHtml');
- $template->expects($this->once())
- ->method('renderText');
-
$message = $this->createMock(\OC\Mail\Message::class);
$message->expects($this->once())
->method('setTo')
->with([$adminMail => $adminName]);
$message->expects($this->once())
- ->method('setSubject');
- $message->expects($this->once())
- ->method('setHtmlBody');
- $message->expects($this->once())
- ->method('setPlainBody');
+ ->method('useTemplate')
+ ->with($template);
$message->expects($this->once())
->method('setFrom');