• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

eliashaeussler / composer-package-url-generator / 17540936684

08 Sep 2025 12:46AM UTC coverage: 92.308%. Remained the same
17540936684

push

github

web-flow
[TASK] Update all dependencies

132 of 143 relevant lines covered (92.31%)

3.01 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

100.0
/src/PackageUrlGenerator.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of the Composer package "eliashaeussler/composer-package-url-generator".
7
 *
8
 * Copyright (C) 2023-2025 Elias Häußler <elias@haeussler.dev>
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU General Public License as published by
12
 * the Free Software Foundation, either version 3 of the License, or
13
 * (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
 * GNU General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU General Public License
21
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22
 */
23

24
namespace EliasHaeussler\ComposerPackageUrlGenerator;
25

26
use Composer\Composer;
27
use Composer\Package;
28
use Composer\Semver;
29

30
use function usort;
31

32
/**
33
 * PackageUrlGenerator.
34
 *
35
 * @author Elias Häußler <elias@haeussler.dev>
36
 * @license GPL-3.0-or-later
37
 */
38
final class PackageUrlGenerator
39
{
40
    /**
41
     * @var list<Url\Generator\UrlGenerator>
42
     */
43
    private readonly array $generators;
44

45
    /**
46
     * @var array<string, Package\PackageInterface>
47
     */
48
    private array $packageMap = [];
49

50
    /**
51
     * @param list<Url\Generator\UrlGenerator> $generators
52
     */
53
    public function __construct(
5✔
54
        private readonly Composer $composer,
55
        array $generators,
56
    ) {
57
        usort($generators, self::sortGenerators(...));
5✔
58

59
        $this->generators = $generators;
5✔
60
    }
61

62
    public static function create(Composer $composer): self
5✔
63
    {
64
        $urlGenerators = [
5✔
65
            new Url\Generator\GenericUrlGenerator(),
5✔
66
            new Url\Generator\GitHubUrlGenerator(),
5✔
67
            new Url\Generator\GitLabUrlGenerator($composer),
5✔
68
        ];
5✔
69

70
        return new self($composer, $urlGenerators);
5✔
71
    }
72

73
    /**
74
     * @throws Exception\NoSourceUrlAvailable
75
     * @throws Exception\NoSupportedUrlGeneratorFound
76
     * @throws Exception\PackageIsNotInstalled
77
     */
78
    public function forPackage(string|Package\PackageInterface $package): Url\PackageUrls
4✔
79
    {
80
        $generator = $this->findGeneratorForPackage($package);
4✔
81
        $package = $this->findPackage($package);
2✔
82

83
        return new Url\PackageUrls(
2✔
84
            $package,
2✔
85
            $generator->generateSourceUrl($package),
2✔
86
            $generator->generateHomepageUrl($package),
2✔
87
        );
2✔
88
    }
89

90
    /**
91
     * @throws Exception\NoSupportedUrlGeneratorFound
92
     * @throws Exception\PackageIsNotInstalled
93
     */
94
    public function findGeneratorForPackage(string|Package\PackageInterface $package): Url\Generator\UrlGenerator
5✔
95
    {
96
        $package = $this->findPackage($package);
5✔
97

98
        foreach ($this->generators as $generator) {
4✔
99
            if ($generator->supports($package)) {
3✔
100
                return $generator;
3✔
101
            }
102
        }
103

104
        throw new Exception\NoSupportedUrlGeneratorFound($package->getName());
1✔
105
    }
106

107
    /**
108
     * @throws Exception\PackageIsNotInstalled
109
     */
110
    private function findPackage(string|Package\PackageInterface $package): Package\PackageInterface
5✔
111
    {
112
        if ($package instanceof Package\PackageInterface) {
5✔
113
            return $package;
2✔
114
        }
115

116
        if (!isset($this->packageMap[$package])) {
3✔
117
            $this->packageMap[$package] = $this->composer->getRepositoryManager()->findPackage(
3✔
118
                $package,
3✔
119
                new Semver\Constraint\MatchAllConstraint(),
3✔
120
            ) ?? throw new Exception\PackageIsNotInstalled($package);
3✔
121
        }
122

123
        return $this->packageMap[$package];
2✔
124
    }
125

126
    private static function sortGenerators(Url\Generator\UrlGenerator $a, Url\Generator\UrlGenerator $b): int
5✔
127
    {
128
        return ($a::getPriority() <=> $b::getPriority()) * -1;
5✔
129
    }
130
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc