Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
7bcb847
add .idea to .gitignore
mzk Aug 11, 2015
6cb3176
add cs rule for phpt files
mzk Aug 11, 2015
dc456fd
add cs rule for Entity
mzk Aug 21, 2015
f7dc6ae
refactoring, move to another class for better testing
mzk Aug 24, 2015
6337b8d
require nette/tester, autoloading
mzk Aug 24, 2015
a63c92a
Merge pull request #1 from mzk/tests-for-code-checker
fprochazka Aug 25, 2015
79b8651
Fixed autoloading when installed as lib
fprochazka Aug 25, 2015
7236d87
Add LineLength Checker
mzk Aug 26, 2015
0478527
Convert tabs to 4 spaces and compute new line length
mzk Aug 27, 2015
4678d56
implement warning and error limits
mzk Sep 1, 2015
03a52c8
Merge pull request #3 from mzk/line-checker
fprochazka Sep 2, 2015
3c77be5
add Html5 checker
mzk Sep 2, 2015
ab8c62e
Merge pull request #5 from mzk/html5-checker
mzk Sep 2, 2015
7ecbd15
Added .neon boolean checker
Grez Sep 22, 2015
5edd831
Fixup whitespace in ./tests/bootstrap.php
Grez Sep 23, 2015
dc7d5bf
Merge pull request #7 from Grez/feature/neon-boolean-checker
fprochazka Sep 23, 2015
6fe523c
cs typo
mzk Sep 24, 2015
a1f1e5c
Merge pull request #8 from mzk/devel
mzk Sep 24, 2015
22285cc
Merge branch 'master' of github.com:nette/code-checker into devel
mzk Nov 3, 2015
8427dda
typo, renamed var
mzk Nov 3, 2015
35e0c83
Merge pull request #9 from mzk/devel
Grez Nov 4, 2015
ce166ae
NULL value disable line length warnings
mzk Nov 3, 2015
5249c00
programmers ignore the warnings
mzk Nov 3, 2015
1252f7f
Merge pull request #10 from mzk/less-warnings-line-length
Grez Nov 4, 2015
9201931
change line length limit
mzk Dec 11, 2015
e65961f
Merge pull request #11 from mzk/devel
mzk Dec 11, 2015
3d45fa5
Merge remote-tracking branch 'nette/master' into devel
mzk Mar 15, 2016
ea3b57f
update line length limit
mzk Mar 15, 2016
f019353
Merge pull request #12 from mzk/devel
mzk Mar 15, 2016
320ae71
Merge remote-tracking branch 'nette/master' into devel
mzk Nov 6, 2016
30aab35
Merge remote-tracking branch 'upstream/devel' into devel
mzk Nov 6, 2016
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/vendor
/composer.lock
.idea
13 changes: 13 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,18 @@
"nette/neon": "~2.3",
"latte/latte": "~2.3"
},
"require-dev": {
"nette/tester": "1.4.0"
},
"autoload": {
"classmap": [
"src/"
]
},
"autoload-dev": {
"classmap": [
"tests/"
]
},
"bin": ["src/code-checker.php"]
}
38 changes: 38 additions & 0 deletions src/CodeCheckers/EntityChecker.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace CodeCheckers;

use Nette\Object;
use Nette\Utils\Strings;



class EntityChecker extends Object
{

public static function createAnnotationsChecker()
{
return function ($checker, $s) {
if (!$checker->is('php')) {
return;
}

if (Strings::contains($s, '@ORM\Entity') && !Strings::contains($s, '@ORM\Entity(')) {
$checker->fix('Missing Entity`()`');
$s = str_replace('@ORM\Entity', '@ORM\Entity()', $s);
}

if (Strings::contains($s, '@ORM\Table()')) {
$checker->fix('Missing `name="table_name"`');
$s = str_replace('@ORM\Table()', '@ORM\Table(name="")', $s);
}

if (Strings::contains($s, '@ORM\Table') && !Strings::contains($s, '@ORM\Table(')) {
$checker->fix('Missing `name="table_name"`');
$s = str_replace('@ORM\Table', '@ORM\Table(name="")', $s);
}

return $s;
};
}
}
25 changes: 25 additions & 0 deletions src/CodeCheckers/Html5Checker.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace CodeCheckers;

use Nette\Object;
use Nette\Utils\Strings;



class Html5Checker extends Object
{

public static function createHtml5CheckerChecker()
{
return function ($checker, $s) {
if (!$checker->is('latte')) {
return;
}

if (Strings::match($s, '#<br\W*?\/>#')) {
$checker->error('contains XHTML');
}
};
}
}
37 changes: 37 additions & 0 deletions src/CodeCheckers/LineLengthChecker.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace CodeCheckers;

use Nette\Object;
use Nette\Utils\Strings;



class LineLengthChecker extends Object
{

public static function createLineLengthChecker($warningLineLength = 140, $errorLineLength = 210)
{
return function ($checker, $s) use ($warningLineLength, $errorLineLength) {
if (!$checker->is('php') && !$checker->is('phpt')) {
return;
}

$i = 0;
foreach (explode("\n", $s) as $line) {
$i++;
$line = str_replace("\t", str_repeat(' ', 4), $line);
$lineLength = Strings::length($line);
$message = sprintf('Line %s have %d characters', Strings::truncate(Strings::trim($line), 30), $lineLength);

if ($lineLength > $errorLineLength) {
$checker->error($message, $i);
continue;
}
if ($warningLineLength !== NULL && $lineLength > $warningLineLength) {
$checker->warning($message, $i);
}
}
};
}
}
32 changes: 32 additions & 0 deletions src/CodeCheckers/NeonChecker.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace CodeCheckers;

use Nette\Object;



class NeonChecker extends Object
{

public static function createBooleanValuesChecker()
{
return function ($checker, $s) {
if (!$checker->is('neon')) {
return;
}

$lines = explode("\n", $s);
foreach ($lines as &$line) {
if (preg_match('~^(.*):( )?(yes|on|no|off)$~i', $line)) {
$message = sprintf('Boolean values should be true/false: %s', $line);
$checker->fix($message);
$line = preg_replace('~:( )?(yes|on)$~i', ': true', $line);
$line = preg_replace('~:( )?(no|off)$~i', ': false', $line);
}
}

return implode("\n", $lines);
};
}
}
34 changes: 32 additions & 2 deletions src/code-checker.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,19 @@
* This file is part of the Nette Framework (https://nette.org)
*/

use Nette\Utils\Strings;
use CodeCheckers\EntityChecker;
use CodeCheckers\LineLengthChecker;
use CodeCheckers\Html5Checker;
use CodeCheckers\NeonChecker;
use Nette\CommandLine\Parser;
use Nette\Utils\Strings;

$loaders = array_filter([
__DIR__ . '/../vendor/autoload.php',
__DIR__ . '/../../../autoload.php',
], 'file_exists');

if (@!include __DIR__ . '/../vendor/autoload.php') {
if (@!include reset($loaders)) {
echo('Install packages using `composer update`');
exit(1);
}
Expand Down Expand Up @@ -373,6 +382,27 @@ public function is($extensions)
}
};

// cs, missing @testCase in phpt files
$checker->tasks[] = function (CodeChecker $checker, $s) {
if ($checker->is('phpt')) {
if (!Strings::contains($s, ' * @testCase')) {
$checker->error('Missing @testCase');
}
}
};

// cs, entity
$checker->tasks[] = EntityChecker::createAnnotationsChecker();

//max line length
$checker->tasks[] = LineLengthChecker::createLineLengthChecker(NULL, 360);

//html5 <br/>
$checker->tasks[] = Html5Checker::createHtml5CheckerChecker();

//boolean (yes, on -> true, no, off -> false)
$checker->tasks[] = NeonChecker::createBooleanValuesChecker();

$ok = $checker->run($options['-d']);

exit($ok ? 0 : 1);
3 changes: 3 additions & 0 deletions tests/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/*/output
/test.log
/tmp
100 changes: 100 additions & 0 deletions tests/CodeCheckers/EntityChecker.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?php
/**
* @testCase
*/

namespace CodeCheckerTests;

use CodeCheckers\EntityChecker;
use Tester\Assert;
use Tester\TestCase;

require __DIR__ . '/../bootstrap.php';



class FakeChecker
{

public $fixMessages = [];



public function fix($message)
{
$this->fixMessages[] = $message;
}



public function is($file)
{
return TRUE;
}
}



class EntityCheckerTest extends TestCase
{
/**
* @var FakeChecker
*/
private $fakeChecker;



public function setup()
{
$this->fakeChecker = new FakeChecker();
}



/**
* @dataProvider getDataForTestEntity
*/
public function testEntity($input, $output, $countOfFixMessages)
{
$annotationChecker = EntityChecker::createAnnotationsChecker();
Assert::same($output, $annotationChecker($this->fakeChecker, $input));
Assert::count($countOfFixMessages, $this->fakeChecker->fixMessages);
}



public function getDataForTestEntity()
{
return [
['@ORM\Entity', '@ORM\Entity()', 1],
['@ORM\Entity()', '@ORM\Entity()', 0],
];
}



/**
* @dataProvider getDataForTestTableName
*/
public function testTableName($input, $output, $countOfFixMessages)
{
$annotationChecker = EntityChecker::createAnnotationsChecker();
Assert::same($output, $annotationChecker($this->fakeChecker, $input));
Assert::count($countOfFixMessages, $this->fakeChecker->fixMessages);
}



public function getDataForTestTableName()
{
return [
['@ORM\Table()', '@ORM\Table(name="")', 1],
['@ORM\Table', '@ORM\Table(name="")', 1],
['@ORM\Table(name="table_name")', '@ORM\Table(name="table_name")', 0],
];
}
}



\run(new EntityCheckerTest());
Loading