Passed
Push — master ( b328d9...aa9b83 )
by Allan
02:52
created

GenerateCommand::printException()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 1
nc 1
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\Commands;
7
8
use Symfony\Component\Console\Input\InputInterface;
9
use Symfony\Component\Console\Output\OutputInterface;
10
use Vaimo\ComposerChangelogs\Exceptions\PackageResolverException;
11
use Vaimo\ComposerChangelogs\Resolvers;
12
13
use Vaimo\ComposerChangelogs\Factories;
14
15
/**
16
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
17
 */
18
class GenerateCommand extends \Composer\Command\BaseCommand
19
{
20
    protected function configure()
21
    {
22
        $this->setName('changelog:generate');
23
24
        $this->setDescription('Generates documentation output from changelog source');
25
26
        $this->addArgument(
27
            'name',
28
            \Symfony\Component\Console\Input\InputArgument::OPTIONAL,
29
            'Targeted package name. Default: root package'
30
        );
31
32
        $this->addOption(
33
            '--from-source',
34
            null,
35
            \Symfony\Component\Console\Input\InputOption::VALUE_NONE,
36
            'Extract configuration from vendor package instead of using global installation data'
37
        );
38
39
        $this->addOption(
40
            '--url',
41
            null,
42
            \Symfony\Component\Console\Input\InputOption::VALUE_OPTIONAL,
43
            'Repository URL to use for generating version-bound links for sources and comparisons'
44
        );
45
    }
46
47
    protected function execute(InputInterface $input, OutputInterface $output)
48
    {
49
        $packageName = $input->getArgument('name');
50
        
51
        $fromSource = $input->getOption('from-source');
52
        $repositoryUrl = $input->getOption('url');
53
54
        $composerRuntime = $this->getComposer();
55
56
        try {
57
            $package = $this->resolvePackage(is_string($packageName) ? $packageName : '');
58
        } catch (PackageResolverException $exception) {
59
            $this->printException($exception, $output);
60
61
            return 1;
62
        }
63
        
64
        $confResolverFactory = new Factories\Changelog\ConfigResolverFactory($composerRuntime);
65
66
        $confResolver = $confResolverFactory->create($fromSource);
67
68
        $changelogLoader = new \Vaimo\ComposerChangelogs\Loaders\ChangelogLoader($confResolver);
69
70
        $validator = new \Vaimo\ComposerChangelogs\Validators\ChangelogValidator($changelogLoader, array(
71
            'failure' => '<error>%s</error>',
72
            'success' => '<info>%s</info>'
73
        ));
74
75
        $result = $validator->validateForPackage($package, $output->getVerbosity());
76
77
        if (!$result()) {
78
            array_map(array($output, 'writeln'), $result->getMessages());
79
            
80
            return 1;
81
        }
82
83
        $output->writeln(
84
            sprintf('Generating changelog output for <info>%s</info>', $package->getName())
85
        );
86
87
        $infoResolver = new Resolvers\PackageInfoResolver(
88
            $composerRuntime->getInstallationManager()
89
        );
90
91
        $featureFlags = $confResolver->getFeatureFlags($package);
92
93
        $urlResolver = $this->createUrlResolver($repositoryUrl, $featureFlags);
94
        
95
        $docsGenerator = new \Vaimo\ComposerChangelogs\Generators\DocumentationGenerator(
96
            $confResolver,
97
            $changelogLoader,
98
            $infoResolver,
99
            $urlResolver
100
        );
101
102
        try {
103
            $docsGenerator->generate($package);
104
        } catch (\Vaimo\ComposerChangelogs\Exceptions\GeneratorException $exception) {
105
            $output->writeln(
106
                sprintf('<error>%s</error>', $exception->getMessage())
107
            );
108
109
            return 1;
110
        }
111
112
        $output->writeln('<info>Done</info>');
113
        
114
        return 0;
115
    }
116
117
    private function printException($exception, OutputInterface $output)
118
    {
119
        $errorOutputGenerator = new \Vaimo\ComposerChangelogs\Console\OutputGenerator();
120
121
        \array_map(
122
            array($output, 'writeln'),
123
            $errorOutputGenerator->generateForResolverException($exception)
124
        );
125
    }
126
    
127
    /**
128
     * @param string $packageName
129
     * @return \Composer\Package\PackageInterface
130
     * @throws PackageResolverException
131
     */
132
    private function resolvePackage($packageName)
133
    {
134
        $composerRuntime = $this->getComposer();
135
136
        if (!$packageName) {
137
            $packageName = $composerRuntime->getPackage()->getName();
138
        }
139
140
        $packageRepoFactory = new Factories\PackageRepositoryFactory($composerRuntime);
141
142
        $packageRepository = $packageRepoFactory->create();
143
144
        return $packageRepository->getByName($packageName);
145
    }
146
    
147
    private function createUrlResolver($repositoryUrl, array $featureFlags)
148
    {
149
        if ($repositoryUrl !== null || !$featureFlags['links']) {
150
            return new Resolvers\Url\CustomSourceResolver($repositoryUrl);
151
        }
152
153
        $composerRuntime = $this->getComposer();
154
        
155
        $infoResolver = new Resolvers\PackageInfoResolver(
156
            $composerRuntime->getInstallationManager()
157
        );
158
159
        return new Resolvers\Url\RemoteSourceResolver($infoResolver);
160
    }
161
}
162