Skip to content

Commit

Permalink
Merge branch 'feature/2497-map-settings-to-sniff-included-via-path' of
Browse files Browse the repository at this point in the history
  • Loading branch information
gsherwood committed Jan 7, 2020
2 parents 68e213d + e8f2c75 commit 88e85eb
Show file tree
Hide file tree
Showing 9 changed files with 563 additions and 4 deletions.
23 changes: 23 additions & 0 deletions package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,15 @@ http://pear.php.net/dtd/package-2.0.xsd">
<file baseinstalldir="" name="AcceptTest.php" role="test" />
</dir>
</dir>
<dir name="Ruleset">
<file baseinstalldir="" name="RuleInclusionTest.php" role="test" />
<file baseinstalldir="" name="RuleInclusionTest.xml" role="test" />
<file baseinstalldir="" name="RuleInclusionTest-include.xml" role="test" />
<file baseinstalldir="" name="RuleInclusionAbsoluteLinuxTest.php" role="test" />
<file baseinstalldir="" name="RuleInclusionAbsoluteLinuxTest.xml" role="test" />
<file baseinstalldir="" name="RuleInclusionAbsoluteWindowsTest.php" role="test" />
<file baseinstalldir="" name="RuleInclusionAbsoluteWindowsTest.xml" role="test" />
</dir>
<dir name="Tokenizer">
<file baseinstalldir="" name="AnonClassParenthesisOwnerTest.inc" role="test" />
<file baseinstalldir="" name="AnonClassParenthesisOwnerTest.php" role="test" />
Expand Down Expand Up @@ -1954,6 +1963,13 @@ http://pear.php.net/dtd/package-2.0.xsd">
<install as="CodeSniffer/Core/File/IsReferenceTest.inc" name="tests/Core/File/IsReferenceTest.inc" />
<install as="CodeSniffer/Core/Filters/Filter/AcceptTest.php" name="tests/Core/Filters/Filter/AcceptTest.php" />
<install as="CodeSniffer/Core/Filters/Filter/AcceptTest.xml" name="tests/Core/Filters/Filter/AcceptTest.xml" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionTest.php" name="tests/Core/Ruleset/RuleInclusionTest.php" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionTest.xml" name="tests/Core/Ruleset/RuleInclusionTest.xml" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionTest-include.xml" name="tests/Core/Ruleset/RuleInclusionTest-include.xml" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php" name="tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml" name="tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php" name="tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml" name="tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml" />
<install as="CodeSniffer/Core/Tokenizer/AnonClassParenthesisOwnerTest.php" name="tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.php" />
<install as="CodeSniffer/Core/Tokenizer/AnonClassParenthesisOwnerTest.inc" name="tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.inc" />
<install as="CodeSniffer/Core/Tokenizer/BackfillFnTokenTest.php" name="tests/Core/Tokenizer/BackfillFnTokenTest.php" />
Expand Down Expand Up @@ -1997,6 +2013,13 @@ http://pear.php.net/dtd/package-2.0.xsd">
<install as="CodeSniffer/Core/File/IsReferenceTest.inc" name="tests/Core/File/IsReferenceTest.inc" />
<install as="CodeSniffer/Core/Filters/Filter/AcceptTest.php" name="tests/Core/Filters/Filter/AcceptTest.php" />
<install as="CodeSniffer/Core/Filters/Filter/AcceptTest.xml" name="tests/Core/Filters/Filter/AcceptTest.xml" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionTest.php" name="tests/Core/Ruleset/RuleInclusionTest.php" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionTest.xml" name="tests/Core/Ruleset/RuleInclusionTest.xml" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionTest-include.xml" name="tests/Core/Ruleset/RuleInclusionTest-include.xml" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php" name="tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml" name="tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php" name="tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php" />
<install as="CodeSniffer/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml" name="tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml" />
<install as="CodeSniffer/Core/Tokenizer/AnonClassParenthesisOwnerTest.php" name="tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.php" />
<install as="CodeSniffer/Core/Tokenizer/AnonClassParenthesisOwnerTest.inc" name="tests/Core/Tokenizer/AnonClassParenthesisOwnerTest.inc" />
<install as="CodeSniffer/Core/Tokenizer/BackfillFnTokenTest.php" name="tests/Core/Tokenizer/BackfillFnTokenTest.php" />
Expand Down
14 changes: 10 additions & 4 deletions src/Ruleset.php
Original file line number Diff line number Diff line change
Expand Up @@ -863,11 +863,17 @@ private function processRule($rule, $newSniffs, $depth=0)
$ref = (string) $rule['ref'];
$todo = [$ref];

$parts = explode('.', $ref);
if (count($parts) <= 2) {
// We are processing a standard or a category of sniffs.
$parts = explode('.', $ref);
$partsCount = count($parts);
if ($partsCount <= 2 || $partsCount > count(array_filter($parts))) {
// We are processing a standard, a category of sniffs or a relative path inclusion.
foreach ($newSniffs as $sniffFile) {
$parts = explode(DIRECTORY_SEPARATOR, $sniffFile);
$parts = explode(DIRECTORY_SEPARATOR, $sniffFile);
if (count($parts) === 1 && DIRECTORY_SEPARATOR === '\\') {
// Path using forward slashes while running on Windows.
$parts = explode('/', $sniffFile);
}

$sniffName = array_pop($parts);
$sniffCategory = array_pop($parts);
array_pop($parts);
Expand Down
111 changes: 111 additions & 0 deletions tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<?php
/**
* Tests for the \PHP_CodeSniffer\Ruleset class using a Linux-style absolute path to include a sniff.
*
* @author Juliette Reinders Folmer <phpcs_nospam@adviesenzo.nl>
* @copyright 2019 Juliette Reinders Folmer. All rights reserved.
* @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
*/

namespace PHP_CodeSniffer\Tests\Core\Ruleset;

use PHP_CodeSniffer\Config;
use PHP_CodeSniffer\Ruleset;
use PHPUnit\Framework\TestCase;

class RuleInclusionAbsoluteLinuxTest extends TestCase
{

/**
* The Ruleset object.
*
* @var \PHP_CodeSniffer\Ruleset
*/
protected $ruleset;

/**
* Path to the ruleset file.
*
* @var string
*/
private $standard = '';

/**
* The original content of the ruleset.
*
* @var string
*/
private $contents = '';


/**
* Initialize the config and ruleset objects.
*
* @return void
*/
public function setUp()
{
$this->standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml';
$repoRootDir = dirname(dirname(dirname(__DIR__)));

// On-the-fly adjust the ruleset test file to be able to test sniffs included with absolute paths.
$contents = file_get_contents($this->standard);
$this->contents = $contents;

$newPath = $repoRootDir;
if (DIRECTORY_SEPARATOR === '\\') {
$newPath = str_replace('\\', '/', $repoRootDir);
}

$adjusted = str_replace('%path_slash_forward%', $newPath, $contents);

if (file_put_contents($this->standard, $adjusted) === false) {
$this->markTestSkipped('On the fly ruleset adjustment failed');
}

// Initialize the config and ruleset objects for the test.
$config = new Config(["--standard={$this->standard}"]);
$this->ruleset = new Ruleset($config);

}//end setUp()


/**
* Reset ruleset file.
*
* @return void
*/
public function tearDown()
{
file_put_contents($this->standard, $this->contents);

}//end tearDown()


/**
* Test that sniffs registed with a Linux absolute path are correctly recognized and that
* properties are correctly set for them.
*
* @return void
*/
public function testLinuxStylePathRuleInclusion()
{
// Test that the sniff is correctly registered.
$this->assertObjectHasAttribute('sniffCodes', $this->ruleset);
$this->assertCount(1, $this->ruleset->sniffCodes);
$this->assertArrayHasKey('Generic.Formatting.SpaceAfterNot', $this->ruleset->sniffCodes);
$this->assertSame(
'PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterNotSniff',
$this->ruleset->sniffCodes['Generic.Formatting.SpaceAfterNot']
);

// Test that the sniff properties are correctly set.
$this->assertSame(
'10',
$this->ruleset->sniffs['PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterNotSniff']->spacing
);

}//end testLinuxStylePathRuleInclusion()


}//end class
11 changes: 11 additions & 0 deletions tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="RuleInclusionAbsoluteLinuxTest" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">

<!-- %path_slash_forward% will be replaced on the fly -->
<rule ref="%path_slash_forward%/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php">
<properties>
<property name="spacing" value="10" />
</properties>
</rule>

</ruleset>
112 changes: 112 additions & 0 deletions tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
<?php
/**
* Tests for the \PHP_CodeSniffer\Ruleset class using a Windows-style absolute path to include a sniff.
*
* @author Juliette Reinders Folmer <phpcs_nospam@adviesenzo.nl>
* @copyright 2019 Juliette Reinders Folmer. All rights reserved.
* @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
*/

namespace PHP_CodeSniffer\Tests\Core\Ruleset;

use PHP_CodeSniffer\Config;
use PHP_CodeSniffer\Ruleset;
use PHPUnit\Framework\TestCase;

class RuleInclusionAbsoluteWindowsTest extends TestCase
{

/**
* The Ruleset object.
*
* @var \PHP_CodeSniffer\Ruleset
*/
protected $ruleset;

/**
* Path to the ruleset file.
*
* @var string
*/
private $standard = '';

/**
* The original content of the ruleset.
*
* @var string
*/
private $contents = '';


/**
* Initialize the config and ruleset objects.
*
* @return void
*/
public function setUp()
{
if (DIRECTORY_SEPARATOR === '/') {
$this->markTestSkipped('Windows specific test');
}

$this->standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml';
$repoRootDir = dirname(dirname(dirname(__DIR__)));

// On-the-fly adjust the ruleset test file to be able to test sniffs included with absolute paths.
$contents = file_get_contents($this->standard);
$this->contents = $contents;

$adjusted = str_replace('%path_slash_back%', $repoRootDir, $contents);

if (file_put_contents($this->standard, $adjusted) === false) {
$this->markTestSkipped('On the fly ruleset adjustment failed');
}

// Initialize the config and ruleset objects for the test.
$config = new Config(["--standard={$this->standard}"]);
$this->ruleset = new Ruleset($config);

}//end setUp()


/**
* Reset ruleset file.
*
* @return void
*/
public function tearDown()
{
if (DIRECTORY_SEPARATOR !== '/') {
file_put_contents($this->standard, $this->contents);
}

}//end tearDown()


/**
* Test that sniffs registed with a Windows absolute path are correctly recognized and that
* properties are correctly set for them.
*
* @return void
*/
public function testWindowsStylePathRuleInclusion()
{
// Test that the sniff is correctly registered.
$this->assertObjectHasAttribute('sniffCodes', $this->ruleset);
$this->assertCount(1, $this->ruleset->sniffCodes);
$this->assertArrayHasKey('Generic.Formatting.SpaceAfterCast', $this->ruleset->sniffCodes);
$this->assertSame(
'PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterCastSniff',
$this->ruleset->sniffCodes['Generic.Formatting.SpaceAfterCast']
);

// Test that the sniff property is correctly set.
$this->assertSame(
'10',
$this->ruleset->sniffs['PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterCastSniff']->spacing
);

}//end testWindowsStylePathRuleInclusion()


}//end class
11 changes: 11 additions & 0 deletions tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="RuleInclusionAbsoluteWindowsTest" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">

<!-- %path_slash_back% will be replaced on the fly -->
<rule ref="%path_slash_back%\src\Standards\Generic\Sniffs\Formatting\SpaceAfterCastSniff.php">
<properties>
<property name="spacing" value="10" />
</properties>
</rule>

</ruleset>
10 changes: 10 additions & 0 deletions tests/Core/Ruleset/RuleInclusionTest-include.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="RuleInclusionTest-include" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">

<rule ref="Generic.Metrics.NestingLevel">
<properties>
<property name="nestingLevel" value="2" />
</properties>
</rule>

</ruleset>

0 comments on commit 88e85eb

Please sign in to comment.