4 * This file is part of the Behat.
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 namespace Behat\Behat\Definition\ServiceContainer;
13 use Behat\Behat\Context\ServiceContainer\ContextExtension;
14 use Behat\Testwork\Argument\ServiceContainer\ArgumentExtension;
15 use Behat\Behat\Gherkin\ServiceContainer\GherkinExtension;
16 use Behat\Testwork\Cli\ServiceContainer\CliExtension;
17 use Behat\Testwork\Environment\ServiceContainer\EnvironmentExtension;
18 use Behat\Testwork\ServiceContainer\Extension;
19 use Behat\Testwork\ServiceContainer\ExtensionManager;
20 use Behat\Testwork\ServiceContainer\ServiceProcessor;
21 use Behat\Testwork\Suite\ServiceContainer\SuiteExtension;
22 use Behat\Testwork\Translator\ServiceContainer\TranslatorExtension;
23 use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
24 use Symfony\Component\DependencyInjection\ContainerBuilder;
25 use Symfony\Component\DependencyInjection\Definition;
26 use Symfony\Component\DependencyInjection\Reference;
29 * Extends Behat with definition services.
31 * @author Konstantin Kudryashov <ever.zet@gmail.com>
33 final class DefinitionExtension implements Extension
38 const FINDER_ID = 'definition.finder';
39 const REPOSITORY_ID = 'definition.repository';
40 const PATTERN_TRANSFORMER_ID = 'definition.pattern_transformer';
41 const WRITER_ID = 'definition.writer';
42 const DEFINITION_TRANSLATOR_ID = 'definition.translator';
45 * Available extension points
47 const SEARCH_ENGINE_TAG = 'definition.search_engine';
48 const PATTERN_POLICY_TAG = 'definition.pattern_policy';
51 * @var ServiceProcessor
56 * Initializes compiler pass.
58 * @param null|ServiceProcessor $processor
60 public function __construct(ServiceProcessor $processor = null)
62 $this->processor = $processor ? : new ServiceProcessor();
68 public function getConfigKey()
76 public function initialize(ExtensionManager $extensionManager)
83 public function configure(ArrayNodeDefinition $builder)
90 public function load(ContainerBuilder $container, array $config)
92 $this->loadFinder($container);
93 $this->loadRepository($container);
94 $this->loadWriter($container);
95 $this->loadPatternTransformer($container);
96 $this->loadDefinitionTranslator($container);
97 $this->loadDefaultSearchEngines($container);
98 $this->loadDefaultPatternPolicies($container);
99 $this->loadAnnotationReader($container);
100 $this->loadDefinitionPrinters($container);
101 $this->loadController($container);
107 public function process(ContainerBuilder $container)
109 $this->processSearchEngines($container);
110 $this->processPatternPolicies($container);
114 * Loads definition finder.
116 * @param ContainerBuilder $container
118 private function loadFinder(ContainerBuilder $container)
120 $definition = new Definition('Behat\Behat\Definition\DefinitionFinder');
121 $container->setDefinition(self::FINDER_ID, $definition);
125 * Loads definition repository.
127 * @param ContainerBuilder $container
129 private function loadRepository(ContainerBuilder $container)
131 $definition = new Definition('Behat\Behat\Definition\DefinitionRepository', array(
132 new Reference(EnvironmentExtension::MANAGER_ID)
134 $container->setDefinition(self::REPOSITORY_ID, $definition);
138 * Loads definition writer.
140 * @param ContainerBuilder $container
142 private function loadWriter(ContainerBuilder $container)
144 $definition = new Definition('Behat\Behat\Definition\DefinitionWriter', array(
145 new Reference(EnvironmentExtension::MANAGER_ID),
146 new Reference(self::REPOSITORY_ID)
148 $container->setDefinition(self::WRITER_ID, $definition);
152 * Loads definition pattern transformer.
154 * @param ContainerBuilder $container
156 private function loadPatternTransformer(ContainerBuilder $container)
158 $definition = new Definition('Behat\Behat\Definition\Pattern\PatternTransformer');
159 $container->setDefinition(self::PATTERN_TRANSFORMER_ID, $definition);
163 * Loads definition translator.
165 * @param ContainerBuilder $container
167 private function loadDefinitionTranslator(ContainerBuilder $container)
169 $definition = new Definition('Behat\Behat\Definition\Translator\DefinitionTranslator', array(
170 new Reference(TranslatorExtension::TRANSLATOR_ID)
172 $container->setDefinition(self::DEFINITION_TRANSLATOR_ID, $definition);
176 * Loads default search engines.
178 * @param ContainerBuilder $container
180 private function loadDefaultSearchEngines(ContainerBuilder $container)
182 $definition = new Definition('Behat\Behat\Definition\Search\RepositorySearchEngine', array(
183 new Reference(self::REPOSITORY_ID),
184 new Reference(self::PATTERN_TRANSFORMER_ID),
185 new Reference(self::DEFINITION_TRANSLATOR_ID),
186 new Reference(ArgumentExtension::PREG_MATCH_ARGUMENT_ORGANISER_ID)
188 $definition->addTag(self::SEARCH_ENGINE_TAG, array('priority' => 50));
189 $container->setDefinition(self::SEARCH_ENGINE_TAG . '.repository', $definition);
193 * Loads default pattern policies.
195 * @param ContainerBuilder $container
197 private function loadDefaultPatternPolicies(ContainerBuilder $container)
199 $definition = new Definition('Behat\Behat\Definition\Pattern\Policy\TurnipPatternPolicy');
200 $definition->addTag(self::PATTERN_POLICY_TAG, array('priority' => 50));
201 $container->setDefinition(self::PATTERN_POLICY_TAG . '.turnip', $definition);
203 $definition = new Definition('Behat\Behat\Definition\Pattern\Policy\RegexPatternPolicy');
204 $definition->addTag(self::PATTERN_POLICY_TAG, array('priority' => 60));
205 $container->setDefinition(self::PATTERN_POLICY_TAG . '.regex', $definition);
209 * Loads definition annotation reader.
211 * @param ContainerBuilder $container
213 private function loadAnnotationReader(ContainerBuilder $container)
215 $definition = new Definition('Behat\Behat\Definition\Context\Annotation\DefinitionAnnotationReader');
216 $definition->addTag(ContextExtension::ANNOTATION_READER_TAG, array('priority' => 50));
217 $container->setDefinition(ContextExtension::ANNOTATION_READER_TAG . '.definition', $definition);
221 * Loads definition printers.
223 * @param ContainerBuilder $container
225 private function loadDefinitionPrinters(ContainerBuilder $container)
227 $definition = new Definition('Behat\Behat\Definition\Printer\ConsoleDefinitionInformationPrinter', array(
228 new Reference(CliExtension::OUTPUT_ID),
229 new Reference(self::PATTERN_TRANSFORMER_ID),
230 new Reference(self::DEFINITION_TRANSLATOR_ID),
231 new Reference(GherkinExtension::KEYWORDS_ID)
233 $container->setDefinition($this->getInformationPrinterId(), $definition);
235 $definition = new Definition('Behat\Behat\Definition\Printer\ConsoleDefinitionListPrinter', array(
236 new Reference(CliExtension::OUTPUT_ID),
237 new Reference(self::PATTERN_TRANSFORMER_ID),
238 new Reference(self::DEFINITION_TRANSLATOR_ID),
239 new Reference(GherkinExtension::KEYWORDS_ID)
241 $container->setDefinition($this->getListPrinterId(), $definition);
245 * Loads definition controller.
247 * @param ContainerBuilder $container
249 private function loadController(ContainerBuilder $container)
251 $definition = new Definition('Behat\Behat\Definition\Cli\AvailableDefinitionsController', array(
252 new Reference(SuiteExtension::REGISTRY_ID),
253 new Reference(self::WRITER_ID),
254 new Reference($this->getListPrinterId()),
255 new Reference($this->getInformationPrinterId())
257 $definition->addTag(CliExtension::CONTROLLER_TAG, array('priority' => 500));
258 $container->setDefinition(CliExtension::CONTROLLER_TAG . '.available_definitions', $definition);
262 * Processes all search engines in the container.
264 * @param ContainerBuilder $container
266 private function processSearchEngines(ContainerBuilder $container)
268 $references = $this->processor->findAndSortTaggedServices($container, self::SEARCH_ENGINE_TAG);
269 $definition = $container->getDefinition(self::FINDER_ID);
271 foreach ($references as $reference) {
272 $definition->addMethodCall('registerSearchEngine', array($reference));
277 * Processes all pattern policies.
279 * @param ContainerBuilder $container
281 private function processPatternPolicies(ContainerBuilder $container)
283 $references = $this->processor->findAndSortTaggedServices($container, self::PATTERN_POLICY_TAG);
284 $definition = $container->getDefinition(self::PATTERN_TRANSFORMER_ID);
286 foreach ($references as $reference) {
287 $definition->addMethodCall('registerPatternPolicy', array($reference));
292 * returns list printer service id.
296 private function getListPrinterId()
298 return 'definition.list_printer';
302 * Returns information printer service id.
306 private function getInformationPrinterId()
308 return 'definition.information_printer';