Completed
Push — master ( 39044b...ce5fed )
by Oleg
02:16
created

AddGenerator::generate()   A

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 Twig\Environment;
13
use Twig\Loader\FilesystemLoader;
14
15
final class AddGenerator implements GeneratorInterface
16
{
17
    /**
18
     * @var DataProviderInterface
19
     */
20
    private $dataProvider;
21
    /**
22
     * @var Environment
23
     */
24
    private $twig;
25
26 2
    public function __construct(DataProviderInterface $dataProvider)
27
    {
28 2
        $this->dataProvider = $dataProvider;
29 2
        $loader = new FilesystemLoader(__DIR__ . '/Templates');
30 2
        $this->twig = new Environment($loader);
31 2
    }
32
33
    /**
34
     * @return string
35
     * @throws \Twig_Error_Loader
36
     * @throws \Twig_Error_Runtime
37
     * @throws \Twig_Error_Syntax
38
     */
39 2
    public function generate(): string
40
    {
41 2
        $file = new PhpFile();
42 2
        $file->setStrictTypes();
43 2
        $file->addComment('This file is generated by SlayerBirden\DFCodeGeneration');
44
45 2
        $namespace = $file->addNamespace($this->getNameSpace());
46
47 2
        $namespace->addUse('codecept\ApiTester');
48 2
        $namespace->addUse('Codeception\Util\HttpCode');
49 2
        $namespace->addUse($this->dataProvider->provide()['entityName']);
50
51 2
        $class = $namespace->addClass('AddCest');
52
53 2
        $class->addMethod('add' . $this->dataProvider->provide()['entityClassName'])
54 2
            ->setParameters([
55 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
56
            ])
57 2
            ->setBody(
58 2
                $this->twig->load('Add/add.template.twig')->render($this->dataProvider->provide())
59
            )
60 2
            ->setReturnType('void')
61 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
62
63 2
        $class->addMethod('addIncomplete' . $this->dataProvider->provide()['entityClassName'])
64 2
            ->setParameters([
65 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
66
            ])
67 2
            ->setBody(
68 2
                $this->twig->load('Add/add.incomplete.template.twig')->render($this->dataProvider->provide())
69
            )
70 2
            ->setReturnType('void')
71 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
72
73 2
        $class->addMethod('addInvalid' . $this->dataProvider->provide()['entityClassName'])
74 2
            ->setParameters([
75 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
76
            ])
77 2
            ->setBody(
78 2
                $this->twig->load('Add/add.invalid.template.twig')->render($this->dataProvider->provide())
79
            )
80 2
            ->setReturnType('void')
81 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
82
83 2
        $class->addMethod('mutateExisting' . $this->dataProvider->provide()['entityClassName'])
84 2
            ->setParameters([
85 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
86
            ])
87 2
            ->setBody(
88 2
                $this->twig->load('Add/mutate.template.twig')->render($this->dataProvider->provide())
89
            )
90 2
            ->setReturnType('void')
91 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
92
93 2
        if ($this->dataProvider->provide()['hasUnique']) {
94
            $class->addMethod('addNonUnique' . $this->dataProvider->provide()['entityClassName'])
95
                ->setParameters([
96
                    (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
97
                ])
98
                ->setBody(
99
                    $this->twig->load('Add/add.nonunique.template.twig')->render($this->dataProvider->provide())
100
                )
101
                ->setReturnType('void')
102
                ->setVisibility(ClassType::VISIBILITY_PUBLIC);
103
        }
104
105 2
        return (new PsrPrinter())->printFile($file);
106
    }
107
108
    public function getClassName(): string
109
    {
110
        return $this->getNameSpace() . '\\' . 'AddCest';
111
    }
112
113 2
    public function getFileName(): string
114
    {
115 2
        return sprintf(
116 2
            'tests/api/%s/%s/AddCest.php',
117 2
            strtolower($this->dataProvider->provide()['moduleName']),
118 2
            $this->dataProvider->provide()['refName']
119
        );
120
    }
121
122 2
    private function getNameSpace(): string
123
    {
124 2
        return sprintf(
125 2
            'codecept\%s\%s',
126 2
            strtolower($this->dataProvider->provide()['moduleName']),
127 2
            $this->dataProvider->provide()['refName']
128
        );
129
    }
130
}
131