1 | <?php |
||
19 | class LoadFeatureCommand extends ContainerAwareCommand |
||
20 | { |
||
21 | /** |
||
22 | * {@inheritdoc} |
||
23 | */ |
||
24 | 3 | protected function configure() |
|
41 | |||
42 | /** |
||
43 | * {@inheritdoc} |
||
44 | */ |
||
45 | 3 | public function execute(InputInterface $input, OutputInterface $output) |
|
46 | { |
||
47 | 3 | $container = $this->getContainer(); |
|
48 | 3 | $twig = $container->get('twig'); |
|
49 | 3 | $files = $this->getFinderInstance($input->getArgument('path')); |
|
50 | |||
51 | 3 | $found = []; |
|
52 | 3 | foreach ($files as $file) { |
|
53 | 1 | $tree = $twig->parse($twig->tokenize(new Twig_Source( |
|
54 | 1 | file_get_contents($file->getPathname()), |
|
55 | 1 | $file->getFilename(), |
|
56 | 1 | $file->getPathname() |
|
57 | 1 | ))); |
|
58 | 1 | $tags = $this->findFeatureNodes($tree); |
|
59 | |||
60 | 1 | if (empty($tags)) { |
|
61 | continue; |
||
62 | } |
||
63 | |||
64 | 1 | $found = array_merge($found, $tags); |
|
65 | |||
66 | 1 | foreach ($tags as $tag) { |
|
67 | 1 | $output->writeln(sprintf( |
|
68 | 1 | 'Found <info>%s</info>.<info>%s</info> in <info>%s</info>', |
|
69 | 1 | $tag['parent'], |
|
70 | 1 | $tag['name'], |
|
71 | 1 | $file->getFilename() |
|
72 | 1 | )); |
|
73 | 1 | } |
|
74 | 2 | } |
|
75 | |||
76 | 2 | if ($input->getOption('dry-run')) { |
|
77 | 1 | return; |
|
78 | } |
||
79 | |||
80 | 1 | $manager = $container->get('ae_feature.manager'); |
|
81 | 1 | foreach ($found as $tag) { |
|
82 | $manager->findOrCreate($tag['name'], $tag['parent']); |
||
83 | 1 | } |
|
84 | 1 | } |
|
85 | |||
86 | /** |
||
87 | * Find feature nodes. |
||
88 | * |
||
89 | * @param Twig_Node $node |
||
90 | * |
||
91 | * @return array |
||
92 | */ |
||
93 | 2 | private function findFeatureNodes(Twig_Node $node) |
|
94 | { |
||
95 | 1 | $found = []; |
|
96 | 1 | $stack = [$node]; |
|
97 | 1 | while ($stack) { |
|
|
|||
98 | 1 | $node = array_pop($stack); |
|
99 | 1 | if ($node instanceof FeatureNode) { |
|
100 | $arguments = $node |
||
101 | 2 | ->getNode('tests') |
|
102 | 1 | ->getNode(0) |
|
103 | 1 | ->getNode('arguments') |
|
104 | 1 | ->getKeyValuePairs(); |
|
105 | |||
106 | 1 | $tag = []; |
|
107 | 1 | foreach ($arguments as $argument) { |
|
108 | 1 | $keyAttr = $argument['key']->getAttribute('value'); |
|
109 | 1 | $valueAttr = $argument['value']->getAttribute('value'); |
|
110 | |||
111 | 1 | $tag[$keyAttr] = $valueAttr; |
|
112 | 1 | } |
|
113 | 1 | $key = md5(serialize($tag)); |
|
114 | 1 | $found[$key] = $tag; |
|
115 | 1 | } else { |
|
116 | 1 | foreach ($node as $child) { |
|
117 | 1 | if (null !== $child) { |
|
118 | 1 | $stack[] = $child; |
|
119 | 1 | } |
|
120 | 1 | } |
|
121 | } |
||
122 | 1 | } |
|
123 | |||
124 | 1 | return array_values($found); |
|
125 | } |
||
126 | |||
127 | /** |
||
128 | * Gets a Finder instance with required paths. |
||
129 | * |
||
130 | * @param array $dirsOrBundles Required directories or bundles |
||
131 | * |
||
132 | * @return Finder |
||
133 | */ |
||
134 | 3 | private function getFinderInstance(array $dirsOrBundles) |
|
159 | } |
||
160 |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.