Completed
Push — master ( 0bbdc9...71399c )
by Adam
01:51
created

PackagesExtension::beforeCompile()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14

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