diff --git a/.gitattributes b/.gitattributes
index 615bf05..25b967e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -8,6 +8,5 @@ tmp export-ignore
.gitattributes export-ignore
.gitignore export-ignore
Makefile export-ignore
-phpcs.xml export-ignore
phpstan.neon export-ignore
phpunit.xml export-ignore
diff --git a/.github/renovate.json b/.github/renovate.json
index b775cc1..d3f5961 100644
--- a/.github/renovate.json
+++ b/.github/renovate.json
@@ -10,11 +10,6 @@
"enabled": true,
"groupName": "root-composer"
},
- {
- "matchPaths": ["build-cs/**"],
- "enabled": true,
- "groupName": "build-cs"
- },
{
"matchPaths": [".github/**"],
"enabled": true,
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5023e37..8f0c607 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -25,7 +25,7 @@ jobs:
steps:
- name: "Checkout"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
@@ -46,20 +46,26 @@ jobs:
- name: "Lint"
run: "make lint"
- coding-standards:
+ coding-standard:
name: "Coding Standard"
runs-on: "ubuntu-latest"
steps:
- name: "Checkout"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
+
+ - name: "Checkout build-cs"
+ uses: actions/checkout@v4
+ with:
+ repository: "phpstan/build-cs"
+ path: "build-cs"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
- php-version: "8.0"
+ php-version: "8.2"
- name: "Validate Composer"
run: "composer validate"
@@ -67,6 +73,10 @@ jobs:
- name: "Install dependencies"
run: "composer install --no-interaction --no-progress"
+ - name: "Install build-cs dependencies"
+ working-directory: "build-cs"
+ run: "composer install --no-interaction --no-progress"
+
- name: "Lint"
run: "make lint"
@@ -93,7 +103,7 @@ jobs:
steps:
- name: "Checkout"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
@@ -136,7 +146,7 @@ jobs:
steps:
- name: "Checkout"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
diff --git a/.github/workflows/create-tag.yml b/.github/workflows/create-tag.yml
index 8452d98..a853501 100644
--- a/.github/workflows/create-tag.yml
+++ b/.github/workflows/create-tag.yml
@@ -21,7 +21,7 @@ jobs:
runs-on: "ubuntu-latest"
steps:
- name: "Checkout"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
diff --git a/.github/workflows/lock-closed-issues.yml b/.github/workflows/lock-closed-issues.yml
index a05d417..c2b017b 100644
--- a/.github/workflows/lock-closed-issues.yml
+++ b/.github/workflows/lock-closed-issues.yml
@@ -8,7 +8,7 @@ jobs:
lock:
runs-on: ubuntu-latest
steps:
- - uses: dessant/lock-threads@v3
+ - uses: dessant/lock-threads@v5
with:
github-token: ${{ github.token }}
issue-inactive-days: '31'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 5fed045..2fb750a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -14,11 +14,11 @@ jobs:
steps:
- name: "Checkout"
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Generate changelog
id: changelog
- uses: metcalfc/changelog-generator@v3.0.0
+ uses: metcalfc/changelog-generator@v4.2.0
with:
myToken: ${{ secrets.PHPSTAN_BOT_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 2db2131..7de9f3c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
/tests/tmp
+/build-cs
/vendor
/composer.lock
.phpunit.result.cache
diff --git a/Makefile b/Makefile
index 93110c9..62d3ee4 100644
--- a/Makefile
+++ b/Makefile
@@ -10,13 +10,19 @@ lint:
php vendor/bin/parallel-lint --colors \
src tests
+.PHONY: cs-install
+cs-install:
+ git clone https://github.com/phpstan/build-cs.git || true
+ git -C build-cs fetch origin && git -C build-cs reset --hard origin/main
+ composer install --working-dir build-cs
+
.PHONY: cs
cs:
- composer install --working-dir build-cs && php build-cs/vendor/bin/phpcs
+ php build-cs/vendor/bin/phpcs --standard=build-cs/phpcs.xml src tests
.PHONY: cs-fix
cs-fix:
- php build-cs/vendor/bin/phpcbf
+ php build-cs/vendor/bin/phpcbf --standard=build-cs/phpcs.xml src tests
.PHONY: phpstan
phpstan:
diff --git a/build-cs/.gitignore b/build-cs/.gitignore
deleted file mode 100644
index 61ead86..0000000
--- a/build-cs/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/vendor
diff --git a/build-cs/composer.json b/build-cs/composer.json
deleted file mode 100644
index e307971..0000000
--- a/build-cs/composer.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "require-dev": {
- "consistence-community/coding-standard": "^3.10",
- "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
- "slevomat/coding-standard": "^7.0"
- },
- "config": {
- "allow-plugins": {
- "dealerdirect/phpcodesniffer-composer-installer": true
- }
- }
-}
diff --git a/build-cs/composer.lock b/build-cs/composer.lock
deleted file mode 100644
index 4bcc8de..0000000
--- a/build-cs/composer.lock
+++ /dev/null
@@ -1,322 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
- "This file is @generated automatically"
- ],
- "content-hash": "4485bbedba7bcc71ace5f69dbb9b6c47",
- "packages": [],
- "packages-dev": [
- {
- "name": "consistence-community/coding-standard",
- "version": "3.11.1",
- "source": {
- "type": "git",
- "url": "https://github.com/consistence-community/coding-standard.git",
- "reference": "4632fead8c9ee8f50044fcbce9f66c797b34c0df"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/consistence-community/coding-standard/zipball/4632fead8c9ee8f50044fcbce9f66c797b34c0df",
- "reference": "4632fead8c9ee8f50044fcbce9f66c797b34c0df",
- "shasum": ""
- },
- "require": {
- "php": ">=7.4",
- "slevomat/coding-standard": "~7.0",
- "squizlabs/php_codesniffer": "~3.6.0"
- },
- "replace": {
- "consistence/coding-standard": "3.10.*"
- },
- "require-dev": {
- "phing/phing": "2.16.4",
- "php-parallel-lint/php-parallel-lint": "1.3.0",
- "phpunit/phpunit": "9.5.4"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Consistence\\": [
- "Consistence"
- ]
- },
- "classmap": [
- "Consistence"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "VaĊĦek Purchart",
- "email": "me@vasekpurchart.cz",
- "homepage": "http://vasekpurchart.cz"
- }
- ],
- "description": "Consistence - Coding Standard - PHP Code Sniffer rules",
- "keywords": [
- "Coding Standard",
- "PHPCodeSniffer",
- "codesniffer",
- "coding",
- "cs",
- "phpcs",
- "ruleset",
- "sniffer",
- "standard"
- ],
- "support": {
- "issues": "https://github.com/consistence-community/coding-standard/issues",
- "source": "https://github.com/consistence-community/coding-standard/tree/3.11.1"
- },
- "time": "2021-05-03T18:13:22+00:00"
- },
- {
- "name": "dealerdirect/phpcodesniffer-composer-installer",
- "version": "v0.7.2",
- "source": {
- "type": "git",
- "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
- "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db",
- "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db",
- "shasum": ""
- },
- "require": {
- "composer-plugin-api": "^1.0 || ^2.0",
- "php": ">=5.3",
- "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
- },
- "require-dev": {
- "composer/composer": "*",
- "php-parallel-lint/php-parallel-lint": "^1.3.1",
- "phpcompatibility/php-compatibility": "^9.0"
- },
- "type": "composer-plugin",
- "extra": {
- "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
- },
- "autoload": {
- "psr-4": {
- "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Franck Nijhof",
- "email": "franck.nijhof@dealerdirect.com",
- "homepage": "http://www.frenck.nl",
- "role": "Developer / IT Manager"
- },
- {
- "name": "Contributors",
- "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors"
- }
- ],
- "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
- "homepage": "http://www.dealerdirect.com",
- "keywords": [
- "PHPCodeSniffer",
- "PHP_CodeSniffer",
- "code quality",
- "codesniffer",
- "composer",
- "installer",
- "phpcbf",
- "phpcs",
- "plugin",
- "qa",
- "quality",
- "standard",
- "standards",
- "style guide",
- "stylecheck",
- "tests"
- ],
- "support": {
- "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues",
- "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer"
- },
- "time": "2022-02-04T12:51:07+00:00"
- },
- {
- "name": "phpstan/phpdoc-parser",
- "version": "1.5.1",
- "source": {
- "type": "git",
- "url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "981cc368a216c988e862a75e526b6076987d1b50"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/981cc368a216c988e862a75e526b6076987d1b50",
- "reference": "981cc368a216c988e862a75e526b6076987d1b50",
- "shasum": ""
- },
- "require": {
- "php": "^7.2 || ^8.0"
- },
- "require-dev": {
- "php-parallel-lint/php-parallel-lint": "^1.2",
- "phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^1.5",
- "phpstan/phpstan-strict-rules": "^1.0",
- "phpunit/phpunit": "^9.5",
- "symfony/process": "^5.2"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "PHPStan\\PhpDocParser\\": [
- "src/"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "PHPDoc parser with support for nullable, intersection and generic types",
- "support": {
- "issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/1.5.1"
- },
- "time": "2022-05-05T11:32:40+00:00"
- },
- {
- "name": "slevomat/coding-standard",
- "version": "7.2.1",
- "source": {
- "type": "git",
- "url": "https://github.com/slevomat/coding-standard.git",
- "reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/aff06ae7a84e4534bf6f821dc982a93a5d477c90",
- "reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90",
- "shasum": ""
- },
- "require": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7",
- "php": "^7.2 || ^8.0",
- "phpstan/phpdoc-parser": "^1.5.1",
- "squizlabs/php_codesniffer": "^3.6.2"
- },
- "require-dev": {
- "phing/phing": "2.17.3",
- "php-parallel-lint/php-parallel-lint": "1.3.2",
- "phpstan/phpstan": "1.4.10|1.7.1",
- "phpstan/phpstan-deprecation-rules": "1.0.0",
- "phpstan/phpstan-phpunit": "1.0.0|1.1.1",
- "phpstan/phpstan-strict-rules": "1.2.3",
- "phpunit/phpunit": "7.5.20|8.5.21|9.5.20"
- },
- "type": "phpcodesniffer-standard",
- "extra": {
- "branch-alias": {
- "dev-master": "7.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "SlevomatCodingStandard\\": "SlevomatCodingStandard"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
- "support": {
- "issues": "https://github.com/slevomat/coding-standard/issues",
- "source": "https://github.com/slevomat/coding-standard/tree/7.2.1"
- },
- "funding": [
- {
- "url": "https://github.com/kukulich",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
- "type": "tidelift"
- }
- ],
- "time": "2022-05-25T10:58:12+00:00"
- },
- {
- "name": "squizlabs/php_codesniffer",
- "version": "3.6.2",
- "source": {
- "type": "git",
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a",
- "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a",
- "shasum": ""
- },
- "require": {
- "ext-simplexml": "*",
- "ext-tokenizer": "*",
- "ext-xmlwriter": "*",
- "php": ">=5.4.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
- },
- "bin": [
- "bin/phpcs",
- "bin/phpcbf"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.x-dev"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Greg Sherwood",
- "role": "lead"
- }
- ],
- "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
- "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
- "keywords": [
- "phpcs",
- "standards"
- ],
- "support": {
- "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
- "source": "https://github.com/squizlabs/PHP_CodeSniffer",
- "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
- },
- "time": "2021-12-12T21:44:58+00:00"
- }
- ],
- "aliases": [],
- "minimum-stability": "stable",
- "stability-flags": [],
- "prefer-stable": false,
- "prefer-lowest": false,
- "platform": [],
- "platform-dev": [],
- "plugin-api-version": "2.3.0"
-}
diff --git a/phpcs.xml b/phpcs.xml
deleted file mode 100644
index 95032a6..0000000
--- a/phpcs.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
-
-
-
-
-
-
-
- src
- tests
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 10
-
-
-
-
-
- 10
-
-
-
-
-
-
-
- 10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- tests/*/data
-
diff --git a/stubs/MockInterface.stub b/stubs/MockInterface.stub
index d7f107a..7fcff49 100644
--- a/stubs/MockInterface.stub
+++ b/stubs/MockInterface.stub
@@ -41,14 +41,14 @@ interface LegacyMockInterface
/**
* @param null|string $method
- * @param null|array $args
+ * @param null|array|\Closure $args
* @return Expectation
*/
public function shouldHaveReceived($method, $args = null);
/**
* @param null|string $method
- * @param null|array $args
+ * @param null|array|\Closure $args
* @return Expectation
*/
public function shouldNotHaveReceived($method, $args = null);
diff --git a/tests/Mockery/MockeryBarTest.php b/tests/Mockery/MockeryBarTest.php
index 0c0ad15..91dd584 100644
--- a/tests/Mockery/MockeryBarTest.php
+++ b/tests/Mockery/MockeryBarTest.php
@@ -9,14 +9,18 @@
class MockeryBarTest extends MockeryTestCase
{
- /** @var MockInterface|Foo */
+ /** @var MockInterface&Foo */
private $fooMock;
+ /** @var MockInterface&Foo */
+ private $fooSpy;
+
protected function setUp(): void
{
parent::setUp();
$this->fooMock = Mockery::mock(Foo::class);
+ $this->fooSpy = Mockery::spy(Foo::class);
}
public function testFooIsCalled(): void
@@ -53,14 +57,24 @@ public function testShouldReceive(): void
public function testShouldNotHaveReceived(): void
{
- $this->fooMock->shouldNotHaveReceived(null)->withArgs(['bar']);
+ $this->fooSpy->shouldNotHaveReceived(null)->withArgs(['bar']);
+ $this->fooSpy->doBar('ccc');
+ $this->fooSpy->shouldNotHaveReceived('doBar', ['ddd']);
+ $this->fooSpy->shouldNotHaveReceived('doBar', static function (string $arg): bool {
+ return $arg !== 'ccc';
+ });
}
public function testShouldHaveReceived(): void
{
- $this->fooMock->allows('doFoo')->andReturn('bar');
- self::assertSame('bar', $this->fooMock->doFoo());
- $this->fooMock->shouldHaveReceived('doFoo')->once();
+ $this->fooSpy->allows('doFoo')->andReturn('bar');
+ self::assertSame('bar', $this->fooSpy->doFoo());
+ $this->fooSpy->shouldHaveReceived('doFoo')->once();
+ $this->fooSpy->doBar('ccc');
+ $this->fooSpy->shouldHaveReceived('doBar', ['ccc']);
+ $this->fooSpy->shouldHaveReceived('doBar', static function (string $arg): bool {
+ return $arg === 'ccc';
+ });
}
}
diff --git a/tests/Mockery/data/Foo.php b/tests/Mockery/data/Foo.php
index fe5aa74..5b36ea2 100644
--- a/tests/Mockery/data/Foo.php
+++ b/tests/Mockery/data/Foo.php
@@ -22,4 +22,7 @@ public function doFoo(): ?string
return 'foo';
}
+ public function doBar(string $arg): void
+ {
+ }
}