Completed
Push — master ( bdcf7d...eb1b80 )
by Tomáš
05:51
created

Router::getClassFromSniffCode()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3.0175

Importance

Changes 0
Metric Value
dl 0
loc 15
ccs 7
cts 8
cp 0.875
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 8
nc 3
nop 1
crap 3.0175
1
<?php
2
3
/*
4
 * This file is part of Symplify
5
 * Copyright (c) 2016 Tomas Votruba (http://tomasvotruba.cz).
6
 */
7
8
namespace Symplify\PHP7_CodeSniffer\Ruleset\Routing;
9
10
use Symplify\PHP7_CodeSniffer\Sniff\Finder\SniffFinder;
11
12
final class Router
13
{
14
    /**
15
     * @var SniffFinder
16
     */
17
    private $sniffFinder;
18
19
    /**
20
     * @var string[]
21
     */
22
    private $foundClasses = [];
23
24 9
    public function __construct(SniffFinder $sniffFinder)
25
    {
26 9
        $this->sniffFinder = $sniffFinder;
27 9
    }
28
29 6
    public function getClassFromSniffCode(string $sniffCode) : string
30
    {
31 6
        $sniffCode = $this->normalizeToSniffClassCode($sniffCode);
32
33 6
        if (isset($this->foundClasses[$sniffCode])) {
34
            return $this->foundClasses[$sniffCode];
35
        }
36
37 6
        $sniffClasses = $this->sniffFinder->findAllSniffClasses();
38 6
        if (isset($sniffClasses[$sniffCode])) {
39 5
            return $sniffClasses[$sniffCode];
40
        }
41
42 1
        return $this->foundClasses[$sniffCode] = $this->findClosesMatch($sniffClasses, $sniffCode);
43
    }
44
45 1
    private function findClosesMatch(array $sniffClasses, string $seekedSniffCode)
46
    {
47 1
        $shortestDistance = -1;
48 1
        $closest = '';
49 1
        foreach ($sniffClasses as $sniffCode => $sniffClass) {
50 1
            $levenshtein = levenshtein($seekedSniffCode, $sniffClass);
51 1
            if ($levenshtein <= $shortestDistance || $shortestDistance < 0) {
52 1
                $closest = $sniffClass;
53 1
                $shortestDistance = $levenshtein;
54
            }
55
        }
56
57 1
        if ($shortestDistance <= 30) {
58
            return $closest;
59
        }
60
61 1
        return '';
62
    }
63
64 6
    private function normalizeToSniffClassCode(string $sniffCode) : string
65
    {
66 6
        $parts = explode('.', $sniffCode);
67 6
        if (count($parts) === 4) {
68 4
            return $parts[0].'.'.$parts[1].'.'.$parts[2];
69
        }
70
71 6
        return $sniffCode;
72
    }
73
}
74