Completed
Branch master (f7eb77)
by Tomáš
03:26
created

SniffNaming::guessClassByCode()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 25
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 4.128

Importance

Changes 0
Metric Value
dl 0
loc 25
ccs 12
cts 15
cp 0.8
rs 8.5806
c 0
b 0
f 0
cc 4
eloc 14
nc 4
nop 1
crap 4.128
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\Sniff\Naming;
9
10
use Nette\Utils\Strings;
11
use Symplify\PHP7_CodeSniffer\Exception\Sniff\Naming\InvalidSniffClassException;
12
use Symplify\PHP7_CodeSniffer\Exception\Sniff\Naming\InvalidSniffCodeException;
13
use Symplify\PHP7_CodeSniffer\Exception\Sniff\Naming\SniffClassCouldNotBeFoundException;
14
15
final class SniffNaming
16
{
17 5
    public static function guessClassByCode(string $sniffCode) : string
18
    {
19 5
        self::ensureSniffCodeIsValid($sniffCode);
20
21 4
        $parts = explode('.', $sniffCode);
22
23 4
        $firstGuess = $parts[0].'CodingStandard\\Sniffs\\'.$parts[1].'\\'.$parts[2].'Sniff';
24 4
        if (class_exists($firstGuess)) {
25
            return $firstGuess;
26
        }
27
28 4
        $secondGuess = $parts[0].'\\CodingStandard\\Sniffs\\'.$parts[1].'\\'.$parts[2].'Sniff';
29 4
        if (class_exists($secondGuess)) {
30
            return $secondGuess;
31
        }
32
33 4
        $thirdGuess = 'PHP_CodeSniffer\\Standards\\'.$parts[0]
34 4
            .'\\Sniffs\\'.$parts[1].'\\'.$parts[2].'Sniff';
35
36 4
        if (class_exists($thirdGuess)) {
37 3
            return $thirdGuess;
38
        }
39
40 1
        self::reportClassCouldNotBeFound($sniffCode, [$firstGuess, $secondGuess, $thirdGuess]);
41
    }
42
43 9
    public static function guessCodeByClass(string $sniffClass) : string
44
    {
45 9
        self::ensureClassNameIsValid($sniffClass);
46
47 8
        $parts = explode('\\', $sniffClass);
48
49 8
        $standardName = $parts[count($parts)-4];
50 8
        if (Strings::endsWith($standardName, 'CodingStandard')) {
51
            $standardName = substr($standardName, 0, -strlen('CodingStandard'));
52
        }
53
54 8
        $categoryName = $parts[count($parts)-2];
55
56 8
        $sniffName = $parts[count($parts)-1];
57 8
        $sniffName = substr($sniffName, 0, -strlen('Sniff'));
58
59 8
        return $standardName.'.'.$categoryName.'.'.$sniffName;
60
    }
61
62 5
    private static function ensureSniffCodeIsValid(string $sniffCode)
63
    {
64 5
        $parts = explode('.', $sniffCode);
65
66 5
        if (count($parts) !== 3) {
67 1
            throw new InvalidSniffCodeException(
68
                sprintf(
69 1
                    '"%s" is not valid sniff code. Code in form "%s" is expected.',
70
                    $sniffCode,
71 1
                    'Standard.Category.Specific'
72
                )
73
            );
74
        }
75 4
    }
76
77 9
    private static function ensureClassNameIsValid(string $sniffClass)
78
    {
79 9
        $parts = explode('\\', $sniffClass);
80
81 9
        if (count($parts) < 4) {
82 1
            throw new InvalidSniffClassException(sprintf(
83 1
                '"%s" is not valid sniff class name. Name in form "%s" or "%s" is expected.',
84
                $sniffClass,
85 1
                '<Name>CodingStandard\Sniffs\<Category>\<Name>Sniff',
86 1
                '<Name>\CodingStandard\Sniffs\<Category>\<Name>Sniff'
87
            ));
88
        }
89 8
    }
90
91 1
    private static function reportClassCouldNotBeFound(string $sniffCode, array $guessedClasses)
92
    {
93 1
        throw new SniffClassCouldNotBeFoundException(sprintf(
94 1
            'Sniff class for code "%s" could not be found. We tried:'.PHP_EOL.' - %s ',
95
            $sniffCode,
96 1
            implode(PHP_EOL . ' - ', $guessedClasses)
97
        ));
98
    }
99
}
100