DocumentationGenerator::generate()   A
last analyzed

Complexity

Conditions 5
Paths 3

Size

Total Lines 47
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 30
c 1
b 0
f 1
dl 0
loc 47
rs 9.1288
cc 5
nc 3
nop 2
1
<?php
2
/**
3
 * Copyright © Vaimo Group. All rights reserved.
4
 * See LICENSE_VAIMO.txt for license details.
5
 */
6
namespace Vaimo\ComposerChangelogs\Generators;
7
8
class DocumentationGenerator
9
{
10
    /**
11
     * @var \Vaimo\ComposerChangelogs\Resolvers\ChangelogConfigResolver
12
     */
13
    private $configResolver;
14
15
    /**
16
     * @var \Vaimo\ComposerChangelogs\Resolvers\PackageInfoResolver
17
     */
18
    private $packageInfoResolver;
19
20
    /**
21
     * @var \Vaimo\ComposerChangelogs\Resolvers\ChangelogTemplateResolver
22
     */
23
    private $templateResolver;
24
    
25
    /**
26
     * @var \Vaimo\ComposerChangelogs\Generators\Changelog\RenderContextGenerator
27
     */
28
    private $contextGenerator;
29
30
    /**
31
     * @var \Vaimo\ComposerChangelogs\Generators\TemplateOutputGenerator
32
     */
33
    private $templateRenderer;
34
35
    /**
36
     * @var \Vaimo\ComposerChangelogs\Interfaces\UrlResolverInterface
37
     */
38
    private $urlResolver;
39
40
    /**
41
     * @param \Vaimo\ComposerChangelogs\Resolvers\ChangelogConfigResolver $configResolver
42
     * @param \Vaimo\ComposerChangelogs\Resolvers\PackageInfoResolver $packageInfoResolver
43
     * @param \Vaimo\ComposerChangelogs\Interfaces\UrlResolverInterface $urlResolver
44
     */
45
    public function __construct(
46
        \Vaimo\ComposerChangelogs\Resolvers\ChangelogConfigResolver $configResolver,
47
        \Vaimo\ComposerChangelogs\Resolvers\PackageInfoResolver $packageInfoResolver,
48
        \Vaimo\ComposerChangelogs\Interfaces\UrlResolverInterface $urlResolver
49
    ) {
50
        $this->configResolver = $configResolver;
51
        $this->packageInfoResolver = $packageInfoResolver;
52
        $this->urlResolver = $urlResolver;
53
54
        $this->templateResolver = new \Vaimo\ComposerChangelogs\Resolvers\ChangelogTemplateResolver(
55
            $this->configResolver
56
        );
57
        
58
        $this->contextGenerator = new \Vaimo\ComposerChangelogs\Generators\Changelog\RenderContextGenerator();
59
        $this->templateRenderer = new \Vaimo\ComposerChangelogs\Generators\TemplateOutputGenerator();
60
    }
61
62
    public function generate(\Composer\Package\PackageInterface $package, array $changelog)
63
    {
64
        $outputPaths = $this->configResolver->resolveOutputTargets($package);
65
66
        $templates = $this->templateResolver->getTemplates($package);
67
68
        $featureFlags = $this->configResolver->getFeatureFlags($package);
69
        
70
        $repositoryUrl = $this->urlResolver->resolveForPackage($package);
71
        $repositoryRoot = $this->packageInfoResolver->getInstallPath($package);
72
        
73
        $contextData = $this->contextGenerator->generate(
74
            $changelog,
75
            $repositoryUrl,
76
            $featureFlags['dates'] ? $repositoryRoot : ''
77
        );
78
        
79
        foreach ($outputPaths as $type => $target) {
80
            $escapers = $this->configResolver->resolveOutputEscapersForType($type);
81
82
            try {
83
                $output = $this->templateRenderer->generateOutput(
84
                    $contextData,
85
                    $templates[$type],
86
                    $escapers
87
                );
88
            } catch (\Vaimo\ComposerChangelogs\Exceptions\TemplateValidationException $exception) {
89
                $messages = array();
90
91
                do {
92
                    $messages[] = $exception->getMessage();
93
                } while ($exception = $exception->getPrevious());
94
95
                $messages = array_map(function ($message, $index) {
96
                    return sprintf('#%s - %s', $index + 1, $message);
97
                }, $messages, array_keys($messages));
98
99
                $errorMessage = sprintf(
100
                    "Generator run for '%s' caused an error:\n%s",
101
                    $type,
102
                    implode("\n", $messages)
103
                );
104
105
                throw new \Vaimo\ComposerChangelogs\Exceptions\GeneratorException($errorMessage);
106
            }
107
108
            file_put_contents($target, $output);
109
        }
110
    }
111
}
112