Skip to content

Commit 3f67227

Browse files
authored
Merge pull request #12 from kylekatarnls/feature/composer-v2
Extract platform scanning logic
2 parents 051f6f0 + b640e67 commit 3f67227

File tree

3 files changed

+124
-97
lines changed

3 files changed

+124
-97
lines changed

src/MultiTester/MultiTester.php

Lines changed: 4 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
namespace MultiTester;
44

5+
use MultiTester\Traits\ErrorHandler;
56
use MultiTester\Traits\MultiTesterFile;
67
use MultiTester\Traits\ProcStreams;
78
use MultiTester\Traits\StorageDirectory;
89
use MultiTester\Traits\TravisFile;
910
use MultiTester\Traits\Verbose;
10-
use MultiTester\Traits\WorkingDirectory;
1111

1212
class MultiTester
1313
{
14-
use WorkingDirectory;
14+
use ErrorHandler;
1515
use MultiTesterFile;
1616
use TravisFile;
1717
use StorageDirectory;
@@ -43,7 +43,8 @@ public function exec($command, $quiet = false)
4343
public function getComposerSettings($package, $platforms = null)
4444
{
4545
if (!isset($this->composerSettings[$package])) {
46-
$this->composerSettings[$package] = $this->getFromFirstValidPlatform($package, $platforms);
46+
$sourceFinder = new SourceFinder($this->getWorkingDirectory());
47+
$this->composerSettings[$package] = $sourceFinder->getFromFirstValidPlatform($package, $platforms);
4748
}
4849

4950
return $this->composerSettings[$package];
@@ -272,98 +273,4 @@ protected function execCommands($commands, $quiet = false)
272273

273274
return true;
274275
}
275-
276-
protected function error($message)
277-
{
278-
(new Directory($this->getWorkingDirectory()))->remove();
279-
280-
throw $message instanceof MultiTesterException ?
281-
new MultiTesterException($message->getMessage(), 0, $message) :
282-
new MultiTesterException($message);
283-
}
284-
285-
private function getSourceFromLibrariesIo($package): ?array
286-
{
287-
$file = new File('https://libraries.io/api/Packagist/' . urlencode($package), 'json');
288-
289-
return $file->isValid() ? $file->toArray() : null;
290-
}
291-
292-
private function getSourceFromPackagist($package, $namespace = 'p2'): ?array
293-
{
294-
$file = new File("https://repo.packagist.org/$namespace/$package.json");
295-
296-
return $file->isValid()
297-
? (($file['packages'] ?? [])[$package] ?? null)
298-
: null;
299-
}
300-
301-
private function getSourceFromPackagist2($package): ?array
302-
{
303-
$list = $this->getSourceFromPackagist($package);
304-
305-
if (!is_array($list)) {
306-
return $list;
307-
}
308-
309-
$listByVersion = [];
310-
$previousItem = [];
311-
312-
foreach ($list as $item) {
313-
if (isset($item['version'])) {
314-
$previousItem = array_merge($previousItem, $item);
315-
$listByVersion[$item['version']] = $previousItem;
316-
}
317-
}
318-
319-
return $listByVersion;
320-
}
321-
322-
private function getSourceFromPlatform($package, $platform): ?array
323-
{
324-
switch ($platform) {
325-
case 'composer1':
326-
case 'packagist1':
327-
return $this->getSourceFromPackagist($package, 'p');
328-
329-
case 'composer':
330-
case 'packagist':
331-
case 'composer2':
332-
case 'packagist2':
333-
case 'packagist.org':
334-
return $this->getSourceFromPackagist2($package);
335-
336-
case 'libraries':
337-
case 'libraries.io':
338-
return $this->getSourceFromLibrariesIo($package);
339-
340-
default:
341-
$this->error("Unknown platform '$platform'");
342-
}
343-
}
344-
345-
/**
346-
* @param mixed $platforms
347-
*/
348-
private function parsePlatformList($platforms): array
349-
{
350-
if (is_string($platforms)) {
351-
return array_values(array_filter(preg_split('/[,\s]+/', $platforms)));
352-
}
353-
354-
return (array) ($platforms ?? ['packagist.org', 'libraries.io']);
355-
}
356-
357-
private function getFromFirstValidPlatform($package, $platforms): ?array
358-
{
359-
foreach ($this->parsePlatformList($platforms) as $platform) {
360-
$result = $this->getSourceFromPlatform($package, $platform);
361-
362-
if ($result !== null) {
363-
return $result;
364-
}
365-
}
366-
367-
return null;
368-
}
369276
}

src/MultiTester/SourceFinder.php

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
namespace MultiTester;
4+
5+
use MultiTester\Traits\ErrorHandler;
6+
7+
final class SourceFinder
8+
{
9+
use ErrorHandler;
10+
11+
public function __construct($workingDirectory)
12+
{
13+
$this->setWorkingDirectory($workingDirectory);
14+
}
15+
16+
public function getFromFirstValidPlatform($package, $platforms): ?array
17+
{
18+
foreach ($this->parsePlatformList($platforms) as $platform) {
19+
$result = $this->getSourceFromPlatform($package, $platform);
20+
21+
if ($result !== null) {
22+
return $result;
23+
}
24+
}
25+
26+
return null;
27+
}
28+
29+
private function getSourceFromLibrariesIo($package): ?array
30+
{
31+
$file = new File('https://libraries.io/api/Packagist/' . urlencode($package), 'json');
32+
33+
return $file->isValid() ? $file->toArray() : null;
34+
}
35+
36+
private function getSourceFromPackagist($package, $namespace = 'p2'): ?array
37+
{
38+
$file = new File("https://repo.packagist.org/$namespace/$package.json");
39+
40+
return $file->isValid()
41+
? (($file['packages'] ?? [])[$package] ?? null)
42+
: null;
43+
}
44+
45+
private function getSourceFromPackagist2($package): ?array
46+
{
47+
$list = $this->getSourceFromPackagist($package);
48+
49+
if (!is_array($list)) {
50+
return $list;
51+
}
52+
53+
$listByVersion = [];
54+
$previousItem = [];
55+
56+
foreach ($list as $item) {
57+
if (isset($item['version'])) {
58+
$previousItem = array_merge($previousItem, $item);
59+
$listByVersion[$item['version']] = $previousItem;
60+
}
61+
}
62+
63+
return $listByVersion;
64+
}
65+
66+
private function getSourceFromPlatform($package, $platform): ?array
67+
{
68+
switch ($platform) {
69+
case 'composer1':
70+
case 'packagist1':
71+
return $this->getSourceFromPackagist($package, 'p');
72+
73+
case 'composer':
74+
case 'packagist':
75+
case 'composer2':
76+
case 'packagist2':
77+
case 'packagist.org':
78+
return $this->getSourceFromPackagist2($package);
79+
80+
case 'libraries':
81+
case 'libraries.io':
82+
return $this->getSourceFromLibrariesIo($package);
83+
84+
default:
85+
$this->error("Unknown platform '$platform'");
86+
}
87+
}
88+
89+
/**
90+
* @param mixed $platforms
91+
*/
92+
private function parsePlatformList($platforms): array
93+
{
94+
if (is_string($platforms)) {
95+
return array_values(array_filter(preg_split('/[,\s]+/', $platforms)));
96+
}
97+
98+
return (array) ($platforms ?? ['packagist.org', 'libraries.io']);
99+
}
100+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace MultiTester\Traits;
4+
5+
use MultiTester\Directory;
6+
use MultiTester\MultiTesterException;
7+
8+
trait ErrorHandler
9+
{
10+
use WorkingDirectory;
11+
12+
protected function error($message): void
13+
{
14+
(new Directory($this->getWorkingDirectory()))->remove();
15+
16+
throw $message instanceof MultiTesterException ?
17+
new MultiTesterException($message->getMessage(), 0, $message) :
18+
new MultiTesterException($message);
19+
}
20+
}

0 commit comments

Comments
 (0)