Completed
Push — master ( 9d9756...cd6f4c )
by Adam
03:08
created

PackagesExtension::beforeCompile()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 14
ccs 6
cts 6
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 0
crap 2
1
<?php
2
/**
3
 * PackagesExtension.php
4
 *
5
 * @copyright      More in license.md
6
 * @license        https://www.ipublikuj.eu
7
 * @author         Adam Kadlec <[email protected]>
8
 * @package        iPublikuj:Packages!
9
 * @subpackage     DI
10
 * @since          1.0.0
11
 *
12
 * @date           27.05.16
13
 */
14
15
declare(strict_types = 1);
16
17
namespace IPub\Packages\DI;
18
19
use Nette;
20
use Nette\DI;
21
22
use Kdyby\Console;
23
24
use IPub\Packages;
25
use IPub\Packages\Commands;
26
use IPub\Packages\Helpers;
27
use IPub\Packages\Loaders;
28
use IPub\Packages\Repository;
29
30
/**
31
 * Packages extension container
32
 *
33
 * @package        iPublikuj:Packages!
34
 * @subpackage     DI
35
 *
36
 * @author         Adam Kadlec <[email protected]>
37
 */
38 1
final class PackagesExtension extends DI\CompilerExtension
39
{
40
	/**
41
	 * Extension default configuration
42
	 *
43
	 * @var array
44
	 */
45
	private $defaults = [
46
		'path'       => NULL,                        // Paths where to search for packages
47
		'dirs'       => [                            // Define path to folders
48
			'configDir' => '%appDir%/config',        // Path where is stored app configuration
49
			'vendorDir' => '%appDir%/../vendor',     // Path to composer vendor folder
50
			'tempDir'   => '%tempDir%',              // Path to temporary folder
51
		],
52
		'configFile' => 'config.neon',               // Filename with enabled packages extensions
53
		'loader'     => [
54
			'packageFiles' => [
55
				'package.php',
56
			],
57
		],
58
		'sources'    => [],
59
	];
60
61
	/**
62
	 * @return void
63
	 */
64
	public function loadConfiguration() : void
65
	{
66
		// Get container builder
67 1
		$builder = $this->getContainerBuilder();
68
		// Get extension configuration
69 1
		$configuration = $this->getConfig($this->defaults);
70
71
		/**
72
		 * Load packages configuration
73
		 */
74
75 1
		$builder->parameters['packages'] = [];
76
77 1
		if (is_file($configuration['dirs']['configDir'] . DIRECTORY_SEPARATOR . 'packages.php')) {
78
			$packages = require $configuration['dirs']['configDir'] . DIRECTORY_SEPARATOR . 'packages.php';
79
80
			foreach ($packages as $name => $data) {
81
				$builder->parameters['packages'][$name] = $data;
82
			}
83
		}
84
85
		/**
86
		 * Register services
87
		 */
88
89 1
		$builder->addDefinition($this->prefix('loader'))
90 1
			->setType(Loaders\Loader::class)
91 1
			->setArguments([
92 1
				'packageFiles'    => $configuration['loader']['packageFiles'],
93 1
				'metadataSources' => $configuration['sources'],
94 1
				'vendorDir'       => $configuration['dirs']['vendorDir'],
95
			])
96 1
			->addTag('cms.packages');
97
98 1
		$repository = $builder->addDefinition($this->prefix('repository'))
99 1
			->setType(Repository\Repository::class)
100 1
			->addTag('cms.packages');
101
102 1
		if ($configuration['path']) {
103
			$repository->addSetup('addPath', [$configuration['path']]);
104
		}
105
106 1
		$builder->addDefinition($this->prefix('manager'))
107 1
			->setType(Packages\PackagesManager::class)
108 1
			->setArguments([
109 1
				'vendorDir' => $configuration['dirs']['vendorDir'],
110 1
				'configDir' => $configuration['dirs']['configDir'],
111
			])
112 1
			->addTag('cms.packages');
113
114 1
		$builder->addDefinition($this->prefix('pathResolver'))
115 1
			->setType(Helpers\PathResolver::class)
116 1
			->addTag('cms.packages');
117
118 1
		$builder->addDefinition($this->prefix('scripts.configuration'))
119 1
			->setType(Packages\Scripts\ConfigurationScript::class)
120 1
			->setArguments([
121 1
				'configDir'  => $configuration['dirs']['configDir'],
122 1
				'configFile' => $configuration['configFile'],
123
			])
124 1
			->addTag('cms.packages');
125
126
		// Define all console commands
127
		$commands = [
128 1
			'packagesSync'     => Commands\SyncCommand::class,
129
			'packagesList'     => Commands\ListCommand::class,
130
			'packageEnable'    => Commands\EnableCommand::class,
131
			'packageDisable'   => Commands\DisableCommand::class,
132
			'packageInstall'   => Commands\InstallCommand::class,
133
			'packageUninstall' => Commands\UninstallCommand::class,
134
		];
135
136 1
		foreach ($commands as $name => $cmd) {
137 1
			$builder->addDefinition($this->prefix('commands' . lcfirst($name)))
138 1
				->setType($cmd)
139 1
				->addTag(Console\DI\ConsoleExtension::TAG_COMMAND);
140
		}
141 1
	}
142
143
	/**
144
	 * {@inheritdoc}
145
	 */
146
	public function beforeCompile() : void
147
	{
148 1
		parent::beforeCompile();
149
150
		// Get container builder
151 1
		$builder = $this->getContainerBuilder();
152
153
		// Get packages manager
154 1
		$manager = $builder->getDefinition($this->prefix('manager'));
155
156 1
		foreach ($builder->findByType(Packages\Scripts\IScript::class) as $serviceDefinition) {
157 1
			$manager->addSetup('addScript', [$serviceDefinition->getType(), $serviceDefinition]);
158
		}
159 1
	}
160
161
	/**
162
	 * @param Nette\Configurator $config
163
	 * @param string $extensionName
164
	 *
165
	 * @return void
166
	 */
167
	public static function register(Nette\Configurator $config, string $extensionName = 'packages') : void
168
	{
169 1
		$config->onCompile[] = function (Nette\Configurator $config, Nette\DI\Compiler $compiler) use ($extensionName) {
170 1
			$compiler->addExtension($extensionName, new PackagesExtension());
171 1
		};
172 1
	}
173
}
174