AddGenerator::generate()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 67
Code Lines 45

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 39
CRAP Score 2.0141

Importance

Changes 0
Metric Value
cc 2
eloc 45
nc 2
nop 0
dl 0
loc 67
ccs 39
cts 46
cp 0.8478
crap 2.0141
rs 9.2
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 AddGenerator 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
56 2
        $class = $namespace->addClass('AddCest');
57
58 2
        $class->addMethod('add' . $this->dataProvider->provide()['entityClassName'])
59 2
            ->setParameters([
60 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
61
            ])
62 2
            ->setBody(
63 2
                $this->twig->load('Add/add.template.twig')->render($this->dataProvider->provide())
64
            )
65 2
            ->setReturnType('void')
66 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
67
68 2
        $class->addMethod('addIncomplete' . $this->dataProvider->provide()['entityClassName'])
69 2
            ->setParameters([
70 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
71
            ])
72 2
            ->setBody(
73 2
                $this->twig->load('Add/add.incomplete.template.twig')->render($this->dataProvider->provide())
74
            )
75 2
            ->setReturnType('void')
76 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
77
78 2
        $class->addMethod('addInvalid' . $this->dataProvider->provide()['entityClassName'])
79 2
            ->setParameters([
80 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
81
            ])
82 2
            ->setBody(
83 2
                $this->twig->load('Add/add.invalid.template.twig')->render($this->dataProvider->provide())
84
            )
85 2
            ->setReturnType('void')
86 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
87
88 2
        $class->addMethod('mutateExisting' . $this->dataProvider->provide()['entityClassName'])
89 2
            ->setParameters([
90 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
91
            ])
92 2
            ->setBody(
93 2
                $this->twig->load('Add/mutate.template.twig')->render($this->dataProvider->provide())
94
            )
95 2
            ->setReturnType('void')
96 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
97
98 2
        if ($this->dataProvider->provide()['hasUnique']) {
99
            $class->addMethod('addNonUnique' . $this->dataProvider->provide()['entityClassName'])
100
                ->setParameters([
101
                    (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
102
                ])
103
                ->setBody(
104
                    $this->twig->load('Add/add.nonunique.template.twig')->render($this->dataProvider->provide())
105
                )
106
                ->setReturnType('void')
107
                ->setVisibility(ClassType::VISIBILITY_PUBLIC);
108
        }
109
110 2
        return (new PsrPrinter())->printFile($file);
111
    }
112
113
    public function getClassName(): string
114
    {
115
        return $this->getNameSpace() . '\\' . 'AddCest';
116
    }
117
118 2
    public function getFileName(): string
119
    {
120 2
        return sprintf(
121 2
            'tests/api/%s/%s/AddCest.php',
122 2
            strtolower($this->dataProvider->provide()['moduleName']),
123 2
            $this->dataProvider->provide()['refName']
124
        );
125
    }
126
127 2
    private function getNameSpace(): string
128
    {
129 2
        return sprintf(
130 2
            'codecept\%s\%s',
131 2
            strtolower($this->dataProvider->provide()['moduleName']),
132 2
            $this->dataProvider->provide()['refName']
133
        );
134
    }
135
}
136