GetsGenerator::generate()   B
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 88
Code Lines 60

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 60
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 60
nc 2
nop 0
dl 0
loc 88
ccs 60
cts 61
cp 0.9836
crap 2
rs 8.8727
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 GetsGenerator 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('GetsCest');
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('Gets/before.template.twig')->render($this->dataProvider->provide())
67
            )
68 2
            ->setReturnType('void')
69 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
70
71 2
        $class->addMethod('getAll' . $this->dataProvider->provide()['pluralEntityName'])
72 2
            ->setParameters([
73 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
74
            ])
75 2
            ->setBody(
76 2
                $this->twig->load('Gets/get.all.template.twig')->render($this->dataProvider->provide())
77
            )
78 2
            ->setReturnType('void')
79 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
80
81 2
        $class->addMethod('getSecondPage' . $this->dataProvider->provide()['pluralEntityName'])
82 2
            ->setParameters([
83 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
84
            ])
85 2
            ->setBody(
86 2
                $this->twig->load('Gets/get.secondpage.template.twig')->render($this->dataProvider->provide())
87
            )
88 2
            ->setReturnType('void')
89 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
90
91 2
        $class->addMethod('getFiltered' . $this->dataProvider->provide()['pluralEntityName'])
92 2
            ->setParameters([
93 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
94
            ])
95 2
            ->setBody(
96 2
                $this->twig->load('Gets/get.filtered.template.twig')->render($this->dataProvider->provide())
97
            )
98 2
            ->setReturnType('void')
99 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
100
101 2
        $class->addMethod('getSorted' . $this->dataProvider->provide()['pluralEntityName'])
102 2
            ->setParameters([
103 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
104
            ])
105 2
            ->setBody(
106 2
                $this->twig->load('Gets/get.sorted.template.twig')->render($this->dataProvider->provide())
107
            )
108 2
            ->setReturnType('void')
109 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
110
111 2
        $class->addMethod('getNoResultsFiltered' . $this->dataProvider->provide()['pluralEntityName'])
112 2
            ->setParameters([
113 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
114
            ])
115 2
            ->setBody(
116 2
                $this->twig->load('Gets/get.noresfiltered.template.twig')->render($this->dataProvider->provide())
117
            )
118 2
            ->setReturnType('void')
119 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
120
121 2
        $class->addMethod('getWrongFiltered' . $this->dataProvider->provide()['pluralEntityName'])
122 2
            ->setParameters([
123 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
124
            ])
125 2
            ->setBody(
126 2
                $this->twig->load('Gets/get.wrongfiltered.template.twig')->render($this->dataProvider->provide())
127
            )
128 2
            ->setReturnType('void')
129 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
130
131 2
        return (new PsrPrinter())->printFile($file);
132
    }
133
134
    public function getClassName(): string
135
    {
136
        return $this->getNameSpace() . '\\' . 'GetsCest';
137
    }
138
139 2
    public function getFileName(): string
140
    {
141 2
        return sprintf(
142 2
            'tests/api/%s/%s/GetsCest.php',
143 2
            strtolower($this->dataProvider->provide()['moduleName']),
144 2
            $this->dataProvider->provide()['refName']
145
        );
146
    }
147
148 2
    private function getNameSpace(): string
149
    {
150 2
        return sprintf(
151 2
            'codecept\%s\%s',
152 2
            strtolower($this->dataProvider->provide()['moduleName']),
153 2
            $this->dataProvider->provide()['refName']
154
        );
155
    }
156
}
157