1 | <?php |
||
36 | 1 | final class Repository implements IRepository |
|
37 | { |
||
38 | /** |
||
39 | * Define class name |
||
40 | */ |
||
41 | const CLASS_NAME = __CLASS__; |
||
42 | |||
43 | /** |
||
44 | * @var array |
||
45 | */ |
||
46 | private $paths = []; |
||
47 | |||
48 | /** |
||
49 | * @var Loaders\ILoader |
||
50 | */ |
||
51 | private $loader; |
||
52 | |||
53 | /** |
||
54 | * @var Entities\IPackage[] |
||
55 | */ |
||
56 | private $packages; |
||
57 | |||
58 | /** |
||
59 | * @param Loaders\ILoader $loader |
||
60 | */ |
||
61 | public function __construct(Loaders\ILoader $loader) |
||
65 | |||
66 | /** |
||
67 | * {@inheritdoc} |
||
68 | */ |
||
69 | public function findPackage(string $name, string $version = 'latest') |
||
70 | { |
||
71 | // normalize name |
||
72 | 1 | $name = strtolower($name); |
|
73 | |||
74 | 1 | if ($version === 'latest') { |
|
75 | 1 | $packages = $this->findPackages($name); |
|
76 | |||
77 | 1 | usort($packages, function (Entities\Package $a, Entities\Package $b) { |
|
78 | return version_compare($a->getVersion(), $b->getVersion()); |
||
79 | 1 | }); |
|
80 | |||
81 | 1 | return end($packages); |
|
82 | |||
83 | } else { |
||
84 | return current($this->findPackages($name, $version)); |
||
85 | } |
||
86 | } |
||
87 | |||
88 | /** |
||
89 | * {@inheritdoc} |
||
90 | */ |
||
91 | public function findPackages(string $name, string $version = NULL) : array |
||
92 | { |
||
93 | // normalize name |
||
94 | 1 | $name = strtolower($name); |
|
95 | |||
96 | 1 | $packages = []; |
|
97 | |||
98 | 1 | foreach ($this->getPackages() as $package) { |
|
99 | 1 | if ($package->getName() === $name && ($version === NULL || $version === $package->getVersion())) { |
|
100 | 1 | $packages[] = $package; |
|
101 | } |
||
102 | } |
||
103 | |||
104 | 1 | return $packages; |
|
105 | } |
||
106 | |||
107 | /** |
||
108 | * {@inheritdoc} |
||
109 | */ |
||
110 | public function hasPackage(Entities\IPackage $package) : bool |
||
122 | |||
123 | /** |
||
124 | * {@inheritdoc} |
||
125 | */ |
||
126 | public function filterPackages(callable $callback) : array |
||
138 | |||
139 | /** |
||
140 | * {@inheritdoc} |
||
141 | */ |
||
142 | public function getPackages() : array |
||
143 | { |
||
144 | 1 | if ($this->packages === NULL) { |
|
145 | 1 | $this->initialize(); |
|
146 | } |
||
147 | |||
148 | 1 | return $this->packages; |
|
149 | } |
||
150 | |||
151 | /** |
||
152 | * {@inheritdoc} |
||
153 | */ |
||
154 | public function reload() |
||
158 | |||
159 | /** |
||
160 | * {@inheritdoc} |
||
161 | */ |
||
162 | public function getPaths() : array |
||
166 | |||
167 | /** |
||
168 | * {@inheritdoc} |
||
169 | */ |
||
170 | public function addPath($path) |
||
171 | { |
||
172 | 1 | if (!is_array($path)) { |
|
173 | 1 | $path = [$path]; |
|
174 | } |
||
175 | |||
176 | 1 | $this->paths = array_merge($this->paths, $path); |
|
177 | 1 | } |
|
178 | |||
179 | /** |
||
180 | * {@inheritdoc} |
||
181 | */ |
||
182 | public function count() |
||
186 | |||
187 | /** |
||
188 | * {@inheritdoc} |
||
189 | */ |
||
190 | public function offsetExists($name) |
||
194 | |||
195 | /** |
||
196 | * {@inheritdoc} |
||
197 | */ |
||
198 | public function offsetGet($name) |
||
202 | |||
203 | /** |
||
204 | * {@inheritdoc} |
||
205 | */ |
||
206 | public function offsetSet($name, $package) |
||
210 | |||
211 | /** |
||
212 | * {@inheritdoc} |
||
213 | */ |
||
214 | public function offsetUnset($name) |
||
218 | |||
219 | /** |
||
220 | * {@inheritdoc} |
||
221 | */ |
||
222 | public function getIterator() |
||
226 | |||
227 | /** |
||
228 | * Initializes the packages array. Mostly meant as an extension point |
||
229 | */ |
||
230 | private function initialize() |
||
245 | } |
||
246 |