Completed
Pull Request — master (#14)
by Steve
02:24
created

Machine   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 151
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 100%

Importance

Changes 4
Bugs 0 Features 1
Metric Value
wmc 11
c 4
b 0
f 1
lcom 1
cbo 1
dl 0
loc 151
ccs 45
cts 45
cp 1
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A executeQuietly() 0 8 1
A executeLoudly() 0 8 1
A setStartValues() 0 5 1
A executeCallback() 0 8 2
A executeMutedCallback() 0 9 2
A setEndValues() 0 5 1
A addOutputBufferToResult() 0 5 1
A execute() 0 7 1
1
<?php
2
3
namespace Scientist;
4
5
use Exception;
6
7
/**
8
 * Class Executor
9
 *
10
 * @package \Scientist
11
 */
12
class Machine
13
{
14
    /**
15
     * The callback to execute.
16
     *
17
     * @var callable
18
     */
19
    protected $callback;
20
21
    /**
22
     * Parameters to provide to the callback.
23
     *
24
     * @var array
25
     */
26
    protected $params = [];
27
28
    /**
29
     * Should exceptions be muted.
30
     *
31
     * @var boolean
32
     */
33
    protected $muted = false;
34
35
    /**
36
     * The result instance.
37
     *
38
     * @var \Scientist\Result
39
     */
40
    protected $result;
41
42
    /**
43
     * Inject machine dependencies.
44
     *
45
     * @param callable $callback
46
     * @param array    $params
47
     * @param boolean  $muted
48
     */
49 22
    public function __construct(callable $callback, array $params = [], $muted = false)
50
    {
51 22
        $this->callback = $callback;
52 22
        $this->params   = $params;
53 22
        $this->muted    = $muted;
54 22
        $this->result   = new Result;
55
56 22
    }
57
58
    /**
59
     * Execute the callback and retrieve a result. Any output from
60
     * echo commands will be intercepted and stored in the result.
61
     *
62
     * @return \Scientist\Result
63
     */
64 16
    public function executeQuietly()
65
    {
66 16
        ob_start();
67 16
        $this->execute();
68 16
        ob_end_clean();
69
70 16
        return $this->result;
71
    }
72
73
    /**
74
     * Execute the callback and retrieve a result. Any output from
75
     * echo commands will be output as normal.
76
     *
77
     * @return Result
78
     */
79 12
    public function executeLoudly()
80
    {
81 12
        ob_start();
82 12
        $this->execute();
83 12
        ob_end_flush();
84
85 12
        return $this->result;
86
    }
87
88
    /**
89
     * Set values before callback is executed.
90
     *
91
     * @return void
92
     */
93 19
    protected function setStartValues()
94
    {
95 19
        $this->result->setStartTime(microtime(true));
96 19
        $this->result->setStartMemory(memory_get_usage());
97 19
    }
98
99
    /**
100
     * Execute the callback with parameters.
101
     *
102
     * @return void
103
     */
104 19
    protected function executeCallback()
105
    {
106 19
        if ($this->muted) {
107 11
            return $this->executeMutedCallback();
108
        }
109
110 17
        $this->result->setValue(call_user_func_array($this->callback, $this->params));
111 17
    }
112
113
    /**
114
     * Execute the callback, but swallow exceptions.
115
     *
116
     * @return void
117
     */
118 11
    protected function executeMutedCallback()
119
    {
120
        try {
121 11
            $this->result->setValue(call_user_func_array($this->callback, $this->params));
122 11
        } catch (Exception $exception) {
123 2
            $this->result->setException($exception);
124 2
            $this->result->setValue(null);
125
        }
126 11
    }
127
128
    /**
129
     * Set values after the callback has executed.
130
     *
131
     * @return void
132
     */
133 19
    protected function setEndValues()
134
    {
135 19
        $this->result->setEndTime(microtime(true));
136 19
        $this->result->setEndMemory(memory_get_usage());
137 19
    }
138
139
    /**
140
     * Flushes & cleans the buffer and adds this to the result.
141
     *
142
     * @return void
143
     */
144 19
    protected function addOutputBufferToResult()
145
    {
146 19
        $echoedOutput = ob_get_contents();
147 19
        $this->result->setEchoValue($echoedOutput);
148 19
    }
149
150
    /**
151
     * Execute the callback and build the result
152
     *
153
     * @return void
154
     */
155 19
    protected function execute()
156
    {
157 19
        $this->setStartValues();
158 19
        $this->executeCallback();
159 19
        $this->setEndValues();
160 19
        $this->addOutputBufferToResult();
161 19
    }
162
}
163