Passed
Branch master (3e058b)
by Allan
02:59
created

GenerateCommand::createUrlResolver()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 13
rs 10
c 0
b 0
f 0
cc 3
nc 2
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
        $packageRepoFactory = new Factories\PackageRepositoryFactory($composerRuntime);
57
        $errOutputGenerator = new \Vaimo\ComposerChangelogs\Console\OutputGenerator();
58
59
        if (!$packageName) {
60
            $packageName = $composerRuntime->getPackage()->getName();
61
        }
62
        
63
        $packageRepo = $packageRepoFactory->create();
64
        
65
        try {
66
            $package = $packageRepo->getByName($packageName);
67
        } catch (PackageResolverException $exception) {
68
            \array_map(
69
                array($output, 'writeln'),
70
                $errOutputGenerator->generateForResolverException($exception)
71
            );
72
73
            return 1;
74
        }
75
76
        $confResolverFactory = new Factories\Changelog\ConfigResolverFactory($composerRuntime);
77
78
        $confResolver = $confResolverFactory->create($fromSource);
79
80
        $changelogLoader = new \Vaimo\ComposerChangelogs\Loaders\ChangelogLoader($confResolver);
81
82
        $validator = new \Vaimo\ComposerChangelogs\Validators\ChangelogValidator($changelogLoader, array(
83
            'failure' => '<error>%s</error>',
84
            'success' => '<info>%s</info>'
85
        ));
86
87
        $result = $validator->validateForPackage($package, $output->getVerbosity());
0 ignored issues
show
Bug introduced by
It seems like $package can also be of type null; however, parameter $package of Vaimo\ComposerChangelogs...r::validateForPackage() does only seem to accept Composer\Package\PackageInterface, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

87
        $result = $validator->validateForPackage(/** @scrutinizer ignore-type */ $package, $output->getVerbosity());
Loading history...
88
89
        if (!$result()) {
90
            array_map(array($output, 'writeln'), $result->getMessages());
91
            
92
            return 1;
93
        }
94
95
        $output->writeln(
96
            sprintf('Generating changelog output for <info>%s</info>', $package->getName())
97
        );
98
99
        $infoResolver = new Resolvers\PackageInfoResolver(
100
            $composerRuntime->getInstallationManager()
101
        );
102
103
        $featureFlags = $confResolver->getFeatureFlags($package);
104
105
        $urlResolver = $this->createUrlResolver($repositoryUrl, $featureFlags);
106
        
107
        $docsGenerator = new \Vaimo\ComposerChangelogs\Generators\DocumentationGenerator(
108
            $confResolver,
109
            $changelogLoader,
110
            $infoResolver,
111
            $urlResolver
112
        );
113
114
        try {
115
            $docsGenerator->generate($package);
116
        } catch (\Vaimo\ComposerChangelogs\Exceptions\GeneratorException $exception) {
117
            $output->writeln(
118
                sprintf('<error>%s</error>', $exception->getMessage())
119
            );
120
121
            return 1;
122
        }
123
124
        $output->writeln('<info>Done</info>');
125
        
126
        return 0;
127
    }
128
    
129
    private function createUrlResolver($repositoryUrl, array $featureFlags)
130
    {
131
        if ($repositoryUrl !== null || !$featureFlags['links']) {
132
            return new Resolvers\Url\CustomSourceResolver($repositoryUrl);
133
        }
134
135
        $composerRuntime = $this->getComposer();
136
        
137
        $infoResolver = new Resolvers\PackageInfoResolver(
138
            $composerRuntime->getInstallationManager()
139
        );
140
141
        return new Resolvers\Url\RemoteSourceResolver($infoResolver);
142
    }
143
}
144