-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathComposerListener.php
More file actions
134 lines (121 loc) · 3.52 KB
/
ComposerListener.php
File metadata and controls
134 lines (121 loc) · 3.52 KB
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
<?php
use Composer\Script\Event;
class ComposerListener
{
const DEFAULT_SELENIUM_VERSION = '3.10.0';
const DEFAULT_GECKODRIVER_VERSION = '0.19.1';
const DEFAULT_CHROMEDRIVER_VERSION = '2.35';
const SELENIUM_FILENAME = 'selenium-ss.jar';
const GECKODRIVER_FILENAME = 'geckodriver.tar.gz';
const CHROMEDRIVER_FILENAME = 'chromedriver.zip';
const SUPPORTED_OPERATIVE_SYSTEMS = [
'linux32',
'linux64',
'mac64',
'win32',
];
/**
* @param Event $event
*/
public static function downloadSelenium(Event $event)
{
$args = self::parseArguments($event->getArguments());
self::downloadFile(
self::SELENIUM_FILENAME,
self::buildSeleniumUrl(
$args['selenium'] ?? self::DEFAULT_SELENIUM_VERSION
)
);
}
/**
* @param Event $event
*/
public static function downloadDrivers(Event $event)
{
$args = self::parseArguments($event->getArguments());
$os = $args['os'] ?? self::determineOS();
$gdVersion = $args['gdVersion'] ?? self::DEFAULT_GECKODRIVER_VERSION;
$cdVersion = $args['cdVersion'] ?? self::DEFAULT_CHROMEDRIVER_VERSION;
if (!in_array($os, self::SUPPORTED_OPERATIVE_SYSTEMS)) {
$event->stopPropagation();
echo "Provided OS '$os' is not supported.\n";
exit(1);
}
self::downloadFile(
self::GECKODRIVER_FILENAME,
self::buildGeckoDriverUrl($os, $gdVersion)
);
self::downloadFile(
self::CHROMEDRIVER_FILENAME,
self::buildChromeDriverUrl($os, $cdVersion)
);
}
private static function determineOS(): string
{
return strtolower(php_uname('s')) . (8 * PHP_INT_SIZE);
}
private static function buildGeckoDriverUrl(
string $os,
string $version
): string {
return 'https://github.com/mozilla/geckodriver/releases/download/'
. "v{$version}/geckodriver-v{$version}-{$os}.tar.gz";
}
private static function buildChromeDriverUrl(
string $os,
string $version
): string {
return "https://chromedriver.storage.googleapis.com/{$version}/"
. "chromedriver_{$os}.zip";
}
private static function buildSeleniumUrl(string $version): string
{
return 'http://selenium-release.storage.googleapis.com/'
. substr($version, 0, strpos($version, '.', 2))
. "/selenium-server-standalone-{$version}.jar";
}
private static function downloadFile($filename, $url)
{
echo "Downloading $url into $filename.\n";
stream_copy_to_stream(
fopen($url, 'r'),
fopen($filename, 'w')
);
}
/**
* Arguments in string are parsed to key-pair values.
*
* ```php
* $args = self::parseArguments([
* 'opt=value',
* 'foo=bar'
* ]);
*
* print_r($args);
* ```
*
* The output will be:
*
* > Array
* > (
* > [opt] => value
* > [foo] => bar
* > )
*
* @param array[] $args
* @return array[]
*/
public static function parseArguments(array $args)
{
$parsed = [];
foreach ($args as $arg) {
$parse = explode('=', $arg);
if (!isset($parse[1])) {
$parsed[$parse[0]] = true;
} else {
$parsed[$parse[0]] = $parse[1];
}
}
return $parsed;
}
}