Passed
Push — master ( 35e88b...60b488 )
by Paul
17:33 queued 08:42
created

Backtrace::getClassName()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 14
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 5.0144

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 14
ccs 11
cts 12
cp 0.9167
rs 9.6111
c 0
b 0
f 0
cc 5
nc 4
nop 1
crap 5.0144
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Modules;
4
5
use GeminiLabs\SiteReviews\Helper;
6
use GeminiLabs\SiteReviews\Helpers\Arr;
7
use GeminiLabs\SiteReviews\Helpers\Str;
8
9
class Backtrace
10
{
11
    /**
12
     * @return string
13
     */
14 14
    public function buildLine(array $backtrace)
15
    {
16 14
        return sprintf('%s:%s', $this->getClassName($backtrace), $this->getLineNumber($backtrace));
17
    }
18
19
    /**
20
     * @param int $limit
21
     * @return void|string
22
     */
23 14
    public function line($limit = 10)
24
    {
25 14
        return $this->buildLine(array_slice($this->trace($limit), 4));
26
    }
27
28
    /**
29
     * @param \Throwable|mixed $data
30
     * @return string
31
     */
32
    public function lineFromData($data)
33
    {
34
        $backtrace = ((interface_exists('Throwable') && $data instanceof \Throwable) || $data instanceof \Exception)
35
            ? $data->getTrace()
36
            : debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
37
        return $this->buildLine($backtrace);
38
    }
39
40
    /**
41
     * @param string $line
42
     * @return string
43
     */
44 14
    public function normalizeLine($line)
45
    {
46
        $search = [
47 14
            'GeminiLabs\\SiteReviews\\',
48 14
            glsr()->path('plugin/'),
49 14
            glsr()->path('plugin/', false),
50 14
            trailingslashit(glsr()->path()),
51 14
            trailingslashit(glsr()->path('', false)),
52 14
            WP_CONTENT_DIR,
53 14
            ABSPATH,
54
        ];
55 14
        return str_replace(array_unique($search), '', $line);
56
    }
57
58
    /**
59
     * @param int $limit
60
     * @return array
61
     */
62 14
    public function trace($limit = 6)
63
    {
64 14
        return debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $limit);
65
    }
66
67
    /**
68
     * @return string
69
     */
70 14
    protected function getClassName(array $backtrace)
71
    {
72 14
        $file = Arr::get($backtrace, '0.file');
73 14
        $class = Arr::get($backtrace, '1.class');
74 14
        $search = Arr::searchByKey('glsr_log', $backtrace, 'function');
75 14
        if (false !== $search) {
76
            $class = Arr::get($search, 'class', Arr::get($search, 'file'));
77 14
        } elseif (Str::endsWith('helpers.php', $file)) {
78 7
            $file = Arr::get($backtrace, '1.file');
79 7
            $class = Arr::get($backtrace, '2.class');
80 14
        } elseif (Str::endsWith('BlackHole.php', $file) && 'WP_Hook' !== Arr::get($backtrace, '2.class')) {
81 7
            $class = Arr::get($backtrace, '2.class');
82
        }
83 14
        return Helper::ifEmpty($class, $file);
84
    }
85
86
    /**
87
     * @return string
88
     */
89 14
    protected function getLineNumber(array $backtrace)
90
    {
91 14
        $search = Arr::searchByKey('glsr_log', $backtrace, 'function');
92 14
        if (false !== $search) {
93
            return Arr::get($search, 'line');
94
        }
95 14
        $file = Arr::get($backtrace, '0.file');
96 14
        $line = Arr::get($backtrace, '0.line');
97 14
        if (Str::endsWith('helpers.php', $file)) {
98 7
            return Arr::get($backtrace, '1.line');
99
        }
100 14
        elseif (Str::endsWith('BlackHole.php', $file) && 'WP_Hook' !== Arr::get($backtrace, '2.class')) {
101 7
            return Arr::get($backtrace, '1.line');
102
        }
103 14
        return $line;
104
    }
105
}
106