Test Failed
Push — master ( 857c27...82742e )
by Marius
01:45
created

PhpStormHelperApplication::createZippy()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 0
cts 6
cp 0
rs 9.9
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Paysera\PhpStormHelper;
6
7
use Alchemy\Zippy\Adapter\AdapterContainer;
8
use Alchemy\Zippy\FileStrategy\ZipFileStrategy;
9
use Alchemy\Zippy\Zippy;
10
use GuzzleHttp\Client;
11
use Humbug\SelfUpdate\Strategy\GithubStrategy;
12
use Humbug\SelfUpdate\Updater;
13
use Paysera\PhpStormHelper\Command\ConfigureCommand;
14
use Paysera\PhpStormHelper\Command\ConfigureInstallationCommand;
15
use Paysera\PhpStormHelper\Command\SelfUpdateCommand;
16
use Paysera\PhpStormHelper\Entity\SourceFolder;
17
use Paysera\PhpStormHelper\Service\ConfigurationOptionFinder;
18
use Paysera\PhpStormHelper\Service\DirectoryResolver;
19
use Paysera\PhpStormHelper\Service\DomHelper;
20
use Paysera\PhpStormHelper\Service\ExternalToolsConfigurationHelper;
21
use Paysera\PhpStormHelper\Service\GitignoreHelper;
22
use Paysera\PhpStormHelper\Service\PluginDownloader;
23
use Paysera\PhpStormHelper\Service\SourceFolderHelper;
24
use Paysera\PhpStormHelper\Service\StructureConfigurator;
25
use Paysera\PhpStormHelper\Service\WorkspaceConfigurationHelper;
26
use Symfony\Component\Console\Application;
27
use Symfony\Component\Filesystem\Filesystem;
28
29
class PhpStormHelperApplication extends Application
30
{
31
    public function __construct()
32
    {
33
        parent::__construct('phpstorm-helper', '@application_version@');
34
35
        $filesystem = new Filesystem();
36
        $domHelper = new DomHelper();
37
        $configurationOptionFinder = new ConfigurationOptionFinder($domHelper);
38
39
        $this->addCommands([
40
            new ConfigureCommand(
41
                new StructureConfigurator($filesystem),
42
                new GitignoreHelper($filesystem, [
43
                    file_get_contents(__DIR__ . '/Resources/gitignore-rules.txt'),
44
                ]),
45
                $configurationOptionFinder,
46
                new WorkspaceConfigurationHelper($domHelper, $filesystem),
47
                new SourceFolderHelper($configurationOptionFinder, $this->createDefaultSourceFolders())
48
            ),
49
            new ConfigureInstallationCommand(
50
                new ExternalToolsConfigurationHelper(new DirectoryResolver(), $filesystem, $domHelper),
51
                new PluginDownloader(new DirectoryResolver(), $this->createZippy(), new Client(), $filesystem)
52
            ),
53
            $this->createSelfUpdateCommand(),
54
        ]);
55
    }
56
57
    private function createZippy()
58
    {
59
        $adapters = AdapterContainer::load();
60
61
        // Avoid using ProcessBuilder as 4.x version is not supported in zippy
62
        $adapters['Alchemy\\Zippy\\Adapter\\ZipAdapter'] = $adapters['Alchemy\\Zippy\\Adapter\\ZipExtensionAdapter'];
63
64
        $zippy = new Zippy($adapters);
65
        $zippy->addStrategy(new ZipFileStrategy($adapters));
66
        return $zippy;
67
    }
68
69
    private function createSelfUpdateCommand(): SelfUpdateCommand
70
    {
71
        $strategy = new GithubStrategy();
72
        $strategy->setCurrentLocalVersion('@application_version@');
73
        $strategy->setPharName('phpstorm-helper.phar');
74
        $strategy->setPackageName('paysera/util-phpstorm-helper');
75
76
        $updater = new Updater(null, false);
77
        $updater->setStrategyObject($strategy);
78
79
        return new SelfUpdateCommand($updater);
80
    }
81
82
    private function createDefaultSourceFolders(): array
83
    {
84
        return [
85
            new SourceFolder('src', SourceFolder::TYPE_SOURCE),
86
            new SourceFolder('app', SourceFolder::TYPE_SOURCE),
87
            new SourceFolder('tests', SourceFolder::TYPE_TEST_SOURCE),
88
            new SourceFolder('vendor', SourceFolder::TYPE_EXCLUDED),
89
            new SourceFolder('app/cache', SourceFolder::TYPE_EXCLUDED),
90
            new SourceFolder('app/logs', SourceFolder::TYPE_EXCLUDED),
91
            new SourceFolder('app/uploads', SourceFolder::TYPE_EXCLUDED),
92
            new SourceFolder('var', SourceFolder::TYPE_EXCLUDED),
93
            new SourceFolder('web/compiled', SourceFolder::TYPE_EXCLUDED),
94
            new SourceFolder('public/compiled', SourceFolder::TYPE_EXCLUDED),
95
        ];
96
    }
97
}
98