Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,8 @@
"Rector\\VendorLocker\\": "packages/vendor-locker/src",
"Rector\\Performance\\": "rules/performance/src",
"Rector\\Naming\\": "rules/naming/src",
"Rector\\Order\\": "rules/order/src"
"Rector\\Order\\": "rules/order/src",
"Rector\\MockistaToMockery\\": "rules/mockista-to-mockery/src"
}
},
"autoload-dev": {
Expand Down Expand Up @@ -199,7 +200,8 @@
"Rector\\Utils\\PHPStanStaticTypeMapperChecker\\": "utils/phpstan-static-type-mapper-checker/src",
"Rector\\Performance\\Tests\\": "rules/performance/tests",
"Rector\\Naming\\Tests\\": "rules/naming/tests",
"Rector\\Order\\Tests\\": "rules/order/tests"
"Rector\\Order\\Tests\\": "rules/order/tests",
"Rector\\MockistaToMockery\\Tests\\": "rules/mockista-to-mockery/tests"
},
"classmap": [
"rules/cakephp/tests/Rector/Name/ImplicitShortClassNameUseStatementRector/Source",
Expand Down
3 changes: 3 additions & 0 deletions config/set/framework-migration/mockista-to-mockery.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
services:
Rector\MockistaToMockery\Rector\Class_\MockeryTearDownRector: null
Rector\MockistaToMockery\Rector\ClassMethod\MockistaMockToMockeryMockRector: null
53 changes: 52 additions & 1 deletion docs/rector_rules_overview.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# All 483 Rectors Overview
# All 485 Rectors Overview

- [Projects](#projects)
- [General](#general)
Expand All @@ -22,6 +22,7 @@
- [JMS](#jms) (2)
- [Laravel](#laravel) (6)
- [Legacy](#legacy) (2)
- [MockistaToMockery](#mockistatomockery) (2)
- [MysqlToMysqli](#mysqltomysqli) (4)
- [Naming](#naming) (1)
- [Nette](#nette) (11)
Expand Down Expand Up @@ -4129,6 +4130,56 @@ Change functions to static calls, so composer can autoload them

<br>

## MockistaToMockery

### `MockeryTearDownRector`

- class: [`Rector\MockistaToMockery\Rector\Class_\MockeryTearDownRector`](/../master/rules/mockista-to-mockery/src/Rector/Class_/MockeryTearDownRector.php)
- [test fixtures](/../master/rules/mockista-to-mockery/tests/Rector/Class_/MockeryTearDownRector/Fixture)

Add Mockery::close() in tearDown() method if not yet

```diff
use PHPUnit\Framework\TestCase;

class SomeTest extends TestCase
{
+ protected function tearDown(): void
+ {
+ Mockery::close();
+ }
public function test()
{
$mockUser = mock(User::class);
}
}
```

<br>

### `MockistaMockToMockeryMockRector`

- class: [`Rector\MockistaToMockery\Rector\ClassMethod\MockistaMockToMockeryMockRector`](/../master/rules/mockista-to-mockery/src/Rector/ClassMethod/MockistaMockToMockeryMockRector.php)
- [test fixtures](/../master/rules/mockista-to-mockery/tests/Rector/ClassMethod/MockistaMockToMockeryMockRector/Fixture)

Change functions to static calls, so composer can autoload them

```diff
class SomeTest
{
public function run()
{
- $mockUser = mock(User::class);
- $mockUser->getId()->once->andReturn(1);
- $mockUser->freeze();
+ $mockUser = Mockery::mock(User::class);
+ $mockUser->expects()->getId()->once()->andReturn(1);
}
}
```

<br>

## MysqlToMysqli

### `MysqlAssignToMysqliRector`
Expand Down
27 changes: 24 additions & 3 deletions packages/node-name-resolver/src/NodeNameResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Trait_;
use Rector\Core\Contract\Rector\RectorInterface;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Printer\BetterStandardPrinter;
use Rector\NodeNameResolver\Contract\NodeNameResolverInterface;
Expand Down Expand Up @@ -214,14 +215,34 @@ private function reportInvalidNodeForName(Node $node): void
}

$backtrace = debug_backtrace();
if (isset($backtrace[1])) {
$fileInfo = new SmartFileInfo($backtrace[1]['file']);
$fileAndLine = $fileInfo->getRelativeFilePathFromCwd() . ':' . $backtrace[1]['line'];
$rectorBacktrace = $this->matchRectorBacktraceCall($backtrace);

if ($rectorBacktrace) {
$fileInfo = new SmartFileInfo($rectorBacktrace['file']);
$fileAndLine = $fileInfo->getRelativeFilePathFromCwd() . ':' . $rectorBacktrace['line'];

$message .= PHP_EOL . PHP_EOL;
$message .= sprintf('Look at %s', $fileAndLine);
}

throw new ShouldNotHappenException($message);
}

private function matchRectorBacktraceCall(array $backtrace): ?array
{
foreach ($backtrace as $singleTrace) {
if (! isset($singleTrace['object'])) {
continue;
}

// match a Rector class
if (! is_a($singleTrace['object'], RectorInterface::class)) {
continue;
}

return $singleTrace;
}

return $backtrace[1] ?? null;
}
}
9 changes: 9 additions & 0 deletions rules/mockista-to-mockery/config/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
services:
_defaults:
public: true
autowire: true

Rector\MockistaToMockery\:
resource: '../src'
exclude:
- '../src/Rector/**/*Rector.php'
41 changes: 41 additions & 0 deletions rules/mockista-to-mockery/src/MockistaDetector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

declare(strict_types=1);

namespace Rector\MockistaToMockery;

use PhpParser\Node;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Stmt\Class_;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;

final class MockistaDetector
{
/**
* @var BetterNodeFinder
*/
private $betterNodeFinder;

/**
* @var NodeNameResolver
*/
private $nodeNameResolver;

public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
}

public function isInClass(Class_ $class): bool
{
return (bool) $this->betterNodeFinder->findFirst((array) $class->stmts, function (Node $node) {
if (! $node instanceof FuncCall) {
return false;
}

return $this->nodeNameResolver->isName($node, 'mock');
});
}
}
Loading