DeleteGenerator::generate()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 61
Code Lines 41

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 33
CRAP Score 3.0884

Importance

Changes 0
Metric Value
cc 3
eloc 41
nc 4
nop 0
dl 0
loc 61
ccs 33
cts 42
cp 0.7856
crap 3.0884
rs 9.264
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
declare(strict_types=1);
3
4
namespace SlayerBirden\DFCodeGeneration\Generator\Tests\Api;
5
6
use Nette\PhpGenerator\ClassType;
7
use Nette\PhpGenerator\Parameter;
8
use Nette\PhpGenerator\PhpFile;
9
use Nette\PhpGenerator\PsrPrinter;
10
use SlayerBirden\DFCodeGeneration\Generator\DataProvider\DataProviderInterface;
11
use SlayerBirden\DFCodeGeneration\Generator\GeneratorInterface;
12
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
13
use Twig\Environment;
14
use Twig\Loader\FilesystemLoader;
15
16
final class DeleteGenerator implements GeneratorInterface
17
{
18
    /**
19
     * @var DataProviderInterface
20
     */
21
    private $dataProvider;
22
    /**
23
     * @var Environment
24
     */
25
    private $twig;
26
27 2
    public function __construct(DataProviderInterface $dataProvider)
28
    {
29 2
        $this->dataProvider = $dataProvider;
30 2
        $loader = new FilesystemLoader(__DIR__ . '/Templates');
31 2
        $this->twig = new Environment($loader);
32
        $filter = new \Twig\TwigFilter('underscore', function ($string) {
33 2
            return (new CamelCaseToSnakeCaseNameConverter())->normalize($string);
34 2
        });
35 2
        $this->twig->addFilter($filter);
36 2
    }
37
38
    /**
39
     * @return string
40
     * @throws \Twig_Error_Loader
41
     * @throws \Twig_Error_Runtime
42
     * @throws \Twig_Error_Syntax
43
     */
44 2
    public function generate(): string
45
    {
46 2
        $file = new PhpFile();
47 2
        $file->setStrictTypes();
48 2
        $file->addComment('This file is generated by SlayerBirden\DFCodeGeneration');
49
50 2
        $namespace = $file->addNamespace($this->getNameSpace());
51
52 2
        $namespace->addUse('codecept\ApiTester');
53 2
        $namespace->addUse('Codeception\Util\HttpCode');
54 2
        $namespace->addUse($this->dataProvider->provide()['entityName']);
55 2
        if ($this->dataProvider->provide()['has_owner']) {
56
            $namespace->addUse('SlayerBirden\DataFlowServer\Domain\Entities\User');
57
        }
58
59 2
        $class = $namespace->addClass('DeleteCest');
60
61 2
        $class->addMethod('_before')
62 2
            ->setParameters([
63 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
64
            ])
65 2
            ->setBody(
66 2
                $this->twig->load('Delete/before.template.twig')->render($this->dataProvider->provide())
67
            )
68 2
            ->setReturnType('void')
69 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
70
71 2
        $class->addMethod('delete' . $this->dataProvider->provide()['entityClassName'])
72 2
            ->setParameters([
73 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
74
            ])
75 2
            ->setBody(
76 2
                $this->twig->load('Delete/delete.template.twig')->render($this->dataProvider->provide())
77
            )
78 2
            ->setReturnType('void')
79 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
80
81 2
        $class->addMethod('deleteNonExisting' . $this->dataProvider->provide()['entityClassName'])
82 2
            ->setParameters([
83 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
84
            ])
85 2
            ->setBody(
86 2
                $this->twig->load('Delete/delete.nonexisting.template.twig')->render($this->dataProvider->provide())
87
            )
88 2
            ->setReturnType('void')
89 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
90
91 2
        if ($this->dataProvider->provide()['has_owner']) {
92
            $class->addMethod('deleteSomeoneElses' . $this->dataProvider->provide()['entityClassName'])
93
                ->setParameters([
94
                    (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
95
                ])
96
                ->setBody(
97
                    $this->twig->load('Delete/delete.someoneeleses.template.twig')
98
                        ->render($this->dataProvider->provide())
99
                )
100
                ->setReturnType('void')
101
                ->setVisibility(ClassType::VISIBILITY_PUBLIC);
102
        }
103
104 2
        return (new PsrPrinter())->printFile($file);
105
    }
106
107
    public function getClassName(): string
108
    {
109
        return $this->getNameSpace() . '\\' . 'DeleteCest';
110
    }
111
112 2
    public function getFileName(): string
113
    {
114 2
        return sprintf(
115 2
            'tests/api/%s/%s/DeleteCest.php',
116 2
            strtolower($this->dataProvider->provide()['moduleName']),
117 2
            $this->dataProvider->provide()['refName']
118
        );
119
    }
120
121 2
    private function getNameSpace(): string
122
    {
123 2
        return sprintf(
124 2
            'codecept\%s\%s',
125 2
            strtolower($this->dataProvider->provide()['moduleName']),
126 2
            $this->dataProvider->provide()['refName']
127
        );
128
    }
129
}
130