Dominic.sauer has submitted this change and it was merged.
Change subject: Added ViolationContext for constraint violation for violations
special page.
......................................................................
Added ViolationContext for constraint violation for violations special page.
Moved CheckResultTranslator into new Violations namespace. Fixed some i18n
bugs. Fixed typo in ConflictsWithChecker.
Change-Id: If5086cccdefeb8a68820292e0d075496288c8931
---
M WikibaseQualityConstraints.alias.php
M WikibaseQualityConstraints.php
M i18n/en.json
M i18n/qqq.json
M includes/ConstraintCheck/Checker/ConflictsWithChecker.php
M includes/ConstraintReportFactory.php
R includes/Violations/CheckResultToViolationTranslator.php
A includes/Violations/ConstraintViolationContext.php
R tests/phpunit/Violations/CheckResultToViolationTranslatorTest.php
A tests/phpunit/Violations/ConstraintViolationContextTest.php
10 files changed, 325 insertions(+), 33 deletions(-)
Approvals:
Dominic.sauer: Verified; Looks good to me, approved
diff --git a/WikibaseQualityConstraints.alias.php
b/WikibaseQualityConstraints.alias.php
index 8f38748..9a08c8f 100644
--- a/WikibaseQualityConstraints.alias.php
+++ b/WikibaseQualityConstraints.alias.php
@@ -1,6 +1,6 @@
<?php
/**
- * Aliases for WikidataQualityConstraints extension
+ * Aliases for WikibaseQualityConstraints extension
*
* @file
* @ingroup Extensions
diff --git a/WikibaseQualityConstraints.php b/WikibaseQualityConstraints.php
index 600fff3..3f9ac05 100755
--- a/WikibaseQualityConstraints.php
+++ b/WikibaseQualityConstraints.php
@@ -40,6 +40,9 @@
define( 'CONSTRAINT_TABLE', 'wbqc_constraints' );
// Jobs
- $GLOBALS['wgJobClasses']['evaluateConstraintReportJob'] =
'WikidataQuality\ConstraintReport\EvaluateConstraintReportJob';
+ $GLOBALS['wgJobClasses']['evaluateConstraintReportJob'] =
'WikibaseQuality\ConstraintReport\EvaluateConstraintReportJob';
$GLOBALS['wgDebugLogGroups']['wbq_evaluation'] =
'/var/log/mediawiki/wbq_evaluation.log';
+
+ // Register violation context
+ $GLOBALS['wbqViolationContexts'][] = function() { return
WikibaseQuality\ConstraintReport\ConstraintReportFactory::getDefaultInstance()->getViolationContext();
};
} );
\ No newline at end of file
diff --git a/i18n/en.json b/i18n/en.json
index d7b27e3..47705d5 100755
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -8,13 +8,19 @@
"wbqc-constraintreport-form-submit-label": "Check",
"wbqc-constraintreport-form-entityid-placeholder": "Qxx/Pxx",
"wbqc-constraintreport-result-headline": "Result for $1",
+ "wbqc-constraintreport-not-existent-entity": "Entity does not exist!",
"wbqc-constraintreport-empty-result": "There are no constraint defined on
this entity.",
"wbqc-constraintreport-status-violation": "Violation",
"wbqc-constraintreport-status-compliance": "Compliance",
"wbqc-constraintreport-status-exception": "Exception",
"wbqc-constraintreport-status-todo": "Todo",
+ "wbqc-constraintreport-result-table-header-status": "Status",
"wbqc-constraintreport-result-table-header-claim": "Claim",
"wbqc-constraintreport-result-table-header-constraint": "Constraint",
"wbqc-constraintreport-result-link-to-claim": "go to claim",
- "wbqc-constraintreport-result-link-to-constraint": "go to constraint"
+ "wbqc-constraintreport-result-link-to-constraint": "go to constraint",
+
+ "wbqc-violations-group": "Constraints",
+ "wbqc-violation-header-parameters": "Parameters:",
+ "wbqc-violation-message": "Constraint check has pointed out a violation.
Please click on icon for further information."
}
diff --git a/i18n/qqq.json b/i18n/qqq.json
index ac30d5a..a7766c0 100755
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -14,12 +14,18 @@
"wbqc-constraintreport-form-entityid-placeholder": "Entity id
placeholder for the input field.",
"wbqc-constraintreport-result-headline": "Result headline",
"wbqc-constraintreport-empty-result": "Message that appears, when there
are no constraints defined for the given entity.",
- "wbqc-constraintreport-status-violation": "Status for claims that are
violated against a constraint.",
+ "wbqev-constraintreport-not-existent-entity": "Error message that appears
when the entered entity does not exist.",
+ "wbqc-constraintreport-status-violation": "Status for claims that are
violated against a constraint.",
"wbqc-constraintreport-status-compliance": "Status for claims that
comply with a constraint",
"wbqc-constraintreport-status-exception": "Status for claims that were
marked as a exception",
"wbqc-constraintreport-status-todo": "Status for constraints which
cannot be checked yet.",
+ "wbqc-constraintreport-result-table-header-status": "Header of the colum
that displays the status."
"wbqc-constraintreport-result-table-header-claim": "Header of the
column that displays a link to the claim, the used property and its
value.\n{{Identical|Claim}}",
"wbqc-constraintreport-result-table-header-constraint": "Header of the
column that gives information about which constraint was
checked.\n{{Identical|Constraint}}",
"wbqc-constraintreport-result-link-to-claim": "Text for the link to a
claim group on the entity page.",
- "wbqc-constraintreport-result-link-to-constraint": "Text for the link
to a constraint on the property page."
+ "wbqc-constraintreport-result-link-to-constraint": "Text for the link
to a constraint on the property page.",
+
+ "wbqc-violations-group": "Name of the group of constrains violations. Is
shown in special page that lists all the violations.",
+ "wbqc-violation-header-parameters": "Header for section in violations
special page that displays parameters of a constraint.".
+ "wbqc-violation-message": "Message that is shown for violated claims on
item page."
}
diff --git a/includes/ConstraintCheck/Checker/ConflictsWithChecker.php
b/includes/ConstraintCheck/Checker/ConflictsWithChecker.php
index aa2e816..e8084ec 100755
--- a/includes/ConstraintCheck/Checker/ConflictsWithChecker.php
+++ b/includes/ConstraintCheck/Checker/ConflictsWithChecker.php
@@ -41,12 +41,12 @@
/**
* @param EntityLookup $lookup
- * @param ConstraintReportHelper $helper
+ * @param ConstraintReportHelper $constraintReportHelper
* ConnectionCheckerHelper $connectionCheckerHelper
*/
- public function __construct( EntityLookup $lookup,
ConstraintReportHelper $helper, ConnectionCheckerHelper
$connectionCheckerHelper ) {
+ public function __construct( EntityLookup $lookup,
ConstraintReportHelper $constraintReportHelper, ConnectionCheckerHelper
$connectionCheckerHelper ) {
$this->entityLookup = $lookup;
- $this->constraintReportHelper = $helper;
+ $this->constraintReportHelper = $constraintReportHelper;
$this->connectionCheckerHelper = $connectionCheckerHelper;
}
diff --git a/includes/ConstraintReportFactory.php
b/includes/ConstraintReportFactory.php
index 466cc2f..93dc0a2 100755
--- a/includes/ConstraintReportFactory.php
+++ b/includes/ConstraintReportFactory.php
@@ -27,6 +27,7 @@
use
WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\ConnectionCheckerHelper;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\RangeCheckerHelper;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\TypeCheckerHelper;
+use WikibaseQuality\ConstraintReport\Violations\ConstraintViolationContext;
class ConstraintReportFactory {
@@ -160,4 +161,9 @@
return $this->constraintRepository;
}
+ public function getViolationContext() {
+ return new ConstraintViolationContext(
+ array_keys( $this->getConstraintCheckerMap() )
+ );
+ }
}
\ No newline at end of file
diff --git
a/includes/ConstraintCheck/Result/CheckResultToViolationTranslator.php
b/includes/Violations/CheckResultToViolationTranslator.php
similarity index 87%
rename from includes/ConstraintCheck/Result/CheckResultToViolationTranslator.php
rename to includes/Violations/CheckResultToViolationTranslator.php
index 32171cc..8d1fe0f 100755
--- a/includes/ConstraintCheck/Result/CheckResultToViolationTranslator.php
+++ b/includes/Violations/CheckResultToViolationTranslator.php
@@ -1,10 +1,11 @@
<?php
-namespace WikibaseQuality\ConstraintReport\ConstraintCheck\Result;
+namespace WikibaseQuality\ConstraintReport\Violations;
use Wikibase\DataModel\Entity\Entity;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\Lib\Store\EntityRevisionLookup;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResult;
use WikibaseQuality\Violations\Violation;
use Doctrine\Instantiator\Exception\InvalidArgumentException;
@@ -23,12 +24,6 @@
$this->entityRevisionLookup = $entityRevisionLookup;
}
- /**
- * @param Entity $entity
- * @param CheckResult[] $checkResultOrArray
- *
- * @return array
- */
public function translateToViolation( Entity $entity,
$checkResultOrArray ) {
$checkResultArray = $this->setCheckResultArray( $checkResultOrArray
);
@@ -48,13 +43,17 @@
$constraintId = $this->setConstraintId( $checkResult, $statement,
$constraintTypeEntityId );
$revisionId =
$this->entityRevisionLookup->getLatestRevisionId( $entityId );
$status = CheckResult::STATUS_VIOLATION;
- $parameters = json_encode( $checkResult->getParameters() );
- $violationArray[ ] = new Violation( $entityId,
$propertyId, $claimGuid, $constraintId, $constraintTypeEntityId, $revisionId,
$status, $parameters );
+
+ $violationArray[ ] = new Violation( $entityId,
$propertyId, $claimGuid, $constraintId, $constraintTypeEntityId, $revisionId,
$status );
}
return $violationArray;
}
+ /**
+ * @param CheckResult|CheckResult[] $checkResultOrArray
+ * @return CheckResult[]
+ */
private function setCheckResultArray( $checkResultOrArray ){
if ( $checkResultOrArray instanceof CheckResult ) {
@@ -75,6 +74,6 @@
}
}
- return md5( $constraintId );
+ return ConstraintViolationContext::CONTEXT_ID .
Violation::CONSTRAINT_ID_DELIMITER . $constraintId;
}
}
\ No newline at end of file
diff --git a/includes/Violations/ConstraintViolationContext.php
b/includes/Violations/ConstraintViolationContext.php
new file mode 100644
index 0000000..29ad635
--- /dev/null
+++ b/includes/Violations/ConstraintViolationContext.php
@@ -0,0 +1,115 @@
+<?php
+
+namespace WikibaseQuality\ConstraintReport\Violations;
+
+
+use Html;
+use Doctrine\Instantiator\Exception\InvalidArgumentException;
+use WikibaseQuality\ConstraintReport\ConstraintReportFactory;
+use WikibaseQuality\Violations\Violation;
+use WikibaseQuality\Violations\ViolationContext;
+
+class ConstraintViolationContext implements ViolationContext {
+
+ const CONTEXT_ID = 'wbqc';
+
+ /**
+ * @var array
+ */
+ private $types;
+
+ /**
+ * @param array $types
+ */
+ public function __construct( array $types ) {
+ $this->types = $types;
+ }
+
+ /**
+ * @see ViolationContext::getId
+ * @codeCoverageIgnore
+ *
+ * @return string
+ */
+ public function getId() {
+ return self::CONTEXT_ID;
+ }
+
+ /**
+ * @see ViolationContext::getName
+ * @codeCoverageIgnore
+ *
+ * @return string
+ */
+ public function getName() {
+ return 'wbqc-violations-group';
+ }
+
+ /**
+ * @see ViolationContext::getTypes
+ *
+ * @return array
+ */
+ public function getTypes() {
+ return $this->types;
+ }
+
+ /**
+ * @see ViolationContext::isContextFor
+ *
+ * @param Violation $violation
+ * @return bool
+ */
+ public function isContextFor( Violation $violation ) {
+ $splitConstraintId = explode( Violation::CONSTRAINT_ID_DELIMITER,
$violation->getConstraintId() );
+ $prefix = $splitConstraintId[0];
+
+ return $prefix === $this->getId();
+ }
+
+ /**
+ * @param Violation $violation
+ * @return string
+ */
+ public function formatAdditionalInformation( Violation $violation ) {
+ if ( !$this->isContextFor( $violation ) ) {
+ throw new InvalidArgumentException( 'Given violation is not part
of current context.' );
+ }
+
+ $output =
+ Html::openElement( 'p' )
+ . Html::element(
+ 'span',
+ array(
+ 'class' => 'wbq-violations-additional-information-header'
+ ),
+ wfMessage( 'wbqc-violation-header-parameters' )->text()
+ );
+
+ $additionalInformation = $violation->getAdditionalInfo();
+ if( array_key_exists( 'parameters', $additionalInformation ) ) {
+ $parameters = $additionalInformation['parameters'];
+ foreach( $parameters as $name => $value ) {
+ $output .= Html::element( 'br' );
+ $output .= sprintf( '%s: %s', $name, $value );
+ }
+ }
+ else {
+ $output .= Html::element( 'br' );
+ $output .= 'none';
+ }
+
+ $output .= Html::closeElement( 'p' );
+
+ return $output;
+ }
+
+ /**
+ * @param Violation $violation
+ * @return string
+ */
+ public function getMessage( Violation $violation ) {
+ //TODO: Implement message system depending on constraint type
+ return wfMessage( 'wbqc-violation-message' )->text();
+ }
+}
\ No newline at end of file
diff --git a/tests/phpunit/Result/CheckResultToViolationTranslatorTest.php
b/tests/phpunit/Violations/CheckResultToViolationTranslatorTest.php
similarity index 80%
rename from tests/phpunit/Result/CheckResultToViolationTranslatorTest.php
rename to tests/phpunit/Violations/CheckResultToViolationTranslatorTest.php
index 76a9190..245df74 100644
--- a/tests/phpunit/Result/CheckResultToViolationTranslatorTest.php
+++ b/tests/phpunit/Violations/CheckResultToViolationTranslatorTest.php
@@ -1,6 +1,6 @@
<?php
-namespace
WikibaseQuality\ConstraintReport\Test\CheckResultToViolationTranslator;
+namespace WikibaseQuality\ConstraintReport\Test\Violations;
use Wikibase\DataModel\Entity\Entity;
use Wikibase\DataModel\Entity\EntityId;
@@ -11,14 +11,14 @@
use Wikibase\DataModel\Entity\PropertyId;
use DataValues\StringValue;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResult;
-use
WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResultToViolationTranslator;
use Wikibase\Repo\WikibaseRepo;
+use
WikibaseQuality\ConstraintReport\Violations\CheckResultToViolationTranslator;
/**
- * @covers
WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResultToViolationTranslator
+ * @covers
WikibaseQuality\ConstraintReport\Violations\CheckResultToViolationTranslator
*
- * @group WikidataQualityConstraints
+ * @group WikibaseQualityConstraints
* @group Database
* @group medium
*
@@ -27,7 +27,7 @@
* @author BP2014N1
* @license GNU GPL v2+
*/
-class CheckResultTestToViolationTranslatorTest extends \MediaWikiTestCase {
+class CheckResultTestToViolationTranslator extends \MediaWikiTestCase {
/**
* @var CheckResultToViolationTranslator
@@ -81,7 +81,7 @@
$this->propertyId = new PropertyId( 'P1' );
$this->claimGuid = 'P1$aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';
$this->statement->setGuid(
'P1$aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' );
- $this->constraintName = 'Single value';
+ $this->constraintName = 'Range';
$this->parameters = array ();
$this->message = 'All right';
$this->entity = new Item();
@@ -106,7 +106,7 @@
$this->assertEquals( array (), $violations );
}
- public function testSingleViolationResultWithoutParameter() {
+ public function testSingleViolationResult() {
$checkResult = new CheckResult( $this->statement,
$this->constraintName, $this->parameters, 'violation', $this->message );
$violations = $this->translator->translateToViolation(
$this->entity, $checkResult );
$this->assertEquals( 1, sizeof( $violations ) );
@@ -117,15 +117,8 @@
$this->assertEquals( $this->statement->getGuid(),
$violation->getClaimGuid() );
$this->assertEquals( md5( $this->statement->getGuid() .
$checkResult->getConstraintName() ), $violation->getConstraintId() );
$this->assertEquals( $checkResult->getConstraintName(),
$violation->getConstraintTypeEntityId() );
- $this->assertEquals( 42, $violation->getRevisionId() );
- $this->assertEquals( '[]', $violation->getAdditionalInfo() );
- }
+ $this->assertEquals( 42, $violation->getRevisionId() );
- public function testSingleViolationResultWithParameter() {
- $checkResult = new CheckResult( $this->statement,
$this->constraintName, array( array( 'constraint_status' => 'mandatory' ) ),
'violation', $this->message );
- $violations = $this->translator->translateToViolation(
$this->entity, $checkResult );
- $violation = $violations[0];
- $this->assertEquals( '[{"constraint_status":"mandatory"}]',
$violation->getAdditionalInfo() );
}
public function testMultipleCheckResults() {
diff --git a/tests/phpunit/Violations/ConstraintViolationContextTest.php
b/tests/phpunit/Violations/ConstraintViolationContextTest.php
new file mode 100644
index 0000000..d4c540c
--- /dev/null
+++ b/tests/phpunit/Violations/ConstraintViolationContextTest.php
@@ -0,0 +1,164 @@
+<?php
+
+namespace WikibaseQuality\ConstraintReport\Test\Violations;
+
+use Language;
+use WikibaseQuality\ConstraintReport\Violations\ConstraintViolationContext;
+
+
+/**
+ * @covers
WikibaseQuality\ConstraintReport\Violations\ConstraintViolationContext
+ *
+ * @group WikibaseQualityConstraints
+ *
+ * @author BP2014N1
+ * @license GNU GPL v2+
+ */
+class ConstraintViolationContextTest extends \MediaWikiTestCase {
+
+ /**
+ * @var array
+ */
+ private $types;
+
+ /**
+ * @var ConstraintViolationContext
+ */
+ private $violationContext;
+
+ public function setUp(){
+ parent::setUp();
+
+ $this->types = array(
+ 'foo',
+ 'bar',
+ 'foobar'
+ );
+ $this->violationContext = new ConstraintViolationContext( $this->types
);
+ }
+
+ public function tearDown() {
+ unset( $this->violationContext );
+
+ parent::tearDown();
+ }
+
+
+ public function testGetTypes() {
+ $actualResult = $this->violationContext->getTypes();
+
+ $this->assertArrayEquals( $this->types, $actualResult );
+ }
+
+
+ /**
+ * @dataProvider isContextForDataProvider
+ */
+ public function testIsContextFor( $expectedResult, $violation ){
+ $actualResult = $this->violationContext->isContextFor( $violation );
+
+ $this->assertEquals( $expectedResult, $actualResult );
+ }
+
+ /**
+ * Test cases for testIsContextFor
+ * @return array
+ */
+ public function isContextForDataProvider() {
+ return array(
+ array(
+ true,
+ $this->getViolationMock( 'wbqc|foobar' )
+ ),
+ array(
+ false,
+ $this->getViolationMock( 'wbqev|foobar' )
+ )
+ );
+ }
+
+
+ /**
+ * @dataProvider formatAdditionalInformationDataProvider
+ */
+ public function testFormatAdditionalInformation( $expectedResult,
$violation, $expectedException = null ) {
+ $this->setExpectedException( $expectedException );
+
+ global $wgLang;
+ $wgLang = Language::factory( 'qqx' );
+ $actualResult = $this->violationContext->formatAdditionalInformation(
$violation );
+
+ $this->assertEquals( $expectedResult, $actualResult );
+ }
+
+ /**
+ * Test cases for testFormatAdditionalInformation
+ * @return array
+ */
+ public function formatAdditionalInformationDataProvider() {
+ return array(
+ array(
+ '<p><span
class="wbq-violations-additional-information-header">(wbqc-violation-header-parameters)</span><br
/>none</p>',
+ $this->getViolationMock(
+ 'wbqc|foobar',
+ array()
+ )
+ ),
+ array(
+ '<p><span
class="wbq-violations-additional-information-header">(wbqc-violation-header-parameters)</span><br
/>foo: bar</p>',
+ $this->getViolationMock(
+ 'wbqc|foobar',
+ array(
+ 'parameters' => array(
+ 'foo' => 'bar'
+ )
+ )
+ )
+ ),
+ array(
+ '<p><span
class="wbq-violations-additional-information-header">(wbqc-violation-header-parameters)</span><br
/>foo: bar<br />foobar: fubar</p>',
+ $this->getViolationMock(
+ 'wbqc|foobar',
+ array(
+ 'parameters' => array(
+ 'foo' => 'bar',
+ 'foobar' => 'fubar'
+ )
+ )
+ )
+ ),
+ array(
+ '',
+ $this->getViolationMock(
+ 'wbqev|foobar',
+ array()
+ ),
+ 'InvalidArgumentException'
+ )
+ );
+ }
+
+
+ public function testGetMessage() {
+ $actualResult = $this->violationContext->getMessage(
$this->getViolationMock() );
+ $expectedResult = '(wbqc-violation-message)';
+
+ $this->assertEquals( $expectedResult, $actualResult );
+ }
+
+
+ private function getViolationMock( $constraintId = null,
$additionalInformation = null ) {
+ $mock = $this->getMockBuilder( 'WikibaseQuality\Violations\Violation' )
+ ->setMethods( array( 'getConstraintId', 'getAdditionalInfo' ) )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $mock->expects( $this->any() )
+ ->method( 'getConstraintId' )
+ ->willReturn( $constraintId );
+ $mock->expects( $this->any() )
+ ->method( 'getAdditionalInfo' )
+ ->willReturn( $additionalInformation );
+
+ return $mock;
+ }
+}
--
To view, visit https://gerrit.wikimedia.org/r/213821
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: If5086cccdefeb8a68820292e0d075496288c8931
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/WikidataQualityConstraints
Gerrit-Branch: master
Gerrit-Owner: Soeren.oldag <[email protected]>
Gerrit-Reviewer: Dominic.sauer <[email protected]>
Gerrit-Reviewer: Siebrand <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits