1: <?php
2: namespace Peridot\WebDriverManager\Console;
3:
4: use Peridot\WebDriverManager\Binary\BinaryInterface;
5: use Symfony\Component\Console\Helper\ProgressBar;
6: use Symfony\Component\Console\Input\InputArgument;
7: use Symfony\Component\Console\Input\InputInterface;
8: use Symfony\Component\Console\Output\OutputInterface;
9:
10: 11: 12: 13: 14:
15: class UpdateCommand extends AbstractManagerCommand
16: {
17: protected function configure()
18: {
19: $this
20: ->setName('update')
21: ->setDescription('Download or update Selenium Server and drivers')
22: ->addArgument(
23: 'name',
24: InputArgument::OPTIONAL,
25: 'Update a specific binary with the given name'
26: );
27: }
28:
29: 30: 31: 32: 33:
34: protected function execute(InputInterface $input, OutputInterface $output)
35: {
36: $name = $input->getArgument('name') ?: '';
37: $this->update($output, $name);
38: return 0;
39: }
40:
41: 42: 43: 44: 45: 46: 47:
48: protected function update(OutputInterface $output, $name)
49: {
50: $output->writeln("<info>{$this->getPreMessage($name)}</info>");
51: $this->watchProgress($output);
52: $pending = $this->manager->getPendingBinaries();
53:
54: $this->manager->update($name);
55:
56: $output->writeln("<info>{$this->getPostMessage($pending, $name)}</info>");
57: }
58:
59: 60: 61: 62: 63: 64:
65: protected function watchProgress(OutputInterface $output)
66: {
67: $progress = new ProgressBar($output);
68: $progress->setFormat('%bar% (%percent%%)');
69: $this->manager->on('request.start', function ($url, $bytes) use ($progress, $output) {
70: $output->writeln('<comment>Downloading ' . basename($url) . '</comment>');
71: $progress->start($bytes);
72: });
73: $this->manager->on('progress', function ($transferred) use ($progress) {
74: $progress->setProgress($transferred);
75: });
76: $this->manager->on('complete', function () use ($progress, $output) {
77: $progress->finish();
78: $output->writeln('');
79: });
80: }
81:
82: 83: 84: 85: 86: 87:
88: protected function getPreMessage($name)
89: {
90: $binaries = $this->manager->getBinaries();
91: $message = 'Ensuring binaries are up to date';
92: $isSingleUpdate = $name && array_key_exists($name, $binaries);
93:
94: if (! $isSingleUpdate) {
95: return $message;
96: }
97:
98: $binary = $binaries[$name];
99: return $binary->isSupported() ? "Updating {$binary->getName()}" : "{$binary->getName()} is not supported by your system";
100: }
101:
102: 103: 104: 105: 106: 107: 108:
109: protected function getPostMessage(array $pending, $name)
110: {
111: if ($name) {
112: $pending = array_filter($pending, function (BinaryInterface $binary) use ($name) {
113: return $binary->getName() === $name;
114: });
115: }
116:
117: $count = array_reduce($pending, function ($r, BinaryInterface $binary) {
118: if ($binary->exists($this->manager->getInstallPath())) {
119: $r++;
120: }
121: return $r;
122: }, 0);
123:
124: return $this->getResultString($count);
125: }
126:
127: 128: 129: 130: 131: 132:
133: protected function getResultString($count)
134: {
135: if ($count == 0) {
136: return 'Nothing to update';
137: }
138:
139: $label = $count > 1 ? 'binaries' : 'binary';
140:
141: return "$count $label updated";
142: }
143: }
144: