-
-
Notifications
You must be signed in to change notification settings - Fork 4.5k
/
Link.php
140 lines (119 loc) · 3.55 KB
/
Link.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<?php declare(strict_types=1);
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Package;
use Composer\Semver\Constraint\ConstraintInterface;
/**
* Represents a link between two packages, represented by their names
*
* @author Nils Adermann <naderman@naderman.de>
*/
class Link
{
public const TYPE_REQUIRE = 'requires';
public const TYPE_DEV_REQUIRE = 'devRequires';
public const TYPE_PROVIDE = 'provides';
public const TYPE_CONFLICT = 'conflicts';
public const TYPE_REPLACE = 'replaces';
/**
* Special type
* @internal
*/
public const TYPE_DOES_NOT_REQUIRE = 'does not require';
private const TYPE_UNKNOWN = 'relates to';
/**
* Will be converted into a constant once the min PHP version allows this
*
* @internal
* @var string[]
* @phpstan-var array<self::TYPE_REQUIRE|self::TYPE_DEV_REQUIRE|self::TYPE_PROVIDE|self::TYPE_CONFLICT|self::TYPE_REPLACE>
*/
public static $TYPES = [
self::TYPE_REQUIRE,
self::TYPE_DEV_REQUIRE,
self::TYPE_PROVIDE,
self::TYPE_CONFLICT,
self::TYPE_REPLACE,
];
/**
* @var string
*/
protected $source;
/**
* @var string
*/
protected $target;
/**
* @var ConstraintInterface
*/
protected $constraint;
/**
* @var string
* @phpstan-var string $description
*/
protected $description;
/**
* @var ?string
*/
protected $prettyConstraint;
/**
* Creates a new package link.
*
* @param ConstraintInterface $constraint Constraint applying to the target of this link
* @param self::TYPE_* $description Used to create a descriptive string representation
*/
public function __construct(
string $source,
string $target,
ConstraintInterface $constraint,
$description = self::TYPE_UNKNOWN,
?string $prettyConstraint = null
) {
$this->source = strtolower($source);
$this->target = strtolower($target);
$this->constraint = $constraint;
$this->description = self::TYPE_DEV_REQUIRE === $description ? 'requires (for development)' : $description;
$this->prettyConstraint = $prettyConstraint;
}
public function getDescription(): string
{
return $this->description;
}
public function getSource(): string
{
return $this->source;
}
public function getTarget(): string
{
return $this->target;
}
public function getConstraint(): ConstraintInterface
{
return $this->constraint;
}
/**
* @throws \UnexpectedValueException If no pretty constraint was provided
*/
public function getPrettyConstraint(): string
{
if (null === $this->prettyConstraint) {
throw new \UnexpectedValueException(sprintf('Link %s has been misconfigured and had no prettyConstraint given.', $this));
}
return $this->prettyConstraint;
}
public function __toString(): string
{
return $this->source.' '.$this->description.' '.$this->target.' ('.$this->constraint.')';
}
public function getPrettyString(PackageInterface $sourcePackage): string
{
return $sourcePackage->getPrettyString().' '.$this->description.' '.$this->target.' '.$this->constraint->getPrettyString();
}
}