Completed
Push — master ( b9bd0c...5cd7db )
by Sebastien
08:53
created

Cerbere   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 184
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 5
Bugs 0 Features 2
Metric Value
wmc 19
c 5
b 0
f 2
lcom 1
cbo 6
dl 0
loc 184
rs 10

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A addLoggerListener() 0 6 1
A getDispatcher() 0 8 2
A setDispatcher() 0 6 1
A addParser() 0 6 1
A getParser() 0 8 2
A run() 0 20 1
A getProjectsFromPatterns() 0 10 2
A getProjectsFromPattern() 0 19 4
A getFilesFromPattern() 0 12 3
A getParsers() 0 4 1
1
<?php
2
3
namespace Cerbere;
4
5
use Cerbere\Action\ActionInterface;
6
use Cerbere\Event\CerbereEvents;
7
use Cerbere\Event\CerbereFileDiscoverEvent;
8
use Cerbere\Event\CerbereLoggerListener;
9
use Cerbere\Model\Job;
10
use Cerbere\Model\Project;
11
use Cerbere\Parser\ParserInterface;
12
use Symfony\Component\EventDispatcher\EventDispatcher;
13
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
14
15
/**
16
 * Class Cerbere
17
 *
18
 * @package Cerbere
19
 */
20
class Cerbere
21
{
22
    /**
23
     * @var ParserInterface[]
24
     */
25
    protected $parsers = array();
26
27
    /**
28
     * @var EventDispatcherInterface
29
     */
30
    protected $dispatcher;
31
32
    /**
33
     */
34
    public function __construct()
35
    {
36
    }
37
38
    /**
39
     * @param CerbereLoggerListener $listener
40
     *
41
     * @return $this
42
     */
43
    public function addLoggerListener(CerbereLoggerListener $listener)
44
    {
45
        $this->getDispatcher()->addSubscriber($listener);
46
47
        return $this;
48
    }
49
50
    /**
51
     * Gets the dispatcher used by this library to dispatch events.
52
     *
53
     * @return EventDispatcherInterface
54
     */
55
    public function getDispatcher()
56
    {
57
        if (!isset($this->dispatcher)) {
58
            $this->dispatcher = new EventDispatcher();
59
        }
60
61
        return $this->dispatcher;
62
    }
63
64
    /**
65
     * Sets the dispatcher used by this library to dispatch events.
66
     *
67
     * @param EventDispatcherInterface $dispatcher
68
     *   The Symfony event dispatcher object.
69
     *
70
     * @return $this
71
     */
72
    public function setDispatcher(EventDispatcherInterface $dispatcher)
73
    {
74
        $this->dispatcher = $dispatcher;
75
76
        return $this;
77
    }
78
79
    /**
80
     * @param ParserInterface $parser
81
     *
82
     * @return $this
83
     */
84
    public function addParser(ParserInterface $parser)
85
    {
86
        $this->parsers[$parser->getCode()] = $parser;
87
88
        return $this;
89
    }
90
91
    /**
92
     * @param string $code
93
     *
94
     * @return ParserInterface|null
95
     */
96
    public function getParser($code)
97
    {
98
        if (isset($this->parsers[$code])) {
99
            return $this->parsers[$code];
100
        }
101
102
        return null;
103
    }
104
105
    /**
106
     * @param Job             $job
107
     * @param ActionInterface $action
108
     * @param array           $options
109
     *
110
     * @return array
111
     */
112
    public function run(Job $job, ActionInterface $action, $options = array())
113
    {
114
        // Download remote project if remote.
115
        $dir = $job->checkoutRepository();
116
117
        // Move to project folder.
118
        $currentDirectory = getcwd();
119
        chdir($dir);
120
121
        // Load projects from repository.
122
        $projects = $this->getProjectsFromPatterns($job->getPatterns(), $job->isPatternNested());
123
124
        // Do cerbere action.
125
        $report = $action->process($projects, $options);
126
127
        // Restore initial directory.
128
        chdir($currentDirectory);
129
130
        return $report;
131
    }
132
133
    /**
134
     * @param array      $patterns
135
     * @param bool|false $nested
136
     *
137
     * @return Project[]
138
     */
139
    public function getProjectsFromPatterns($patterns, $nested = false)
140
    {
141
        $projects = array();
142
143
        foreach ($patterns as $pattern) {
144
            $projects = array_merge($projects, $this->getProjectsFromPattern($pattern, $nested));
145
        }
146
147
        return $projects;
148
    }
149
150
    /**
151
     * @param string     $pattern
152
     * @param bool|false $nested
153
     *
154
     * @return Project[]
155
     */
156
    public function getProjectsFromPattern($pattern, $nested = false)
157
    {
158
        $projects   = array();
159
        $dispatcher = $this->getDispatcher();
160
        $files      = $this->getFilesFromPattern($pattern, $nested);
161
162
        foreach ($files as $file) {
163
            foreach ($this->getParsers() as $parser) {
164
                if ($parser->supportedFile($file)) {
165
                    $event = new CerbereFileDiscoverEvent($this, $file, $parser);
166
                    $dispatcher->dispatch(CerbereEvents::APPLICATION_FILE_DISCOVERED, $event);
167
                    $parser->processFile($file);
168
                    $projects = array_merge($projects, $parser->getProjects());
169
                }
170
            }
171
        }
172
173
        return $projects;
174
    }
175
176
    /**
177
     * @param string $pattern
178
     * @param bool|false $nested
179
     * @param int $flags
180
     *
181
     * @return array
182
     */
183
    public function getFilesFromPattern($pattern, $nested = false, $flags = 0)
184
    {
185
        $files = glob($pattern, $flags);
186
187
        if ($nested) {
188
            foreach (glob(dirname($pattern) . '/*', GLOB_ONLYDIR | GLOB_NOSORT) as $dir) {
189
                $files = array_merge($files, $this->getFilesFromPattern($dir . '/' . basename($pattern), $nested, $flags));
190
            }
191
        }
192
193
        return $files;
194
    }
195
196
    /**
197
     * @return ParserInterface[]
198
     */
199
    public function getParsers()
200
    {
201
        return $this->parsers;
202
    }
203
}
204