Completed
Push — master ( 5c84c5...c7f8f4 )
by Marius
01:51
created

PhpStormHelperApplication::createZippy()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 6
cts 6
cp 1
rs 9.9
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
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 5
    public function __construct()
32
    {
33 5
        parent::__construct('phpstorm-helper', '@application_version@');
34
35 5
        $filesystem = new Filesystem();
36 5
        $domHelper = new DomHelper();
37 5
        $configurationOptionFinder = new ConfigurationOptionFinder($domHelper);
38
39 5
        $this->addCommands([
40 5
            new ConfigureCommand(
41 5
                new StructureConfigurator($filesystem),
42 5
                new GitignoreHelper($filesystem, [
43 5
                    file_get_contents(__DIR__ . '/Resources/gitignore-rules.txt'),
44
                ]),
45 5
                $configurationOptionFinder,
46 5
                new WorkspaceConfigurationHelper($domHelper, $filesystem),
47 5
                new SourceFolderHelper($configurationOptionFinder, $this->createDefaultSourceFolders()),
48 5
                new Filesystem()
49
            ),
50 5
            new ConfigureInstallationCommand(
51 5
                new ExternalToolsConfigurationHelper(new DirectoryResolver(), $filesystem, $domHelper),
52 5
                new PluginDownloader(new DirectoryResolver(), $this->createZippy(), new Client(), $filesystem)
53
            ),
54 5
            $this->createSelfUpdateCommand(),
55
        ]);
56 5
    }
57
58 5
    private function createZippy()
59
    {
60 5
        $adapters = AdapterContainer::load();
61
62
        // Avoid using ProcessBuilder as 4.x version is not supported in zippy
63 5
        $adapters['Alchemy\\Zippy\\Adapter\\ZipAdapter'] = $adapters['Alchemy\\Zippy\\Adapter\\ZipExtensionAdapter'];
64
65 5
        $zippy = new Zippy($adapters);
66 5
        $zippy->addStrategy(new ZipFileStrategy($adapters));
67 5
        return $zippy;
68
    }
69
70 5
    private function createSelfUpdateCommand(): SelfUpdateCommand
71
    {
72 5
        $strategy = new GithubStrategy();
73 5
        $strategy->setCurrentLocalVersion('@application_version@');
74 5
        $strategy->setPharName('phpstorm-helper.phar');
75 5
        $strategy->setPackageName('paysera/util-phpstorm-helper');
76
77 5
        $updater = new Updater(null, false);
78 5
        $updater->setStrategyObject($strategy);
79
80 5
        return new SelfUpdateCommand($updater);
81
    }
82
83 5
    private function createDefaultSourceFolders(): array
84
    {
85
        return [
86 5
            new SourceFolder('src', SourceFolder::TYPE_SOURCE),
87 5
            new SourceFolder('app', SourceFolder::TYPE_SOURCE),
88 5
            new SourceFolder('tests', SourceFolder::TYPE_TEST_SOURCE),
89 5
            new SourceFolder('vendor', SourceFolder::TYPE_EXCLUDED),
90 5
            new SourceFolder('app/cache', SourceFolder::TYPE_EXCLUDED),
91 5
            new SourceFolder('app/logs', SourceFolder::TYPE_EXCLUDED),
92 5
            new SourceFolder('app/uploads', SourceFolder::TYPE_EXCLUDED),
93 5
            new SourceFolder('var', SourceFolder::TYPE_EXCLUDED),
94 5
            new SourceFolder('web/compiled', SourceFolder::TYPE_EXCLUDED),
95 5
            new SourceFolder('public/compiled', SourceFolder::TYPE_EXCLUDED),
96
        ];
97
    }
98
}
99