SniffNaming   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 90
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 97.78%

Importance

Changes 0
Metric Value
wmc 12
lcom 1
cbo 4
dl 0
loc 90
ccs 44
cts 45
cp 0.9778
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A guessClassByCode() 0 20 3
A guessCodeByClass() 0 18 2
A isSniffCode() 0 5 1
A isSniffPartCode() 0 5 1
A ensureSniffCodeIsValid() 0 12 2
A ensureClassNameIsValid() 0 13 2
A reportClassCouldNotBeFound() 0 8 1
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 10
    public static function guessClassByCode(string $sniffCode) : string
18
    {
19 10
        self::ensureSniffCodeIsValid($sniffCode);
20
21 9
        $parts = explode('.', $sniffCode);
22
23
        $possibleClasses = [
24 9
            $parts[0].'CodingStandard\\Sniffs\\'.$parts[1].'\\'.$parts[2].'Sniff',
25 9
            $parts[0].'\\CodingStandard\\Sniffs\\'.$parts[1].'\\'.$parts[2].'Sniff',
26 9
            'PHP_CodeSniffer\\Standards\\'.$parts[0].'\\Sniffs\\'.$parts[1].'\\'.$parts[2].'Sniff',
27
        ];
28
29 9
        foreach ($possibleClasses as $possibleClass) {
30 9
            if (class_exists($possibleClass)) {
31 9
                return $possibleClass;
32
            }
33
        }
34
35 1
        self::reportClassCouldNotBeFound($sniffCode, $possibleClasses);
36
    }
37
38 19
    public static function guessCodeByClass(string $sniffClass) : string
39
    {
40 19
        self::ensureClassNameIsValid($sniffClass);
41
42 17
        $parts = explode('\\', $sniffClass);
43
44 17
        $standardName = $parts[count($parts)-4];
45 17
        if (Strings::endsWith($standardName, 'CodingStandard')) {
46 12
            $standardName = substr($standardName, 0, -strlen('CodingStandard'));
47
        }
48
49 17
        $categoryName = $parts[count($parts)-2];
50
51 17
        $sniffName = $parts[count($parts)-1];
52 17
        $sniffName = substr($sniffName, 0, -strlen('Sniff'));
53
54 17
        return $standardName.'.'.$categoryName.'.'.$sniffName;
55
    }
56
57 13
    public static function isSniffCode(string $possibleSniffCode) : bool
58
    {
59 13
        $parts = explode('.', $possibleSniffCode);
60 13
        return (count($parts) === 3);
61
    }
62
63 1
    public static function isSniffPartCode(string $possibleSniffPartCode) : bool
64
    {
65 1
        $parts = explode('.', $possibleSniffPartCode);
66 1
        return (count($parts) === 4);
67
    }
68
69 10
    private static function ensureSniffCodeIsValid(string $sniffCode)
70
    {
71 10
        if (!self::isSniffCode($sniffCode)) {
72 1
            throw new InvalidSniffCodeException(
73
                sprintf(
74 1
                    '"%s" is not valid sniff code. Code in form "%s" is expected.',
75
                    $sniffCode,
76 1
                    'Standard.Category.Specific'
77
                )
78
            );
79
        }
80 9
    }
81
82 19
    private static function ensureClassNameIsValid(string $sniffClass)
83
    {
84 19
        $parts = explode('\\', $sniffClass);
85
86 19
        if (count($parts) < 4) {
87 2
            throw new InvalidSniffClassException(sprintf(
88 2
                '"%s" is not valid sniff class name. Name in form "%s" or "%s" is expected.',
89
                $sniffClass,
90 2
                '<Name>CodingStandard\Sniffs\<Category>\<Name>Sniff',
91 2
                '<Name>\CodingStandard\Sniffs\<Category>\<Name>Sniff'
92
            ));
93
        }
94 17
    }
95
96 1
    private static function reportClassCouldNotBeFound(string $sniffCode, array $guessedClasses)
97
    {
98 1
        throw new SniffClassCouldNotBeFoundException(sprintf(
99 1
            'Sniff class for code "%s" could not be found. We tried:'.PHP_EOL.PHP_EOL.' - %s ',
100
            $sniffCode,
101 1
            implode(PHP_EOL . ' - ', $guessedClasses)
102
        ));
103
    }
104
}
105