GenerateVendorDocCommand   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 66
dl 0
loc 103
rs 10
c 0
b 0
f 0
wmc 14

2 Methods

Rating   Name   Duplication   Size   Complexity  
A configure() 0 6 1
F execute() 0 93 13
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Zikula package.
7
 *
8
 * Copyright Zikula - https://ziku.la/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
use Symfony\Component\Console\Command\Command;
15
use Symfony\Component\Console\Input\InputInterface;
16
use Symfony\Component\Console\Input\InputOption;
17
use Symfony\Component\Console\Output\OutputInterface;
18
19
class GenerateVendorDocCommand extends Command
20
{
21
    protected function configure()
22
    {
23
        $this
24
            ->setName('build:generate_vendor_doc')
25
            ->setDescription('Generates a file containing all the vendors and the installed version.')
26
            ->addOption('write-to', null, InputOption::VALUE_REQUIRED, 'Where to dump the generated file.');
27
    }
28
29
    protected function execute(InputInterface $input, OutputInterface $output)
30
    {
31
        $output->writeln('Reading composer vendors.');
32
        $packages = json_decode(file_get_contents('composer.lock'), true);
33
        $packages = $packages['packages'];
34
35
        $output->writeln('Generating output');
36
37
        $typeOrder = [
38
            'zikula-module' => 'Zikula Modules',
39
            'zikula-theme' => 'Zikula Themes',
40
            'symfony-bundle' => 'Symfony Bundles',
41
            'component' => 'Web Components',
42
            'library' => 'PHP libraries',
43
            'composer-installer' => 'Composer Installers',
44
            'composer-plugin' => 'Composer Plugins',
45
            'symfony-pack' => 'Symfony Packages',
46
            'symfony-bridge' => 'Symfony Bridge',
47
            'symfony-mailer-bridge' => 'Symfony Mailer Bridge',
48
            'symfony-messenger-bridge' => 'Symfony Messenger Bridge',
49
        ];
50
        $types = array_keys($typeOrder);
51
        usort($packages, function ($a, $b) use ($types) {
52
            $typeOrder = array_search($a['type'], $types) - array_search($b['type'], $types);
53
            if (0 !== $typeOrder) {
54
                return $typeOrder;
55
            }
56
57
            // inside same type order by name
58
            return strcmp($a['name'], $b['name']);
59
        });
60
61
        $content = "---
62
currentMenu: vendor-info
63
---
64
# Vendor information
65
";
66
67
        $currentType = '';
68
        $authors = [];
69
        foreach ($packages as $package) {
70
            if ($currentType !== $package['type']) {
71
                if ('' !== $currentType) {
72
                    $content .= "\n";
73
                }
74
                $content .= '## ' . $typeOrder[$package['type']] . "\n\n";
75
                $currentType = $package['type'];
76
            }
77
            $content .= "- **" . $package['name'] . "** `" . $package['version'] . "`";
78
            if (isset($package['license'])) {
79
                $content .= ", License: `" . implode(', ', $package['license']) . "`\n";
80
            } else {
81
                $content .= "\n";
82
            }
83
            if (isset($package['description'])) {
84
                $content .= "  *" . $package['description'] . "*\n";
85
            }
86
            if (isset($package['authors'])) {
87
                $authors = array_merge($authors, $package['authors']);
88
            }
89
        }
90
91
        $content .= "\n\n";
92
        $content .= "## Authors\n\n";
93
        $content .= "These are the main authors of all of the projects supporting Zikula:\n\n";
94
95
        $tmp = [];
96
        foreach ($authors as $k => $author) {
97
            if (in_array($author['name'], $tmp)) {
98
                unset($authors[$k]);
99
                continue;
100
            }
101
            $tmp[] = $author['name'];
102
        }
103
        usort($authors, function ($a, $b) {
104
            return strcmp($a['name'], $b['name']);
105
        });
106
        foreach ($authors as $author) {
107
            $content .= "- **" . $author['name'] . "**";
108
            if (isset($author['homepage'])) {
109
                $content .= " " . $author['homepage'];
110
            }
111
            if (isset($author['email'])) {
112
                $content .= " *" . $author['email'] . "*";
113
            }
114
            $content .= "\n";
115
        }
116
117
        $output->writeln('Dumping vendors to ' . $input->getOption('write-to'));
118
119
        file_put_contents($input->getOption('write-to'), $content);
120
121
        return 0;
122
    }
123
}
124