Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
49 / 49
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
ClassCodeGenerator
100.00% covered (success)
100.00%
49 / 49
100.00% covered (success)
100.00%
3 / 3
3
100.00% covered (success)
100.00%
1 / 1
 generateComposerJsonFile
100.00% covered (success)
100.00%
33 / 33
100.00% covered (success)
100.00%
1 / 1
1
 generateLayoutClass
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 generateLayoutTestClass
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Apie\TwigTemplateLayoutRenderer\Skeleton;
3
4use Apie\Common\ValueObjects\EntityNamespace;
5use Apie\Core\ApieLib;
6use Apie\Core\Identifiers\Identifier;
7
8final class ClassCodeGenerator
9{
10    public function generateComposerJsonFile(
11        Identifier $name,
12        EntityNamespace $entityNamespace,
13        string $apieVersion = ApieLib::VERSION
14    ): string {
15        $contents = [
16            "name" => "apie/cms-layout-" . $name,
17            "description" => "Composer package of the apie library: cms layout " . $name,
18            "type" => "library",
19            "license" => "MIT",
20            "authors" => [
21            ],
22            "autoload" => [
23                "psr-4" => [
24                    $entityNamespace->toNative() => "src/",
25                ]
26            ],
27            "autoload-dev" => [
28                "psr-4" => [
29                    $entityNamespace->toTestNamespace()->toNative() => 'tests/',
30                ]
31            ],
32            "require" => [
33                "php" => ">=8.3",
34                "apie/core" => $apieVersion,
35                "apie/html-builders" => $apieVersion,
36                "apie/twig-template-layout-renderer" => $apieVersion,
37                "twig/twig" => "^3.10.2"
38            ],
39            "require-dev" => [
40                "apie/fixtures" => $apieVersion,
41                "illuminate/support" => "*",
42                "phpunit/phpunit" => "^11.5.2"
43            ],
44            "minimum-stability" => "dev",
45            "prefer-stable" => true
46        ];
47        return json_encode($contents, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
48    }
49
50    public function generateLayoutClass(
51        Identifier $name,
52        EntityNamespace $entityNamespace
53    ): string {
54        $contents = '<?php' . PHP_EOL;
55        $contents .= 'namespace ' . rtrim($entityNamespace->toNative(), '\\') . ';' . PHP_EOL;
56        $contents .= '        
57use Apie\HtmlBuilders\Assets\AssetManager;
58use Apie\TwigTemplateLayoutRenderer\TwigRenderer;
59use Symfony\UX\Icons\Twig\UXIconRuntime;
60
61';
62        $contents .= 'class ' . $name->toPascalCaseSlug()-> toNative() . 'DesignSystemLayout
63{
64    /** 
65     * @codeCoverageIgnore
66     */
67    private function __construct()
68    {
69    }
70
71    public static function createRenderer(
72        UXIconRuntime $uxIconRuntime,
73        ?AssetManager $assetManager = null
74    ): TwigRenderer {
75        $assetManager ??= new AssetManager();
76        return new TwigRenderer(
77            __DIR__ . \'/../resources/templates\',
78            $assetManager->withAddedPath(__DIR__ . \'/../resources/assets\'),
79            "Apie\HtmlBuilders\Components\\\\",
80            $uxIconRuntime
81        );
82    }
83}
84';
85        return $contents;
86    }
87
88    public function generateLayoutTestClass(
89        Identifier $name,
90        EntityNamespace $entityNamespace
91    ): string {
92        $contents = '<?php' . PHP_EOL;
93        $contents .= 'namespace ' . rtrim($entityNamespace->toTestNamespace()->toNative(), '\\') . ';' . PHP_EOL;
94        $contents .= '
95use ' . $entityNamespace . $name->toPascalCaseSlug()->toNative() . 'DesignSystemLayout;
96use Apie\HtmlBuilders\Interfaces\ComponentRendererInterface;
97use Apie\HtmlBuilders\TestHelpers\AbstractRenderTestCase;
98
99';
100        $contents .= 'class ' . $name->toPascalCaseSlug()-> toNative() . 'DesignSystemLayoutTest extends AbstractRenderTestCase
101
102    public function getRenderer(): ComponentRendererInterface
103    {
104        return ' . $name->toPascalCaseSlug()-> toNative() . 'DesignSystemLayout::createRenderer(self::createTwigRuntimeForTests());
105    }
106
107    public function getFixturesPath(): string
108    {
109        return  __DIR__ . \'/../fixtures\';
110    }
111}
112';
113        return $contents;
114    }
115}