Completed
Push — master ( 665429...116aa7 )
by Adam
07:10
created

Repository::getPaths()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
ccs 0
cts 1
cp 0
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 2
1
<?php
2
/**
3
 * Repository.php
4
 *
5
 * @copyright      More in license.md
6
 * @license        http://www.ipublikuj.eu
7
 * @author         Adam Kadlec http://www.ipublikuj.eu
8
 * @package        iPublikuj:Packages!
9
 * @subpackage     Repository
10
 * @since          1.0.0
11
 *
12
 * @date           30.05.15
13
 */
14
15
declare(strict_types = 1);
16
17
namespace IPub\Packages\Repository;
18
19
use Nette;
20
use Nette\Utils;
21
22
use IPub;
23
use IPub\Packages;
24
use IPub\Packages\Caching;
25
use IPub\Packages\Entities;
26
use IPub\Packages\Loaders;
27
28
/**
29
 * Packages repository
30
 *
31
 * @package        iPublikuj:Packages!
32
 * @subpackage     Repository
33
 *
34
 * @author         Adam Kadlec <[email protected]>
35
 */
36 1
final class Repository implements IRepository
37
{
38
	/**
39
	 * @var array
40
	 */
41
	private $paths = [];
42
43
	/**
44
	 * @var Loaders\ILoader
45
	 */
46
	private $loader;
47
48
	/**
49
	 * @var Entities\IPackage[]
50
	 */
51
	private $packages;
52
53
	/**
54
	 * @param Loaders\ILoader $loader
55
	 */
56
	public function __construct(Loaders\ILoader $loader)
57
	{
58 1
		$this->loader = $loader;
59 1
	}
60
61
	/**
62
	 * {@inheritdoc}
63
	 */
64
	public function findPackage(string $name, string $version = 'latest')
65
	{
66
		// normalize name
67 1
		$name = strtolower($name);
68
69 1
		if ($version === 'latest') {
70 1
			$packages = $this->findPackages($name);
71
72 1
			usort($packages, function (Entities\Package $a, Entities\Package $b) {
73
				return version_compare($a->getVersion(), $b->getVersion());
74 1
			});
75
76 1
			return end($packages);
77
78
		} else {
79
			return current($this->findPackages($name, $version));
80
		}
81
	}
82
83
	/**
84
	 * {@inheritdoc}
85
	 */
86
	public function findPackages(string $name, string $version = NULL) : array
87
	{
88
		// normalize name
89 1
		$name = strtolower($name);
90
91 1
		$packages = [];
92
93 1
		foreach ($this->getPackages() as $package) {
94 1
			if ($package->getName() === $name && ($version === NULL || $version === $package->getVersion())) {
95 1
				$packages[] = $package;
96
			}
97
		}
98
99 1
		return $packages;
100
	}
101
102
	/**
103
	 * {@inheritdoc}
104
	 */
105
	public function hasPackage(Entities\IPackage $package) : bool
106
	{
107
		$packageId = $package->getUniqueName();
108
109
		foreach ($this->getPackages() as $repoPackage) {
110
			if ($packageId === $repoPackage->getUniqueName()) {
111
				return TRUE;
112
			}
113
		}
114
115
		return FALSE;
116
	}
117
118
	/**
119
	 * {@inheritdoc}
120
	 */
121
	public function filterPackages(callable $callback) : array
122
	{
123
		$packages = [];
124
125
		foreach ($this->getPackages() as $package) {
126
			if (call_user_func($callback, $package) === TRUE) {
127
				$packages[$package->getName()] = $package;
128
			}
129
		}
130
131
		return $packages;
132
	}
133
134
	/**
135
	 * {@inheritdoc}
136
	 */
137
	public function getPackages() : array
138
	{
139 1
		if ($this->packages === NULL) {
140 1
			$this->initialize();
141
		}
142
143 1
		return $this->packages;
144
	}
145
146
	/**
147
	 * {@inheritdoc}
148
	 */
149
	public function reload()
150
	{
151
		$this->initialize();
152
	}
153
154
	/**
155
	 * {@inheritdoc}
156
	 */
157
	public function getPaths() : array
158
	{
159
		return $this->paths;
160
	}
161
162
	/**
163
	 * {@inheritdoc}
164
	 */
165
	public function addPath($path)
166
	{
167 1
		if (!is_array($path)) {
168 1
			$path = [$path];
169
		}
170
171 1
		$this->paths = array_merge($this->paths, $path);
172 1
	}
173
174
	/**
175
	 * {@inheritdoc}
176
	 */
177
	public function count()
178
	{
179
		return count($this->getPackages());
180
	}
181
182
	/**
183
	 * {@inheritdoc}
184
	 */
185
	public function offsetExists($name)
186
	{
187
		return isset($this->packages[$name]);
188
	}
189
190
	/**
191
	 * {@inheritdoc}
192
	 */
193
	public function offsetGet($name)
194
	{
195
		return $this->findPackage($name);
196
	}
197
198
	/**
199
	 * {@inheritdoc}
200
	 */
201
	public function offsetSet($name, $package)
202
	{
203
		$this->packages[$name] = $package;
204
	}
205
206
	/**
207
	 * {@inheritdoc}
208
	 */
209
	public function offsetUnset($name)
210
	{
211
		unset($this->packages[$name]);
212
	}
213
214
	/**
215
	 * {@inheritdoc}
216
	 */
217
	public function getIterator()
218
	{
219
		return new \ArrayIterator($this->packages);
220
	}
221
222
	/**
223
	 * Initializes the packages array. Mostly meant as an extension point
224
	 */
225
	private function initialize()
226
	{
227 1
		$this->packages = [];
228
229 1
		foreach ($this->paths as $path) {
230 1
			$files = glob($path . DIRECTORY_SEPARATOR . '*' . DIRECTORY_SEPARATOR . '*' . DIRECTORY_SEPARATOR . 'composer.json', GLOB_NOSORT) ?: [];
231
232 1
			foreach ($files as $file) {
233
				/** @var Entities\IPackage $package */
234 1
				if ($package = $this->loader->load($file)) {
235 1
					$this->packages[$package->getName()] = $package;
236
				}
237
			}
238
		}
239 1
	}
240
}
241