Completed
Push — master ( 7fbbb0...53f538 )
by Oleg
03:37
created

AddGenerator::generate()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 56
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 37
nc 2
nop 0
dl 0
loc 56
rs 9.328
c 0
b 0
f 0
ccs 0
cts 38
cp 0
crap 6

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