deeem/hexlet-psr-linter

This package is abandoned and no longer maintained. No replacement package was suggested.

v1.0 2016-08-16 19:35 UTC

This package is not auto-updated.

Last update: 2020-10-16 21:39:57 UTC


README

Build Status Code Climate Test Coverage Issue Count

About

Линтер, проверяющий php-код на соответствие некоторому набору правил и выводящий отчёт о нарушениях с возможностью исправить код (если функция для исправления описана в правиле). Проект в рамках стажировки на hexlet.io

Requirements

  • PHP >= 7.0
  • Composer

Install

  1. Установка клонированием git-репозитория
git clone https://github.com/deeem/hexlet-psr-linter
cd hexlet-psr-linter
make install
  1. Установка с использованием composer
composer require deeem/hexlet-psr-linter
  1. Установка с использованием composer.json
"require": {
    "deeem/hexlet-psr-linter": "*"
}

Использование командой строки

Например, проверка кода в директории myProject правилами, перечисленными в ruleset.json, загруженными из директории ~/mySniffs

bin/psr-linter myProject --sniffs ~/mySniffs --ruleset ruleset.json

Формат json-файла - обычный массив

[
  "FunctionsNamingForCamelCase",
  "VariablesNamingForCamelCase",
  "VariablesNamingForLeadUnderscore"
]

Дополнительные параметры описывает справка

bin/psr-linter --help

Для удобство вызова, в случае, если psr-linter установлен глобально, можно сделать ссылку на bin-файл

ln -s path-to-bin/psr-linter /usr/local/bin/psr-linter

После чего его можно вызывать набрав

psr-linter

Использование библиотеки

За создание линтера отвечает функция makeLinter, которая принимает в качестве аргументов массив объектов наследников RulesInterface и флага автофикса и возвращает функцию, которая в качестве аргумента принимает исходный код в виде строки. А возвращает массив, содержащий ошибки и исправленный код, если был передан такой аргумент.

<?php
$code = file_get_contents('tests/fixtures/sniffs/variablesNamingForLeadingUnderscore.wrong.php');

require_once 'sniffs/VariablesNamingForLeadUnderscore.php';
$lint = makeLinter([new Rules\VariablesNamingForLeadUnderscore()]);
$linterReport = $lint($code);

Создание правил

Изначально идёт с несколькими правилами, носящими демонстрационный характер. Для реальной работы необходимо создать свой набор правил для проверки

Правила делятся на 2 категории, по возможности применения автоисправления нарушения:

  • определяют нарушение, которые нельзя исправить автоматически (например, сайд-эфект)
  • определяют нарушение и исправляют автоматически (например, приведение имени переменной к соответсвующему виду)

Для создания нового правила, нужно создать создать инстанс соответствующего класса: CheckersTemplate - в первом случае или FixersTemplate, в случае, если есть возможность добавить автофикс для данного правила.

Пример правила, для проверки имени переменной на соответствие стандарта именования camelCase:

<?php

namespace PsrLinter\Rules;

class VariablesNamingForCamelCase extends FixersTemplate implements RulesInterface
{
    public function check(\PhpParser\Node $node)
    {
        if (( $node instanceof \PhpParser\Node\Expr\Variable ) &&
            (!preg_match('/^[a-z]+([A-Z]?[a-z]+)+$/', $node->name))) {
            $this->addError($node, 'error', 'Names MUST be declared in camelCase.');

            return true;
        }
    }

    public function fix(\PhpParser\Node $node)
    {
        $camelize = function ($word) {
            $allWordsAreUpperCased = implode(array_map(function ($word) {
                return ucfirst(strtolower($word));
            }, explode('_', $word)));

            return lcfirst($allWordsAreUpperCased);
        };

        $node->name = $camelize($node->name);
    }
}

Другие примеры находятся в директории shiffs