Skip to content

Commit

Permalink
PHPStanBear: Add PHPStanBear
Browse files Browse the repository at this point in the history
Introduce PHPStanBear
Checks the code with ``phpstan analyze``.
Closes coala#1426
  • Loading branch information
damngamerz committed Mar 4, 2017
1 parent 4daad8d commit bf39ddd
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 0 deletions.
44 changes: 44 additions & 0 deletions bears/php/PHPStanBear.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import os

from coalib.bearlib.abstractions.Linter import linter


@linter(executable='phpstan',
output_format='regex',
output_regex=r'(?P<line>\d+) (?P<message>.*)')
class PHPStanBear:
"""
Checks the code with ``phpstan analyze``.
This can run it on multiple files and folders.
See <https://github.com/phpstan/phpstan> for more information.
"""
LANGUAGES = {'PHP'}
AUTHORS = {'The coala developers'}
AUTHORS_EMAILS = {'[email protected]'}
LICENSE = 'AGPL-3.0'
CAN_DETECT = {'Syntax', 'Unused Code', 'Variable Misuse',
'Undefined Element', 'Missing Import', 'Spelling'}

@staticmethod
def create_arguments(filename, file,
config_file,
phpstan_level: str='0',
phpstan_config: str=''):
"""
:param phpstan_config:
path to a custom configuration file.
When using a custom project config file,
phpstan_level is set to 1
(as default value 0 does not apply here).
:param phpstan_level:
To set rule levels.
0 is the loosest and 4 is the strictest.
See <https://github.com/phpstan/phpstan> for more information.
"""
args = ('analyse',)
if phpstan_config:
phpstan_level = '1'
args += ('--level='+phpstan_level, '-c '+phpstan_config, filename,)
else:
args += ('--level='+phpstan_level, filename,)
return args
49 changes: 49 additions & 0 deletions tests/php/PHPStanBearTest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import os
from queue import Queue
from shutil import which
from unittest.case import skipIf

from bears.php.PHPStanBear import PHPStanBear
from coalib.testing.LocalBearTestHelper import LocalBearTestHelper
from coalib.settings.Section import Section
from coalib.results.Result import RESULT_SEVERITY, Result
from coalib.settings.Setting import Setting


@skipIf(which('phpstan') is None, 'PHPStan is not installed')
class PHPStanTest(LocalBearTestHelper):

def setUp(self):
self.section = Section('test section')
self.uut = PHPStanBear(self.section, Queue())
self.test_file1 = os.path.join(os.path.dirname(__file__),
'test_files',
'phplint_test1.php')
self.test_file2 = os.path.join(os.path.dirname(__file__),
'test_files',
'phplint_test2.php')

def test_run(self):
# Test for a particular output
self.check_results(
self.uut,
[],
[Result.from_values(self.uut,
"Syntax error, unexpected ';' on line 3",
line=3,
severity=RESULT_SEVERITY.NORMAL,
file=self.test_file1)],
filename=self.test_file1)

# Test a file with errors and warnings
self.check_validity(
self.uut,
[],
self.test_file1,
valid=False)

# Test a file without any issues
self.check_validity(
self.uut,
[],
self.test_file2)

0 comments on commit bf39ddd

Please sign in to comment.