Umherirrender has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/348054 )

Change subject: New Wikidata Build - 2017-04-13T10:00:01+0000
......................................................................


New Wikidata Build - 2017-04-13T10:00:01+0000

Change-Id: Iedd4207e1a7e150d269bceba32ad10cae736ba7d
---
M composer.lock
M extensions/Constraints/WikibaseQualityConstraints.php
A extensions/Constraints/api/CheckConstraints.php
M extensions/Constraints/composer.json
M extensions/Constraints/i18n/en.json
M extensions/Constraints/i18n/qqq.json
M 
extensions/Constraints/includes/ConstraintCheck/DelegatingConstraintChecker.php
A extensions/Constraints/includes/ConstraintParameterRenderer.php
M extensions/Constraints/includes/ConstraintReportFactory.php
M extensions/Constraints/specials/SpecialConstraintReport.php
A extensions/Constraints/tests/phpunit/Api/CheckConstraintsTest.php
M extensions/Constraints/tests/phpunit/DelegatingConstraintCheckerTest.php
A extensions/Constraints/tests/phpunit/Q6.json
M 
extensions/MediaInfo/tests/phpunit/mediawiki/ChangeOp/Deserialization/MediaInfoChangeOpDeserializerTest.php
M extensions/MediaInfo/tests/phpunit/mediawiki/View/MediaInfoViewTest.php
M extensions/Wikibase/repo/includes/WikibaseRepo.php
M vendor/composer/autoload_classmap.php
M vendor/composer/autoload_psr4.php
M vendor/composer/autoload_static.php
M vendor/composer/installed.json
20 files changed, 1,097 insertions(+), 158 deletions(-)

Approvals:
  Aude: Looks good to me, approved
  Umherirrender: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/composer.lock b/composer.lock
index 1b3f11d..63c7847 100644
--- a/composer.lock
+++ b/composer.lock
@@ -935,7 +935,7 @@
             "source": {
                 "type": "git",
                 "url": 
"https://gerrit.wikimedia.org/r/mediawiki/extensions/WikibaseQualityConstraints";,
-                "reference": "dc74e18274838fd769ab6ef5cbde926a80caff68"
+                "reference": "43848706dee5965c7e4645a92780c5b18e1f1c19"
             },
             "require": {
                 "php": ">=5.5.9",
@@ -952,6 +952,7 @@
             "autoload": {
                 "psr-4": {
                     "WikibaseQuality\\ConstraintReport\\": "includes/",
+                    "WikibaseQuality\\ConstraintReport\\Api\\": "api/",
                     "WikibaseQuality\\ConstraintReport\\Specials\\": 
"specials/",
                     "WikibaseQuality\\ConstraintReport\\Tests\\": 
"tests/phpunit/",
                     "WikibaseQuality\\ConstraintReport\\Maintenance\\": 
"maintenance/"
@@ -987,7 +988,7 @@
             "support": {
                 "issues": 
"https://phabricator.wikimedia.org/project/profile/1202/";
             },
-            "time": "2017-04-11 15:18:45"
+            "time": "2017-04-12 12:47:12"
         },
         {
             "name": "wikibase/data-model",
@@ -1402,7 +1403,7 @@
             "source": {
                 "type": "git",
                 "url": 
"https://gerrit.wikimedia.org/r/mediawiki/extensions/WikibaseMediaInfo";,
-                "reference": "0a5def314cdb02dad1fedc262db501cd5ce00bf9"
+                "reference": "138807317e8f6f56d071cc3f86b6e199ac3fef05"
             },
             "require": {
                 "php": ">=5.5.0",
@@ -1448,7 +1449,7 @@
                 "issues": "https://phabricator.wikimedia.org/";,
                 "irc": "irc://irc.freenode.net/wikidata"
             },
-            "time": "2017-04-11 19:05:07"
+            "time": "2017-04-12 14:09:13"
         },
         {
             "name": "wikibase/quality",
@@ -1557,12 +1558,12 @@
             "source": {
                 "type": "git",
                 "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-                "reference": "5023d440478a34e76a10d6a9458044a9f1a7d2cb"
+                "reference": "a0bf5150f983fcd826f976dc17756c7e6b4ad797"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/5023d440478a34e76a10d6a9458044a9f1a7d2cb";,
-                "reference": "5023d440478a34e76a10d6a9458044a9f1a7d2cb",
+                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/a0bf5150f983fcd826f976dc17756c7e6b4ad797";,
+                "reference": "a0bf5150f983fcd826f976dc17756c7e6b4ad797",
                 "shasum": ""
             },
             "require": {
@@ -1636,7 +1637,7 @@
                 "wikibaserepo",
                 "wikidata"
             ],
-            "time": "2017-04-11 21:13:05"
+            "time": "2017-04-12 20:11:47"
         },
         {
             "name": "wikibase/wikimedia-badges",
diff --git a/extensions/Constraints/WikibaseQualityConstraints.php 
b/extensions/Constraints/WikibaseQualityConstraints.php
index bc994f9..70460fa 100644
--- a/extensions/Constraints/WikibaseQualityConstraints.php
+++ b/extensions/Constraints/WikibaseQualityConstraints.php
@@ -29,6 +29,16 @@
        // Initialize special pages
        $GLOBALS['wgSpecialPages']['ConstraintReport'] = 
'WikibaseQuality\ConstraintReport\Specials\SpecialConstraintReport::newFromGlobalState';
 
+       $GLOBALS['wgAPIModules']['wbcheckconstraints'] = [
+               'class' => 
'\WikibaseQuality\ConstraintReport\Api\CheckConstraints',
+               'factory' => function ( $main, $name ) {
+                       return 
\WikibaseQuality\ConstraintReport\Api\CheckConstraints::newFromGlobalState(
+                               $main,
+                               $name
+                       );
+               }
+       ];
+
        // Define modules
        $remoteExtPathParts = explode(
                DIRECTORY_SEPARATOR . 'extensions' . DIRECTORY_SEPARATOR, 
__DIR__, 2
diff --git a/extensions/Constraints/api/CheckConstraints.php 
b/extensions/Constraints/api/CheckConstraints.php
new file mode 100644
index 0000000..bf710d0
--- /dev/null
+++ b/extensions/Constraints/api/CheckConstraints.php
@@ -0,0 +1,369 @@
+<?php
+
+namespace WikibaseQuality\ConstraintReport\Api;
+
+use ApiBase;
+use ApiMain;
+use ApiResult;
+use Language;
+use MediaWiki\MediaWikiServices;
+use RequestContext;
+use ValueFormatters\FormatterOptions;
+use Wikibase\ChangeOp\StatementChangeOpFactory;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\DataModel\Entity\EntityIdParsingException;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Services\EntityId\EntityIdFormatter;
+use Wikibase\DataModel\Services\Lookup\TermLookup;
+use Wikibase\DataModel\Services\Statement\StatementGuidParser;
+use Wikibase\DataModel\Services\Statement\StatementGuidValidator;
+use Wikibase\DataModel\Services\Term\TermBuffer;
+use Wikibase\LanguageFallbackChainFactory;
+use Wikibase\Lib\OutputFormatValueFormatterFactory;
+use Wikibase\Lib\SnakFormatter;
+use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
+use Wikibase\Repo\Api\ApiErrorReporter;
+use Wikibase\Repo\Api\ApiHelperFactory;
+use Wikibase\Repo\EntityIdLabelFormatterFactory;
+use Wikibase\Repo\WikibaseRepo;
+use 
WikibaseQuality\ConstraintReport\ConstraintCheck\DelegatingConstraintChecker;
+use WikibaseQuality\ConstraintReport\ConstraintParameterRenderer;
+use WikibaseQuality\ConstraintReport\ConstraintReportFactory;
+use Wikimedia\Assert\Assert;
+
+/**
+ * API module that performs constraint check of entities, claims and 
constraint ID
+ *
+ * @author Olga Bode
+ * @license GNU GPL v2+
+ */
+class CheckConstraints extends ApiBase {
+
+       const PARAM_ID = 'id';
+       const PARAM_CLAIM_ID = 'claimid';
+       const PARAM_CONSTRAINT_ID = 'constraintid';
+
+       /**
+        *
+        * @var EntityIdParser
+        */
+       private $entityIdParser;
+
+       /**
+        *
+        * @var StatementGuidValidator
+        */
+       private $statementGuidValidator;
+
+       /**
+        *
+        * @var StatementGuidParser
+        */
+       private $statementGuidParser;
+
+       /**
+        *
+        * @var DelegatingConstraintChecker
+        */
+       private $delegatingConstraintChecker;
+
+       /**
+        *
+        * @var ApiErrorReporter
+        */
+       private $errorReporter;
+
+       /**
+        *
+        * @var EntityIdFormatter
+        */
+       private $entityIdLabelFormatter;
+
+       /**
+        *
+        * @var StatementChangeOpFactory
+        */
+       private $statementChangeOpFactory;
+
+       /**
+        *
+        * @var ConstraintParameterRenderer
+        */
+       private $constraintParameterRenderer;
+
+       /**
+        * @var TermLookup
+        */
+       private $termLookup;
+
+       /**
+        * Creates new instance from global state.
+        *
+        * @param ApiMain $main
+        * @param string $name
+        * @param string $prefix
+        *
+        * @return self
+        */
+       public static function newFromGlobalState( ApiMain $main, $name, 
$prefix = '' ) {
+               $repo = WikibaseRepo::getDefaultInstance();
+               $constraintReportFactory = 
ConstraintReportFactory::getDefaultInstance();
+               $changeOpFactoryProvider = $repo->getChangeOpFactoryProvider();
+               $termLookup = $repo->getTermLookup();
+               $termBuffer = $repo->getTermBuffer();
+               $languageFallbackChainFactory = new 
LanguageFallbackChainFactory();
+               $fallbackLabelDescLookupFactory = new 
LanguageFallbackLabelDescriptionLookupFactory( $languageFallbackChainFactory, 
$termLookup, $termBuffer );
+               $factory = new EntityIdLabelFormatterFactory();
+
+               $language = new Language();
+               $labelLookup = 
$fallbackLabelDescLookupFactory->newLabelDescriptionLookup( $language );
+
+               $formatterOptions = new FormatterOptions();
+               $factoryFunctions = [];
+               Assert::parameterElementType( 'callable', $factoryFunctions, 
'$factoryFunctions' );
+               $formatterOptions->setOption( SnakFormatter::OPT_LANG, 
$language->getCode() );
+               $valueFormatterFactory = new OutputFormatValueFormatterFactory( 
$factoryFunctions, $language,$languageFallbackChainFactory );
+               $valueFormatter = $valueFormatterFactory->getValueFormatter( 
SnakFormatter::FORMAT_HTML, $formatterOptions );
+
+               return new CheckConstraints( $main, $name, $prefix, 
$repo->getEntityIdParser(),
+                       $repo->getStatementGuidValidator(), 
$repo->getStatementGuidParser(), 
$constraintReportFactory->getConstraintChecker(),
+                       new ConstraintParameterRenderer( 
$factory->getEntityIdFormatter( $labelLookup ), $valueFormatter ),
+                       $repo->getApiHelperFactory( RequestContext::getMain() ) 
);
+       }
+
+       /**
+        *
+        * @param ApiMain $main
+        * @param string $name
+        * @param string $prefix
+        * @param EntityIdParser $entityIdParser
+        * @param StatementGuidValidator $statementGuidValidator
+        * @param StatementGuidParser $statementGuidParser
+        * @param DelegatingConstraintChecker $delegatingConstraintChecker
+        * @param ConstraintParameterRenderer $constraintParameterRenderer
+        * @param ApiHelperFactory $apiHelperFactory
+        */
+       public function __construct( ApiMain $main, $name, $prefix = '', 
EntityIdParser $entityIdParser,
+               StatementGuidValidator $statementGuidValidator,
+               StatementGuidParser $statementGuidParser,
+               DelegatingConstraintChecker $delegatingConstraintChecker,
+               ConstraintParameterRenderer $constraintParameterRenderer,
+               ApiHelperFactory $apiHelperFactory ) {
+               parent::__construct( $main, $name, $prefix );
+
+               $repo = WikibaseRepo::getDefaultInstance();
+               $this->statementDeserializer = 
$repo->getExternalFormatStatementDeserializer();
+               $changeOpFactoryProvider = $repo->getChangeOpFactoryProvider();
+
+               $this->statementChangeOpFactory = 
$changeOpFactoryProvider->getStatementChangeOpFactory();
+
+               $this->entityIdParser = $entityIdParser;
+               $this->statementGuidValidator = $statementGuidValidator;
+               $this->statementGuidParser = $statementGuidParser;
+               $this->delegatingConstraintChecker = 
$delegatingConstraintChecker;
+               $this->resultBuilder = $apiHelperFactory->getResultBuilder( 
$this );
+               $this->errorReporter = $apiHelperFactory->getErrorReporter( 
$this );
+
+               $this->constraintParameterRenderer = 
$constraintParameterRenderer;
+       }
+
+       /**
+        * Evaluates the parameters, runs the requested constraint check, and 
sets up the result
+        */
+       public function execute() {
+               MediaWikiServices::getInstance()->getStatsdDataFactory()
+                       ->increment( 
'wikibase.quality.constraints.api.checkConstraints.execute' );
+
+               $params = $this->extractRequestParams();
+               $output = [];
+
+               $this->validateParameters( $params );
+               $entityIds = $this->parseEntityIds( $params );
+               $claimIds = $this->parseClaimIds( $params );
+
+               $output = array_merge( $output, $this->checkItems( $entityIds, 
$params[self::PARAM_CONSTRAINT_ID] ) );
+               $output = array_merge( $output, $this->checkClaimIds( 
$claimIds, $params[self::PARAM_CONSTRAINT_ID] ) );
+
+               $this->getResult()->addValue( null, $this->getModuleName(), 
$this->buildResult( $output, $params[self::PARAM_ID] ) );
+               $this->resultBuilder->markSuccess( 1 );
+       }
+
+
+       private function checkItems( array $entityIds, $constraintIds ) {
+
+               $checkResults = [];
+               foreach ( $entityIds as $entityId ) {
+                       $currentCheckResults = 
$this->delegatingConstraintChecker->checkAgainstConstraintsOnEntityId(
+                               $entityId, $constraintIds );
+                       if ( $currentCheckResults ) {
+                               $checkResults = array_merge( $checkResults, 
$currentCheckResults );
+                       }
+               }
+
+               return $checkResults;
+       }
+
+       private function checkClaimIds( array $claimIds, $constraintIds ) {
+
+               $checkResults = [];
+               foreach ( $claimIds as $claimId ) {
+                       $currentCheckResults = 
$this->delegatingConstraintChecker->checkAgainstConstraintsOnClaimId(
+                               $claimId, $constraintIds );
+                       if ( $currentCheckResults ) {
+                               $checkResults = array_merge( $checkResults, 
$currentCheckResults );
+                       }
+               }
+
+               return $checkResults;
+       }
+
+       private function parseEntityIds( array $params ) {
+               $ids = $params[self::PARAM_ID];
+               if ( $ids !== null ) {
+                       if ( $ids ) {
+                               foreach ( $ids as $id ) {
+                                       try {
+                                               $entityIds[] = 
$this->entityIdParser->parse( $id );
+                                       } catch ( EntityIdParsingException $e ) 
{
+                                               $this->errorReporter->dieError(
+                                                       "Invalid id: $id", 
'invalid-entity-id', 0, [ self::PARAM_ID => $id ] );
+                                       }
+                               }
+                               return $entityIds;
+                       } else {
+                               $paramId = self::PARAM_ID;
+                               $this->errorReporter->dieError(
+                                       "If $paramId is specified, it must be 
nonempty.", 'no-data' );
+                       }
+               } else {
+                       return [];
+               }
+       }
+
+       private function parseClaimIds( array $params ) {
+               $ids = $params[self::PARAM_CLAIM_ID];
+               if ( $ids !== null ) {
+                       if ( $ids ) {
+                               foreach ( $ids as $id ) {
+                                       try {
+                                               $claimIds[] = 
$this->statementGuidParser->parse( $id );
+                                       } catch ( EntityIdParsingException $e ) 
{
+                                               $this->errorReporter->dieError(
+                                                       "Invalid claim id: 
$id", 'invalid-guid', 0, [ self::PARAM_CLAIM_ID => $id ] );
+                                       }
+                               }
+                               return $claimIds;
+                       } else {
+                               $paramClaimId = self::PARAM_CLAIM_ID;
+                               $this->errorReporter->dieError(
+                                       "If $paramClaimId is specified, it must 
be nonempty.", 'no-data' );
+                       }
+               } else {
+                       return [];
+               }
+       }
+
+       private function validateParameters( array $params ) {
+               if ( $params[self::PARAM_CONSTRAINT_ID] !== null
+                        && empty( $params[self::PARAM_CONSTRAINT_ID] ) ) {
+                       $paramConstraintId = self::PARAM_CONSTRAINT_ID;
+                       $this->errorReporter->dieError(
+                               "If $paramConstraintId is specified, it must be 
nonempty.", 'no-data' );
+               }
+               if ( $params[self::PARAM_ID] === null && 
$params[self::PARAM_CLAIM_ID] === null ) {
+                       $paramId = self::PARAM_ID;
+                       $paramClaimId = self::PARAM_CLAIM_ID;
+                       $this->errorReporter->dieError(
+                               "At least one of $paramId, $paramClaimId must 
be specified.", 'no-data' );
+               }
+               // contents of PARAM_ID and PARAM_CLAIM_ID are validated by 
parse{Entity,Claim}Ids()
+       }
+
+       /**
+        * Converts a flat list of constraint check results
+        * to a nested array structure which can be stored in the ApiResult.
+        * The array is keyed by entity ID, then by property ID,
+        * then by claim ID, and then contains a list of individual results:
+        * { "Q1": { "P1": { "Q1$1a2b...": [ { "status": "compliance", ... }, { 
... } ] } } }
+        *
+        * @param CheckResult[] $checkResults
+        * @param string[]|null $entityIds optionally, a list of entity IDs 
that should be present in the output even if there are no check results for them
+        *
+        * @return array
+        */
+       private function buildResult( array $checkResults, $entityIds = null ) {
+
+               $constraintReport = array();
+               ApiResult::setArrayType( $constraintReport, 'assoc' );
+
+               // ensure that the report contains the given IDs even if there 
are no results for them
+               if ( $entityIds ) {
+                       foreach ( $entityIds as $entityId ) {
+                               $constraintReport[$entityId] = [];
+                               ApiResult::setArrayType( 
$constraintReport[$entityId], 'assoc' );
+                       }
+               }
+
+               foreach ( $checkResults as $checkResult ) {
+
+                       $statement = $checkResult->getStatement();
+
+                       $entityId = 
$checkResult->getEntityId()->getSerialization();
+                       $propertyId = 
$checkResult->getPropertyId()->getSerialization();
+                       $claimId = $statement->getGuid();
+
+                       $result = [
+                               'status' =>  $checkResult->getStatus(),
+                               'property' => 
$checkResult->getPropertyId()->getSerialization(),
+                               'claim' => 
$checkResult->getStatement()->getGuid(),
+                               'constraint' => array(
+                                       'id' => $checkResult->getConstraintId(),
+                                       'type' => 
$checkResult->getConstraintName(),
+                                       'detail' => 
$checkResult->getParameters(),
+                                       'detailHTML' => 
$this->constraintParameterRenderer->formatParameters( 
$checkResult->getParameters() )
+                               )
+                       ];
+                       if ( $checkResult->getMessage() ) {
+                               $result['message-html'] = 
$checkResult->getMessage();
+                       }
+
+                       $constraintReport[$entityId][$propertyId][$claimId][] = 
$result;
+               }
+               return $constraintReport;
+       }
+
+       /**
+        * Returns an array of allowed parameters
+        *
+        * @return array @codeCoverageIgnore
+        */
+       public function getAllowedParams() {
+               return [
+                               self::PARAM_ID => [
+                                               ApiBase::PARAM_TYPE => 'string',
+                                               ApiBase::PARAM_ISMULTI => true
+                               ],
+                               self::PARAM_CLAIM_ID => [
+                                               ApiBase::PARAM_TYPE => 'string',
+                                               ApiBase::PARAM_ISMULTI => true
+                               ],
+                               self::PARAM_CONSTRAINT_ID => [
+                                               ApiBase::PARAM_TYPE => 'string',
+                                               ApiBase::PARAM_ISMULTI => true
+                               ]
+               ];
+       }
+
+       /**
+        * Returns usage examples for this module
+        *
+        * @return array
+        * @codeCoverageIgnore
+        */
+       public function getExamplesMessages() {
+               // TODO Add examples
+               return [];
+       }
+
+}
diff --git a/extensions/Constraints/composer.json 
b/extensions/Constraints/composer.json
index 073cf85..57d1d21 100644
--- a/extensions/Constraints/composer.json
+++ b/extensions/Constraints/composer.json
@@ -27,6 +27,7 @@
        "autoload": {
                "psr-4": {
                        "WikibaseQuality\\ConstraintReport\\": "includes/",
+                       "WikibaseQuality\\ConstraintReport\\Api\\": "api/",
                        "WikibaseQuality\\ConstraintReport\\Specials\\": 
"specials/",
                        "WikibaseQuality\\ConstraintReport\\Tests\\": 
"tests/phpunit/",
                        "WikibaseQuality\\ConstraintReport\\Maintenance\\": 
"maintenance/"
@@ -41,4 +42,4 @@
                        "parallel-lint . --exclude vendor"
                ]
        }
-}
+}
\ No newline at end of file
diff --git a/extensions/Constraints/i18n/en.json 
b/extensions/Constraints/i18n/en.json
index fdc12cf..c01e399 100644
--- a/extensions/Constraints/i18n/en.json
+++ b/extensions/Constraints/i18n/en.json
@@ -28,6 +28,11 @@
        "wbqc-constraintreport-result-link-to-constraint": "go to constraint",
        "wbqc-constraintreport-no-parameter": "none",
 
+       "apihelp-wbcheckconstraints-description": "Performs constraint checks 
on any entity you want and returns the result.",
+       "apihelp-wbcheckconstraints-param-id": "ID list of the entities to get 
the data from. Separate values with '|' or alternative.",
+       "apihelp-wbcheckconstraints-param-claimid": "GUID list identifying a 
claim to check a constraint report.  Separate values with '|'.",
+       "apihelp-wbcheckconstraints-param-constraintid": "Optional filter to 
return only the constraints that have the specified constraint ID",
+
        "wbq-subextension-name-wbqc": "Constraints",
        "wbqc-violation-header-parameters": "Parameters:",
        "wbqc-violations-group": "Constraints",
diff --git a/extensions/Constraints/i18n/qqq.json 
b/extensions/Constraints/i18n/qqq.json
index 089b866..5cd91ed 100644
--- a/extensions/Constraints/i18n/qqq.json
+++ b/extensions/Constraints/i18n/qqq.json
@@ -64,5 +64,9 @@
        "wbqc-violation-message-type": "Message for violation of Type 
constraint. When entity is not of given type.",
        "wbqc-violation-message-target-required-claim-property": "Message for 
violation of Target required claim constraint. When only a property is given.",
        "wbqc-violation-message-target-required-claim-claim": "Message for 
violation of Target required claim constraint. When property and value are 
given.",
-       "wbqc-violation-message-value-type": "Message for violation of Value 
type constraint. When value is not of given type."
+       "wbqc-violation-message-value-type": "Message for violation of Value 
type constraint. When value is not of given type.",
+       "apihelp-wbcheckconstraints-description": 
"{{doc-apihelp-description|wbcheckconstraints}}",
+       "apihelp-wbcheckconstraints-param-id": 
"{{doc-apihelp-param|wbcheckconstraints|id}}",
+       "apihelp-wbcheckconstraints-param-claimid": 
"{{doc-apihelp-param|wbcheckconstraints|claimid}}",
+       "apihelp-wbcheckconstraints-param-constraintid": 
"{{doc-apihelp-param|wbcheckconstraints|constraintid}}"
 }
diff --git 
a/extensions/Constraints/includes/ConstraintCheck/DelegatingConstraintChecker.php
 
b/extensions/Constraints/includes/ConstraintCheck/DelegatingConstraintChecker.php
index 120d9f1..79c2bed 100644
--- 
a/extensions/Constraints/includes/ConstraintCheck/DelegatingConstraintChecker.php
+++ 
b/extensions/Constraints/includes/ConstraintCheck/DelegatingConstraintChecker.php
@@ -7,11 +7,13 @@
 use Wikibase\DataModel\Entity\EntityDocument;
 use Wikibase\DataModel\Services\Lookup\EntityLookup;
 use Wikibase\DataModel\Statement\Statement;
+use Wikibase\DataModel\Statement\StatementGuid;
 use Wikibase\DataModel\Statement\StatementList;
 use Wikibase\DataModel\Statement\StatementListProvider;
 use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResult;
 use WikibaseQuality\ConstraintReport\ConstraintLookup;
 use WikibaseQuality\ConstraintReport\Constraint;
+use Wikibase\DataModel\Entity\EntityId;
 
 /**
  * Used to start the constraint-check process and to delegate
@@ -50,12 +52,16 @@
        /**
         * @param EntityLookup $lookup
         * @param ConstraintChecker[] $checkerMap
-        * @param ConstraintLookup $constraintLookup
+        * @param ConstraintLookup $constraintRepository
         */
-       public function __construct( EntityLookup $lookup, array $checkerMap, 
ConstraintLookup $constraintLookup ) {
+       public function __construct(
+               EntityLookup $lookup,
+               array $checkerMap,
+               ConstraintLookup $constraintRepository
+       ) {
                $this->entityLookup = $lookup;
                $this->checkerMap = $checkerMap;
-               $this->constraintLookup = $constraintLookup;
+               $this->constraintLookup = $constraintRepository;
        }
 
        /**
@@ -79,31 +85,108 @@
        }
 
        /**
+        * Starts the whole constraint-check process for entity or constraint 
ID on entity.
+        * Statements of the entity will be checked against every constraint 
that is defined on the property.
+        *
+        * @param EntityId $entityId
+        * @param array $constraintIds
+        *
+        * @return CheckResult[]
+        *
+        */
+       public function checkAgainstConstraintsOnEntityId( EntityId $entityId, 
$constraintIds = null ) {
+
+               $entity = $this->entityLookup->getEntity( $entityId );
+               if ( $entity instanceof StatementListProvider ) {
+                       $this->statements = $entity->getStatements();
+                       $result = $this->checkEveryStatement( 
$this->entityLookup->getEntity( $entityId ), $constraintIds );
+                       $output = $this->sortResult( $result );
+                       return $output;
+               }
+
+               return [];
+       }
+
+       /**
+        * Starts the whole constraint-check process.
+        * Statements of the entity will be checked against every constraint 
that is defined on the claim.
+        *
+        * @param StatementGuid $guid
+        * @param array $constraintIds
+        * @return CheckResult[]
+        */
+       public function checkAgainstConstraintsOnClaimId( StatementGuid $guid, 
$constraintIds = null ) {
+
+               $entityId = $guid->getEntityId();
+               $entity = $this->entityLookup->getEntity( $entityId );
+               if ( $entity instanceof StatementListProvider ) {
+                       $statement = 
$entity->getStatements()->getFirstStatementWithGuid( $guid->getSerialization() 
);
+                       if ( $statement ) {
+                               $result = $this->checkStatement( $entity, 
$statement, $constraintIds );
+                               $output = $this->sortResult( $result );
+                               return $output;
+                       }
+               }
+
+               return [];
+       }
+
+       /**
         * @param EntityDocument|StatementListProvider $entity
+        * @param string[]|null $constraintIds list of constraints to check (if 
null: all constraints)
         *
         * @return CheckResult[]
         */
-       private function checkEveryStatement( EntityDocument $entity ) {
+       private function checkEveryStatement( EntityDocument $entity, 
$constraintIds = null ) {
                $result = array ();
 
                /** @var Statement $statement */
                foreach ( $this->statements as $statement ) {
-                       if ( $statement->getMainSnak()->getType() !== 'value' ) 
{
-                               // skip 'somevalue' and 'novalue' cases, todo: 
handle in a better way
-                               continue;
-                       }
-
-                       $constraints = 
$this->constraintLookup->queryConstraintsForProperty(
-                               $statement->getPropertyId()
-                       );
-
-                       $result = array_merge( $result, 
$this->checkConstraintsForStatementOnEntity( $constraints, $entity, $statement 
) );
+                       $result = array_merge( $result, $this->checkStatement( 
$entity, $statement, $constraintIds ) );
                }
 
                return $result;
        }
 
        /**
+        *
+        * @param EntityDocument|StatementListProvider $entity
+        * @param Statement $statement
+        * @param string[]|null $constraintIds list of constraints to check (if 
null: all constraints)
+        *
+        *
+        * @return CheckResult[]
+        */
+       private function checkStatement( EntityDocument $entity, Statement 
$statement, $constraintIds = null ) {
+               $result = array();
+
+               if ( $statement->getMainSnak()->getType() !== 'value' ) {
+                       // skip 'somevalue' and 'novalue' cases, todo: handle 
in a better way
+                       return [];
+               }
+
+               $constraints = 
$this->constraintLookup->queryConstraintsForProperty(
+                       $statement->getPropertyId()
+               );
+               if ( $constraintIds !== null ) {
+                       $constraintsToUse = [];
+                       foreach ( $constraints as $constraint ) {
+                               if ( in_array( $constraint->getConstraintId(), 
$constraintIds ) ) {
+                                       $constraintsToUse[] = $constraint;
+                               }
+                       }
+               } else {
+                       $constraintsToUse = $constraints;
+               }
+               $result = array_merge(
+                       $result,
+                       $this->checkConstraintsForStatementOnEntity( 
$constraintsToUse, $entity, $statement )
+               );
+
+               return $result;
+       }
+
+       /**
         * @param Constraint[] $constraints
         * @param EntityDocument|StatementListProvider $entity
         * @param Statement $statement
diff --git a/extensions/Constraints/includes/ConstraintParameterRenderer.php 
b/extensions/Constraints/includes/ConstraintParameterRenderer.php
new file mode 100644
index 0000000..cbb1778
--- /dev/null
+++ b/extensions/Constraints/includes/ConstraintParameterRenderer.php
@@ -0,0 +1,132 @@
+<?php
+namespace WikibaseQuality\ConstraintReport;
+
+use DataValues;
+use DataValues\DataValue;
+use HTMLForm;
+use Html;
+use InvalidArgumentException;
+use SpecialPage;
+use UnexpectedValueException;
+use ValueFormatters\ValueFormatter;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\DataModel\Entity\EntityIdParsingException;
+use Wikibase\DataModel\Entity\EntityIdValue;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Services\EntityId\EntityIdFormatter;
+use Wikibase\DataModel\Services\Lookup\EntityLookup;
+use Wikibase\Lib\OutputFormatValueFormatterFactory;
+use Wikibase\Lib\SnakFormatter;
+use Wikibase\Lib\Store\EntityTitleLookup;
+use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
+use Wikibase\Repo\EntityIdHtmlLinkFormatterFactory;
+use Wikibase\Repo\EntityIdLabelFormatterFactory;
+
+/**
+ * Class ConstraintParameterRenderer
+ *
+ * Used to format the constraint values for output.
+ *
+ * @package WikibaseQuality\ConstraintReport
+ * @author BP2014N1
+ * @license GNU GPL v2+
+ */
+
+class ConstraintParameterRenderer{
+
+       /**
+        * Maximum number of displayed values for parameters with multiple ones.
+        *
+        * @var int
+        */
+       const MAX_PARAMETER_ARRAY_LENGTH = 10;
+
+       /**
+        *
+        * @var EntityIdFormatter
+        */
+       private $entityIdLabelFormatter;
+
+       /**
+        * @var ValueFormatter
+        */
+       private $dataValueFormatter;
+
+       /**
+        * @param EntityIdFormatter $entityIdFormatter
+        * @param ValueFormatter $dataValueFormatter
+        */
+       public function __construct( EntityIdFormatter $entityIdFormatter,
+                                                                ValueFormatter 
$dataValueFormatter ) {
+
+               $this->entityIdLabelFormatter = $entityIdFormatter;
+               $this->dataValueFormatter = $dataValueFormatter;
+
+       }
+
+       /**
+        * Formats parameter values of constraints.
+        *
+        * @param string|ItemId|PropertyId|DataValue $value
+        *
+        * @return string HTML
+        */
+       public function formatValue( $value ) {
+               if ( is_string( $value ) ) {
+                       // Cases like 'Format' 'pattern' or 'minimum'/'maximum' 
values, which we have stored as
+                       // strings
+                       return (htmlspecialchars( $value ));
+               } elseif ( $value instanceof EntityId ) {
+                       // Cases like 'Conflicts with' 'property', to which we 
can link
+                       return $this->entityIdLabelFormatter->formatEntityId( 
$value );
+               } else {
+                       // Cases where we format a DataValue
+                       return $this->dataValueFormatter->format( $value );
+               }
+       }
+
+       /**
+        * Formats constraint parameters.
+        *
+        * @param (string|ItemId|PropertyId|DataValue)[]|null $parameters
+        *
+        * @return string HTML
+        */
+       public function formatParameters( $parameters ) {
+               if ( $parameters === null || count( $parameters ) == 0 ) {
+                       return null;
+               }
+
+               $valueFormatter = function ( $value ) {
+                       return $this->formatValue( $value );
+               };
+
+               $formattedParameters = array();
+               foreach ( $parameters as $parameterName => $parameterValue ) {
+                       $formattedParameterValues = implode( ', ',
+                               $this->limitArrayLength( array_map( 
$valueFormatter, $parameterValue ) ) );
+                       $formattedParameters[] = sprintf( '%s: %s', 
$parameterName, $formattedParameterValues );
+               }
+
+               return implode( '; ', $formattedParameters );
+       }
+
+       /**
+        * Cuts an array after n values and appends dots if needed.
+        *
+        * @param array $array
+        *
+        * @return array
+        */
+       private function limitArrayLength( array $array ) {
+               if ( count( $array ) > self::MAX_PARAMETER_ARRAY_LENGTH ) {
+                       $array = array_slice( $array, 0, 
self::MAX_PARAMETER_ARRAY_LENGTH );
+                       array_push( $array, '...' );
+               }
+
+               return $array;
+       }
+
+}
\ No newline at end of file
diff --git a/extensions/Constraints/includes/ConstraintReportFactory.php 
b/extensions/Constraints/includes/ConstraintReportFactory.php
index a2b9c28..270e30e 100644
--- a/extensions/Constraints/includes/ConstraintReportFactory.php
+++ b/extensions/Constraints/includes/ConstraintReportFactory.php
@@ -28,6 +28,7 @@
 use 
WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\ConnectionCheckerHelper;
 use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\RangeCheckerHelper;
 use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\TypeCheckerHelper;
+use Wikibase\DataModel\Services\Statement\StatementGuidParser;
 
 class ConstraintReportFactory {
 
@@ -57,6 +58,11 @@
        private $constraintParameterMap;
 
        /**
+        * @var StatementGuidParser
+        */
+       private $statementGuidParser;
+
+       /**
         * Returns the default instance.
         * IMPORTANT: Use only when it is not feasible to inject an instance 
properly.
         *
@@ -66,7 +72,7 @@
                static $instance = null;
 
                if ( $instance === null ) {
-                       $instance = new self( 
WikibaseRepo::getDefaultInstance()->getEntityLookup() );
+                       $instance = new self( 
WikibaseRepo::getDefaultInstance()->getEntityLookup(), 
WikibaseRepo::getDefaultInstance()->getStatementGuidParser() );
                }
 
                return $instance;
@@ -74,9 +80,11 @@
 
        /**
         * @param EntityLookup $lookup
+        * @param StatementGuidParser $statementGuidParser
         */
-       public function __construct( EntityLookup $lookup ) {
+       public function __construct( EntityLookup $lookup, StatementGuidParser 
$statementGuidParser ) {
                $this->lookup = $lookup;
+               $this->statementGuidParser = $statementGuidParser;
        }
 
        /**
diff --git a/extensions/Constraints/specials/SpecialConstraintReport.php 
b/extensions/Constraints/specials/SpecialConstraintReport.php
index 11ec323..6d7c713 100644
--- a/extensions/Constraints/specials/SpecialConstraintReport.php
+++ b/extensions/Constraints/specials/SpecialConstraintReport.php
@@ -13,6 +13,7 @@
 use ValueFormatters\FormatterOptions;
 use ValueFormatters\ValueFormatter;
 use Wikibase\DataModel\Entity\EntityDocument;
+use WikibaseQuality\ConstraintReport\ConstraintParameterRenderer;
 use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Entity\EntityIdParsingException;
@@ -44,13 +45,6 @@
  * @license GNU GPL v2+
  */
 class SpecialConstraintReport extends SpecialPage {
-
-       /**
-        * Maximum number of displayed values for parameters with multiple ones.
-        *
-        * @var int
-        */
-       const MAX_PARAMETER_ARRAY_LENGTH = 5;
 
        /**
         * Id of the property, that is used to specify constraints on entities.
@@ -95,6 +89,11 @@
         * @var DelegatingConstraintChecker
         */
        private $constraintChecker;
+
+       /**
+        * @var ConstraintParameterRenderer
+        */
+       private $constraintParameterRenderer;
 
        public static function newFromGlobalState()     {
                $constraintReportFactory = 
ConstraintReportFactory::getDefaultInstance();
@@ -158,6 +157,8 @@
                );
 
                $this->constraintChecker = $constraintChecker;
+
+               $this->constraintParameterRenderer = new 
ConstraintParameterRenderer( $this->entityIdLabelFormatter, 
$this->dataValueFormatter );
        }
 
        /**
@@ -378,7 +379,7 @@
                // Claim column
                $property = $this->entityIdLabelFormatter->formatEntityId( 
$result->getPropertyId() );
                if ( $result->getMainSnakType() === 'value' ) {
-                       $value = $this->formatValue( $result->getDataValue() );
+                       $value = 
$this->constraintParameterRenderer->formatValue( $result->getDataValue() );
                } else {
                        $value = htmlspecialchars( $result->getMainSnakType() );
                }
@@ -397,7 +398,7 @@
                );
                $constraintColumn = $this->buildExpandableElement(
                        $constraintLink,
-                       $this->formatParameters( $result->getParameters() ),
+                       $this->constraintParameterRenderer->formatParameters( 
$result->getParameters() ),
                        '[...]'
                );
 
@@ -656,67 +657,6 @@
                $entityUrl = sprintf( '%s#%s', $title->getLocalURL(), 
$propertyId->getSerialization() );
 
                return $entityUrl;
-       }
-
-       /**
-        * Formats values of constraints.
-        *
-        * @param string|ItemId|PropertyId|DataValue $value
-        *
-        * @return string HTML
-        */
-       private function formatValue( $value ) {
-               if ( is_string( $value ) ) {
-                       // Cases like 'Format' 'pattern' or 'minimum'/'maximum' 
values, which we have stored as strings
-                       return ( htmlspecialchars ( $value ) );
-               } elseif ( $value instanceof EntityId ) {
-                       // Cases like 'Conflicts with' 'property', to which we 
can link
-                       return $this->entityIdLabelFormatter->formatEntityId( 
$value );
-               } else {
-                       // Cases where we format a DataValue
-                       return $this->formatDataValues( $value );
-               }
-       }
-
-       /**
-        * Formats constraint parameters.
-        *
-        * @param array $parameters
-        *
-        * @return string HTML
-        */
-       private function formatParameters( $parameters ) {
-               if ( $parameters === null || count( $parameters ) == 0 ) {
-                       return null;
-               }
-
-               $valueFormatter = function ( $value ) {
-                       return $this->formatValue( $value );
-               };
-
-               $formattedParameters = array ();
-               foreach ( $parameters as $parameterName => $parameterValue ) {
-                       $formattedParameterValues = implode( ', ', 
$this->limitArrayLength( array_map( $valueFormatter, $parameterValue ) ) );
-                       $formattedParameters[] = sprintf( '%s: %s', 
$parameterName, $formattedParameterValues );
-               }
-
-               return implode( '; ', $formattedParameters );
-       }
-
-       /**
-        * Cuts an array after n values and appends dots if needed.
-        *
-        * @param array $array
-        *
-        * @return array
-        */
-       private function limitArrayLength( $array ) {
-               if ( count( $array ) > self::MAX_PARAMETER_ARRAY_LENGTH ) {
-                       $array = array_slice( $array, 0, 
self::MAX_PARAMETER_ARRAY_LENGTH );
-                       array_push( $array, '...' );
-               }
-
-               return $array;
        }
 
 }
diff --git a/extensions/Constraints/tests/phpunit/Api/CheckConstraintsTest.php 
b/extensions/Constraints/tests/phpunit/Api/CheckConstraintsTest.php
new file mode 100644
index 0000000..c54ad1d
--- /dev/null
+++ b/extensions/Constraints/tests/phpunit/Api/CheckConstraintsTest.php
@@ -0,0 +1,223 @@
+<?php
+
+namespace WikibaseQuality\ConstraintReport\Tests\Api;
+
+use ApiTestCase;
+use DataValues\UnknownValue;
+use RequestContext;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\ItemIdParser;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Services\Lookup\InMemoryEntityLookup;
+use Wikibase\DataModel\Services\Statement\StatementGuidParser;
+use Wikibase\DataModel\Services\Statement\StatementGuidValidator;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Statement\Statement;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\Repo\EntityIdLabelFormatterFactory;
+use Wikibase\Repo\WikibaseRepo;
+use WikibaseQuality\ConstraintReport\Api\CheckConstraints;
+use WikibaseQuality\ConstraintReport\Constraint;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\ConstraintChecker;
+use 
WikibaseQuality\ConstraintReport\ConstraintCheck\DelegatingConstraintChecker;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResult;
+use WikibaseQuality\ConstraintReport\Tests\Fake\FakeChecker;
+use WikibaseQuality\ConstraintReport\Tests\Fake\InMemoryConstraintLookup;
+use Wikibase\LanguageFallbackChain;
+use Wikibase\LanguageFallbackChainFactory;
+use Wikibase\DataModel\Services\Lookup\TermLookup;
+use Wikibase\DataModel\Services\Term\TermBuffer;
+use Wikibase\Lib\SnakFormatter;
+use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
+use Wikibase\Lib\OutputFormatValueFormatterFactory;
+use ValueFormatters\FormatterOptions;
+use Wikimedia\Assert\Assert;
+use Language;
+use WikibaseQuality\ConstraintReport\ConstraintParameterRenderer;
+
+/**
+ * @covers WikibaseQuality\ConstraintReport\Api\CheckConstraints
+ *
+ * @group API
+ * @group Database
+ * @group Wikibase
+ * @group WikibaseAPI
+ *
+ * @group medium
+ *
+ * @license GPL-2.0+
+ */
+class CheckConstraintsTest extends ApiTestCase {
+
+       const NONEXISTENT_ITEM = 'Q99';
+       const NONEXISTENT_CLAIM = 'Q99$does-not-exist';
+
+       private static $oldModuleDeclaration;
+
+       /**
+        * @var InMemoryEntityLookup
+        */
+       private static $entityLookup;
+
+       /**
+        * @var Constraint[]
+        */
+       private static $constraintLookupContents = [];
+
+       /**
+        * @var ConstraintChecker[]
+        */
+       private static $checkerMap = [];
+
+       public static function setUpBeforeClass() {
+               parent::setUpBeforeClass();
+               global $wgAPIModules;
+
+               self::$oldModuleDeclaration = 
$wgAPIModules['wbcheckconstraints'];
+
+               self::$entityLookup = new InMemoryEntityLookup();
+
+               $wgAPIModules['wbcheckconstraints']['factory'] = function ( 
$main, $name ) {
+                       $repo = WikibaseRepo::getDefaultInstance();
+                       $factory = new EntityIdLabelFormatterFactory();
+                       $termLookup = $repo->getTermLookup();
+                       $termBuffer = $repo->getTermBuffer();
+                       $languageFallbackChainFactory = new 
LanguageFallbackChainFactory();
+                       $fallbackLabelDescLookupFactory = new 
LanguageFallbackLabelDescriptionLookupFactory( $languageFallbackChainFactory, 
$termLookup, $termBuffer );
+                       $language = new Language();
+                       $labelLookup = 
$fallbackLabelDescLookupFactory->newLabelDescriptionLookup( $language );
+
+                       $formatterOptions = new FormatterOptions();
+                       $factoryFunctions = [];
+                       Assert::parameterElementType( 'callable', 
$factoryFunctions, '$factoryFunctions' );
+                       $formatterOptions->setOption( SnakFormatter::OPT_LANG, 
$language->getCode() );
+                       $valueFormatterFactory = new 
OutputFormatValueFormatterFactory( $factoryFunctions, 
$language,$languageFallbackChainFactory );
+                       $valueFormatter = 
$valueFormatterFactory->getValueFormatter( SnakFormatter::FORMAT_HTML, 
$formatterOptions );
+
+                       $entityIdParser = new ItemIdParser();
+                       $constraintChecker = new DelegatingConstraintChecker(
+                               self::$entityLookup,
+                               self::$checkerMap,
+                               new InMemoryConstraintLookup( 
self::$constraintLookupContents )
+                       );
+
+                       return new CheckConstraints(
+                               $main,
+                               $name,
+                               '',
+                               $entityIdParser,
+                               new StatementGuidValidator( $entityIdParser ),
+                               new StatementGuidParser( $entityIdParser ),
+                               $constraintChecker,
+                               new ConstraintParameterRenderer( 
$factory->getEntityIdFormatter( $labelLookup ), $valueFormatter ),
+                               $repo->getApiHelperFactory( 
RequestContext::getMain() )
+                       );
+               };
+       }
+
+       protected function tearDown() {
+               self::$constraintLookupContents = [];
+               self::$checkerMap = [];
+               parent::tearDown();
+       }
+
+       public static function tearDownAfterClass() {
+               global $wgAPIModules;
+               $wgAPIModules['wbcheckconstraints'] = 
self::$oldModuleDeclaration;
+
+               parent::tearDownAfterClass();
+       }
+
+       public function testReportForNonexistentItemIsEmpty() {
+               $result = $this->doRequest(
+                       [ CheckConstraints::PARAM_ID => self::NONEXISTENT_ITEM ]
+               );
+
+               $this->assertEmpty( 
$result['wbcheckconstraints'][self::NONEXISTENT_ITEM] );
+       }
+
+       public function testReportForNonexistentClaimIsEmpty() {
+               $result = $this->doRequest(
+                       [ CheckConstraints::PARAM_CLAIM_ID => 
self::NONEXISTENT_CLAIM ]
+               );
+
+               $this->assertEmpty( $result['wbcheckconstraints'] );
+       }
+
+       public function 
testItemExistsAndHasViolation_WillGetOnlyThisViolationInTheResult() {
+               $this->givenItemWithPropertyExists(
+                       new ItemId( 'Q1' ),
+                       new PropertyId( 'P1' ),
+                       'statement-id'
+               );
+               $this->givenPropertyHasViolation( new PropertyId( 'P1' ) );
+
+               $result = $this->doRequest( [ CheckConstraints::PARAM_ID => 
'Q1' ] );
+
+               $this->assertCount( 1, $result['wbcheckconstraints'] );
+               $resultsForItem = 
$result['wbcheckconstraints']['Q1']['P1']['Q1$statement-id'];
+               $this->assertCount( 1, $resultsForItem );
+               $this->assertEquals( CheckResult::STATUS_VIOLATION, 
$resultsForItem[0]['status'] );
+               $this->assertEquals( 'P1', $resultsForItem[0]['property'] );
+       }
+
+       public function 
testItemWithClaimExistsAndHasViolation_WillGetOnlyThisViolationInTheResult() {
+               $this->givenItemWithPropertyExists(
+                       new ItemId( 'Q1' ),
+                       new PropertyId( 'P1' ),
+                       'statement-id'
+               );
+               $this->givenPropertyHasViolation( new PropertyId( 'P1' ) );
+
+               $result = $this->doRequest( [ CheckConstraints::PARAM_CLAIM_ID 
=> 'Q1$statement-id' ] );
+
+               $this->assertCount( 1, $result['wbcheckconstraints'] );
+               $resultsForItem = 
$result['wbcheckconstraints']['Q1']['P1']['Q1$statement-id'];
+               $this->assertCount( 1, $resultsForItem );
+               $this->assertEquals( CheckResult::STATUS_VIOLATION, 
$resultsForItem[0]['status'] );
+               $this->assertEquals( 'P1', $resultsForItem[0]['property'] );
+       }
+
+       /**
+        * @param array $params
+        * @return array Array of violations
+        */
+       private function doRequest( array $params ) {
+               $params['action'] = 'wbcheckconstraints';
+               return $this->doApiRequest( $params, [], false, null )[0];
+       }
+
+       private function givenPropertyHasViolation( PropertyId $propertyId ) {
+               self::$checkerMap['violationConstraint'] = new FakeChecker( 
CheckResult::STATUS_VIOLATION );
+               self::$constraintLookupContents[] = new Constraint(
+                       'some guid',
+                       $propertyId,
+                       'violationConstraint',
+                       []
+               );
+       }
+
+       private function givenItemWithPropertyExists(
+               ItemId $itemId,
+               PropertyId $propertyId,
+               $statementId = 'some-id'
+       ) {
+               $item = new Item(
+                       $itemId,
+                       null,
+                       null,
+                       new StatementList(
+                               [
+                                       new Statement(
+                                               new PropertyValueSnak( 
$propertyId, new UnknownValue( null ) ),
+                                               null,
+                                               null,
+                                               $itemId->getSerialization() . 
'$' . $statementId
+                                       )
+                               ]
+                       )
+               );
+               self::$entityLookup->addEntity( $item );
+       }
+}
diff --git 
a/extensions/Constraints/tests/phpunit/DelegatingConstraintCheckerTest.php 
b/extensions/Constraints/tests/phpunit/DelegatingConstraintCheckerTest.php
index baba758..6105b20 100644
--- a/extensions/Constraints/tests/phpunit/DelegatingConstraintCheckerTest.php
+++ b/extensions/Constraints/tests/phpunit/DelegatingConstraintCheckerTest.php
@@ -2,8 +2,13 @@
 
 namespace WikibaseQuality\ConstraintReport\Test\ConstraintChecker;
 
+use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\ItemIdParser;
+use Wikibase\DataModel\Services\Statement\StatementGuidParser;
+use Wikibase\DataModel\Statement\Statement;
 use 
WikibaseQuality\ConstraintReport\ConstraintCheck\DelegatingConstraintChecker;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResult;
 use WikibaseQuality\ConstraintReport\ConstraintReportFactory;
 use WikibaseQuality\Tests\Helper\JsonFileEntityLookup;
 
@@ -49,10 +54,19 @@
         */
        private $lookup;
 
+       /**
+        * @var StatementGuidParser
+        */
+       private $statementGuidParser;
+
        protected function setUp() {
                parent::setUp();
-               $this->lookup = new JsonFileEntityLookup( __DIR__ );
-               $factory = new ConstraintReportFactory( $this->lookup );
+               $this->lookup = $this->createEntityLookup();
+               $this->statementGuidParser = new StatementGuidParser( new 
ItemIdParser() );
+               $factory = new ConstraintReportFactory(
+                       $this->lookup,
+                       $this->statementGuidParser
+               );
                $this->constraintChecker = $factory->getConstraintChecker();
 
                // specify database tables used by this test
@@ -275,4 +289,50 @@
                $this->assertEquals( 'exception', $result[ 0 ]->getStatus(), 
'Should be an exception' );
        }
 
+       public function testCheckAgainstConstraints_ByClaims() {
+               $factory = new ConstraintReportFactory(
+                       $this->createEntityLookup(),
+                       $this->statementGuidParser
+               );
+               $constraintChecker = $factory->getConstraintChecker();
+
+               $result = $constraintChecker->checkAgainstConstraintsOnClaimId(
+                       $this->statementGuidParser->parse( 
'Q1$c0f25a6f-9e33-41c8-be34-c86a730ff30b' ) );
+
+               $this->assertCount( 18, $result, 'Every constraint should be 
represented by one result' );
+       }
+
+       public function 
testCheckAgainstConstraintsDoesNotCrashWhenResultIsEmpty_ByClaims() {
+               $factory = new ConstraintReportFactory(
+                       $this->createEntityLookup(),
+                       $this->statementGuidParser
+               );
+               $constraintChecker = $factory->getConstraintChecker();
+
+               $result = $constraintChecker->checkAgainstConstraintsOnClaimId(
+                       $this->statementGuidParser->parse( 
'Q2$c0f25a6f-9e33-41c8-be34-c86a730ff30b' ) );
+
+               $this->assertCount( 0, $result, 'Should be empty' );
+       }
+
+       public function 
testCheckAgainstConstraintsDoesNotCrashWhenClaimDoesNotExist() {
+               $factory = new ConstraintReportFactory(
+                       $this->createEntityLookup(),
+                       $this->statementGuidParser
+               );
+               $constraintChecker = $factory->getConstraintChecker();
+
+               $result = $constraintChecker->checkAgainstConstraintsOnClaimId(
+                       $this->statementGuidParser->parse( 'Q99$does-not-exist' 
) );
+
+               $this->assertCount( 0, $result, 'Should be empty' );
+       }
+
+       /**
+        * @return JsonFileEntityLookup
+        */
+       private function createEntityLookup() {
+               return new JsonFileEntityLookup( __DIR__ );
+       }
+
 }
diff --git a/extensions/Constraints/tests/phpunit/Q6.json 
b/extensions/Constraints/tests/phpunit/Q6.json
new file mode 100644
index 0000000..7e9acf8
--- /dev/null
+++ b/extensions/Constraints/tests/phpunit/Q6.json
@@ -0,0 +1,97 @@
+{
+  "id": "Q6",
+  "type": "item",
+  "aliases": {},
+  "labels": {},
+  "claims": {
+    "P1": [
+      {
+        "id": "Q6$01015a6f-9e33-41c8-be34-c86a730ff30b",
+        "mainsnak": {
+          "snaktype": "value",
+          "property": "P1",
+          "datatype": "string",
+          "datavalue": {
+            "value": "foo",
+            "type": "string"
+          }
+        },
+        "type": "statement",
+        "rank": "normal"
+      },
+      {
+        "id": "Q6$01025a6f-9e33-41c8-be34-c86a730ff30b",
+        "mainsnak": {
+          "snaktype": "value",
+          "property": "P1",
+          "datatype": "string",
+          "datavalue": {
+            "value": "foo",
+            "type": "string"
+          }
+        },
+        "type": "statement",
+        "rank": "normal"
+      }
+    ],
+    "P2": [
+      {
+        "id": "Q6$02015a6f-9e33-41c8-be34-c86a730ff30b",
+        "mainsnak": {
+          "snaktype": "value",
+          "property": "P2",
+          "datatype": "string",
+          "datavalue": {
+            "value": "foo",
+            "type": "string"
+          }
+        },
+        "type": "statement",
+        "rank": "normal"
+      }
+    ],
+    "P3": [
+      {
+        "id": "Q6$03015a6f-9e33-41c8-be34-c86a730ff30b",
+        "mainsnak": {
+          "snaktype": "value",
+          "property": "P3",
+          "datatype": "string",
+          "datavalue": {
+            "value": "foo",
+            "type": "string"
+          }
+        },
+        "type": "statement",
+        "rank": "normal"
+      }
+    ],
+    "P4": [
+      {
+        "id": "Q6$04015a6f-9e33-41c8-be34-c86a730ff30b",
+        "mainsnak": {
+          "snaktype": "novalue",
+          "property": "P4"
+        },
+        "type": "statement",
+        "rank": "normal"
+      }
+    ],
+    "P10": [
+      {
+        "id": "Q6$10015a6f-9e33-41c8-be34-c86a730ff30b",
+        "mainsnak": {
+          "snaktype": "value",
+          "property": "P10",
+          "datatype": "string",
+          "datavalue": {
+            "value": "foo",
+            "type": "string"
+          }
+        },
+        "type": "statement",
+        "rank": "normal"
+      }
+    ]
+  }
+}
diff --git 
a/extensions/MediaInfo/tests/phpunit/mediawiki/ChangeOp/Deserialization/MediaInfoChangeOpDeserializerTest.php
 
b/extensions/MediaInfo/tests/phpunit/mediawiki/ChangeOp/Deserialization/MediaInfoChangeOpDeserializerTest.php
index fb84efb..79d601e 100644
--- 
a/extensions/MediaInfo/tests/phpunit/mediawiki/ChangeOp/Deserialization/MediaInfoChangeOpDeserializerTest.php
+++ 
b/extensions/MediaInfo/tests/phpunit/mediawiki/ChangeOp/Deserialization/MediaInfoChangeOpDeserializerTest.php
@@ -6,12 +6,20 @@
 use Wikibase\ChangeOp\ChangeOpDescription;
 use Wikibase\ChangeOp\ChangeOpLabel;
 use Wikibase\ChangeOp\ChangeOpRemoveStatement;
+use Wikibase\ChangeOp\FingerprintChangeOpFactory;
+use Wikibase\Lib\StaticContentLanguages;
 use Wikibase\MediaInfo\ChangeOp\Deserialization\MediaInfoChangeOpDeserializer;
+use Wikibase\MediaInfo\DataModel\MediaInfo;
 use Wikibase\Repo\ChangeOp\Deserialization\ChangeOpDeserializationException;
 use Wikibase\Repo\ChangeOp\Deserialization\ClaimsChangeOpDeserializer;
 use Wikibase\Repo\ChangeOp\Deserialization\DescriptionsChangeOpDeserializer;
 use Wikibase\Repo\ChangeOp\Deserialization\LabelsChangeOpDeserializer;
+use Wikibase\Repo\ChangeOp\Deserialization\TermChangeOpSerializationValidator;
+use Wikibase\Repo\Tests\ChangeOp\ChangeOpTestMockProvider;
+use 
Wikibase\Repo\Tests\ChangeOp\Deserialization\DescriptionsChangeOpDeserializationTester;
+use 
Wikibase\Repo\Tests\ChangeOp\Deserialization\LabelsChangeOpDeserializationTester;
 use Wikibase\Repo\Validators\TermValidatorFactory;
+use Wikibase\StringNormalizer;
 
 /**
  * @covers 
Wikibase\MediaInfo\ChangeOp\Deserialization\MediaInfoChangeOpDeserializer
@@ -22,6 +30,9 @@
  * @author Katie Filbert < [email protected] >
  */
 class MediaInfoChangeOpDeserializerTest extends \PHPUnit_Framework_TestCase {
+
+       use LabelsChangeOpDeserializationTester;
+       use DescriptionsChangeOpDeserializationTester;
 
        public function testCreateEntityChangeOp() {
                $changeRequest = [
@@ -40,54 +51,6 @@
                        $this->getLabelsChangeOpDeserializerWithChangeRequest( 
$changeRequest ),
                        
$this->getDescriptionsChangeOpDeserializerWithChangeRequest( $changeRequest ),
                        $this->getClaimsChangeOpDeserializerWithChangeRequest( 
$changeRequest )
-               );
-
-               $mediaInfoChangeOpDeserializer->createEntityChangeOp( 
$changeRequest );
-       }
-
-       public function testCreateEntityChangeOp_onlyLabelChange() {
-               $changeRequest = [
-                       'labels' => [
-                               'en' => [ 'language' => 'en', 'value' => 
'kitten' ],
-                       ],
-               ];
-
-               $descriptionsChangeOpDeserializer = 
$this->getDescriptionsChangeOpDeserializer();
-               $descriptionsChangeOpDeserializer->expects( $this->never() )
-                       ->method( 'createEntityChangeOp' );
-
-               $claimsChangeOpDeserializer = 
$this->getClaimsChangeOpDeserializer();
-               $claimsChangeOpDeserializer->expects( $this->never() )
-                       ->method( 'createEntityChangeOp' );
-
-               $mediaInfoChangeOpDeserializer = new 
MediaInfoChangeOpDeserializer(
-                       $this->getLabelsChangeOpDeserializerWithChangeRequest( 
$changeRequest ),
-                       $descriptionsChangeOpDeserializer,
-                       $claimsChangeOpDeserializer
-               );
-
-               $mediaInfoChangeOpDeserializer->createEntityChangeOp( 
$changeRequest );
-       }
-
-       public function testCreateEntityChangeOp_onlyDescriptionChange() {
-               $changeRequest = [
-                       'descriptions' => [
-                               'en' => [ 'language' => 'en', 'value' => 'young 
cat' ],
-                       ],
-               ];
-
-               $labelsChangeOpDeserializer = 
$this->getLabelsChangeOpDeserializer();
-               $labelsChangeOpDeserializer->expects( $this->never() )
-                       ->method( 'createEntityChangeOp' );
-
-               $claimsChangeOpDeserializer = 
$this->getClaimsChangeOpDeserializer();
-               $claimsChangeOpDeserializer->expects( $this->never() )
-                       ->method( 'createEntityChangeOp' );
-
-               $mediaInfoChangeOpDeserializer = new 
MediaInfoChangeOpDeserializer(
-                       $labelsChangeOpDeserializer,
-                       
$this->getDescriptionsChangeOpDeserializerWithChangeRequest( $changeRequest ),
-                       $claimsChangeOpDeserializer
                );
 
                $mediaInfoChangeOpDeserializer->createEntityChangeOp( 
$changeRequest );
@@ -228,4 +191,32 @@
                        ->getMock();
        }
 
+       /**
+        * @return MediaInfoChangeOpDeserializer
+        */
+       public function getChangeOpDeserializer() {
+               $mockProvider = new ChangeOpTestMockProvider( $this );
+
+               return new MediaInfoChangeOpDeserializer(
+                       new LabelsChangeOpDeserializer(
+                               new FingerprintChangeOpFactory( 
$mockProvider->getMockTermValidatorFactory() ),
+                               new StringNormalizer(),
+                               new TermChangeOpSerializationValidator( new 
StaticContentLanguages( [ 'en' ] ) )
+                       ),
+                       new DescriptionsChangeOpDeserializer(
+                               new FingerprintChangeOpFactory( 
$mockProvider->getMockTermValidatorFactory() ),
+                               new StringNormalizer(),
+                               new TermChangeOpSerializationValidator( new 
StaticContentLanguages( [ 'en' ] ) )
+                       ),
+                       $this->getClaimsChangeOpDeserializer()
+               );
+       }
+
+       /**
+        * @return MediaInfo
+        */
+       public function getEntity() {
+               return new MediaInfo();
+       }
+
 }
diff --git 
a/extensions/MediaInfo/tests/phpunit/mediawiki/View/MediaInfoViewTest.php 
b/extensions/MediaInfo/tests/phpunit/mediawiki/View/MediaInfoViewTest.php
index f71c08e..4aedfbc 100644
--- a/extensions/MediaInfo/tests/phpunit/mediawiki/View/MediaInfoViewTest.php
+++ b/extensions/MediaInfo/tests/phpunit/mediawiki/View/MediaInfoViewTest.php
@@ -4,6 +4,7 @@
 
 use InvalidArgumentException;
 use MediaWiki\Linker\LinkRenderer;
+use PHPUnit_Framework_MockObject_MockObject;
 use PHPUnit_Framework_TestCase;
 use Title;
 use Wikibase\DataModel\Entity\EntityDocument;
@@ -43,12 +44,10 @@
        }
 
        /**
-        * @return EntityTermsView
+        * @return EntityTermsView|PHPUnit_Framework_MockObject_MockObject
         */
        private function newEntityTermsViewMock() {
-               return $this->getMockBuilder( EntityTermsView::class )
-                       ->disableOriginalConstructor()
-                       ->getMock();
+               return $this->getMock( EntityTermsView::class );
        }
 
        /**
diff --git a/extensions/Wikibase/repo/includes/WikibaseRepo.php 
b/extensions/Wikibase/repo/includes/WikibaseRepo.php
index d31c416..f742288 100644
--- a/extensions/Wikibase/repo/includes/WikibaseRepo.php
+++ b/extensions/Wikibase/repo/includes/WikibaseRepo.php
@@ -1853,6 +1853,9 @@
 
                                                // T151129
                                                'moe',
+
+                                               // T160531
+                                               'umu',
                                        ) )
                                ),
 
diff --git a/vendor/composer/autoload_classmap.php 
b/vendor/composer/autoload_classmap.php
index 165481b..1493843 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -238,6 +238,7 @@
     'ValueValidators\\ValueValidatorObject' => $vendorDir . 
'/data-values/interfaces/src/ValueValidators/ValueValidatorObject.php',
     'WikibaseQualityConstraintsHooks' => $baseDir . 
'/extensions/Constraints/WikibaseQualityConstraintsHooks.php',
     'WikibaseQualityExternalValidationHooks' => $baseDir . 
'/extensions/ExternalValidation/WikibaseQualityExternalValidationHooks.php',
+    'WikibaseQuality\\ConstraintReport\\Api\\CheckConstraints' => $baseDir . 
'/extensions/Constraints/api/CheckConstraints.php',
     'WikibaseQuality\\ConstraintReport\\Constraint' => $baseDir . 
'/extensions/Constraints/includes/Constraint.php',
     
'WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Checker\\CommonsLinkChecker'
 => $baseDir . 
'/extensions/Constraints/includes/ConstraintCheck/Checker/CommonsLinkChecker.php',
     
'WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Checker\\ConflictsWithChecker'
 => $baseDir . 
'/extensions/Constraints/includes/ConstraintCheck/Checker/ConflictsWithChecker.php',
@@ -266,10 +267,12 @@
     
'WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Helper\\ValueCountCheckerHelper'
 => $baseDir . 
'/extensions/Constraints/includes/ConstraintCheck/Helper/ValueCountCheckerHelper.php',
     'WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Result\\CheckResult' 
=> $baseDir . 
'/extensions/Constraints/includes/ConstraintCheck/Result/CheckResult.php',
     'WikibaseQuality\\ConstraintReport\\ConstraintLookup' => $baseDir . 
'/extensions/Constraints/includes/ConstraintLookup.php',
+    'WikibaseQuality\\ConstraintReport\\ConstraintParameterRenderer' => 
$baseDir . '/extensions/Constraints/includes/ConstraintParameterRenderer.php',
     'WikibaseQuality\\ConstraintReport\\ConstraintReportFactory' => $baseDir . 
'/extensions/Constraints/includes/ConstraintReportFactory.php',
     'WikibaseQuality\\ConstraintReport\\ConstraintRepository' => $baseDir . 
'/extensions/Constraints/includes/ConstraintRepository.php',
     'WikibaseQuality\\ConstraintReport\\Maintenance\\UpdateConstraintsTable' 
=> $baseDir . '/extensions/Constraints/maintenance/UpdateConstraintsTable.php',
     'WikibaseQuality\\ConstraintReport\\Specials\\SpecialConstraintReport' => 
$baseDir . '/extensions/Constraints/specials/SpecialConstraintReport.php',
+    'WikibaseQuality\\ConstraintReport\\Tests\\Api\\CheckConstraintsTest' => 
$baseDir . '/extensions/Constraints/tests/phpunit/Api/CheckConstraintsTest.php',
     'WikibaseQuality\\ConstraintReport\\Tests\\ConstraintRepositoryTest' => 
$baseDir . '/extensions/Constraints/tests/phpunit/ConstraintRepositoryTest.php',
     'WikibaseQuality\\ConstraintReport\\Tests\\ConstraintTest' => $baseDir . 
'/extensions/Constraints/tests/phpunit/ConstraintTest.php',
     'WikibaseQuality\\ConstraintReport\\Tests\\Fake\\FakeChecker' => $baseDir 
. '/extensions/Constraints/tests/phpunit/Fake/FakeChecker.php',
diff --git a/vendor/composer/autoload_psr4.php 
b/vendor/composer/autoload_psr4.php
index 8a37430..a2da043 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -35,6 +35,7 @@
     'WikibaseQuality\\ConstraintReport\\Tests\\' => array($baseDir . 
'/extensions/Constraints/tests/phpunit'),
     'WikibaseQuality\\ConstraintReport\\Specials\\' => array($baseDir . 
'/extensions/Constraints/specials'),
     'WikibaseQuality\\ConstraintReport\\Maintenance\\' => array($baseDir . 
'/extensions/Constraints/maintenance'),
+    'WikibaseQuality\\ConstraintReport\\Api\\' => array($baseDir . 
'/extensions/Constraints/api'),
     'WikibaseQuality\\ConstraintReport\\' => array($baseDir . 
'/extensions/Constraints/includes'),
     'WikibaseQuality\\Api\\' => array($baseDir . '/extensions/Quality/api'),
     'WikibaseQuality\\' => array($baseDir . '/extensions/Quality/includes'),
diff --git a/vendor/composer/autoload_static.php 
b/vendor/composer/autoload_static.php
index ea7ac72..885fa9a 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -60,6 +60,7 @@
             'WikibaseQuality\\ConstraintReport\\Tests\\' => 39,
             'WikibaseQuality\\ConstraintReport\\Specials\\' => 42,
             'WikibaseQuality\\ConstraintReport\\Maintenance\\' => 45,
+            'WikibaseQuality\\ConstraintReport\\Api\\' => 37,
             'WikibaseQuality\\ConstraintReport\\' => 33,
             'WikibaseQuality\\Api\\' => 20,
             'WikibaseQuality\\' => 16,
@@ -216,6 +217,10 @@
         'WikibaseQuality\\ConstraintReport\\Maintenance\\' => 
         array (
             0 => __DIR__ . '/../..' . '/extensions/Constraints/maintenance',
+        ),
+        'WikibaseQuality\\ConstraintReport\\Api\\' => 
+        array (
+            0 => __DIR__ . '/../..' . '/extensions/Constraints/api',
         ),
         'WikibaseQuality\\ConstraintReport\\' => 
         array (
@@ -551,6 +556,7 @@
         'ValueValidators\\ValueValidatorObject' => __DIR__ . '/..' . 
'/data-values/interfaces/src/ValueValidators/ValueValidatorObject.php',
         'WikibaseQualityConstraintsHooks' => __DIR__ . '/../..' . 
'/extensions/Constraints/WikibaseQualityConstraintsHooks.php',
         'WikibaseQualityExternalValidationHooks' => __DIR__ . '/../..' . 
'/extensions/ExternalValidation/WikibaseQualityExternalValidationHooks.php',
+        'WikibaseQuality\\ConstraintReport\\Api\\CheckConstraints' => __DIR__ 
. '/../..' . '/extensions/Constraints/api/CheckConstraints.php',
         'WikibaseQuality\\ConstraintReport\\Constraint' => __DIR__ . '/../..' 
. '/extensions/Constraints/includes/Constraint.php',
         
'WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Checker\\CommonsLinkChecker'
 => __DIR__ . '/../..' . 
'/extensions/Constraints/includes/ConstraintCheck/Checker/CommonsLinkChecker.php',
         
'WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Checker\\ConflictsWithChecker'
 => __DIR__ . '/../..' . 
'/extensions/Constraints/includes/ConstraintCheck/Checker/ConflictsWithChecker.php',
@@ -579,10 +585,12 @@
         
'WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Helper\\ValueCountCheckerHelper'
 => __DIR__ . '/../..' . 
'/extensions/Constraints/includes/ConstraintCheck/Helper/ValueCountCheckerHelper.php',
         
'WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Result\\CheckResult' => 
__DIR__ . '/../..' . 
'/extensions/Constraints/includes/ConstraintCheck/Result/CheckResult.php',
         'WikibaseQuality\\ConstraintReport\\ConstraintLookup' => __DIR__ . 
'/../..' . '/extensions/Constraints/includes/ConstraintLookup.php',
+        'WikibaseQuality\\ConstraintReport\\ConstraintParameterRenderer' => 
__DIR__ . '/../..' . 
'/extensions/Constraints/includes/ConstraintParameterRenderer.php',
         'WikibaseQuality\\ConstraintReport\\ConstraintReportFactory' => 
__DIR__ . '/../..' . 
'/extensions/Constraints/includes/ConstraintReportFactory.php',
         'WikibaseQuality\\ConstraintReport\\ConstraintRepository' => __DIR__ . 
'/../..' . '/extensions/Constraints/includes/ConstraintRepository.php',
         
'WikibaseQuality\\ConstraintReport\\Maintenance\\UpdateConstraintsTable' => 
__DIR__ . '/../..' . 
'/extensions/Constraints/maintenance/UpdateConstraintsTable.php',
         'WikibaseQuality\\ConstraintReport\\Specials\\SpecialConstraintReport' 
=> __DIR__ . '/../..' . 
'/extensions/Constraints/specials/SpecialConstraintReport.php',
+        'WikibaseQuality\\ConstraintReport\\Tests\\Api\\CheckConstraintsTest' 
=> __DIR__ . '/../..' . 
'/extensions/Constraints/tests/phpunit/Api/CheckConstraintsTest.php',
         'WikibaseQuality\\ConstraintReport\\Tests\\ConstraintRepositoryTest' 
=> __DIR__ . '/../..' . 
'/extensions/Constraints/tests/phpunit/ConstraintRepositoryTest.php',
         'WikibaseQuality\\ConstraintReport\\Tests\\ConstraintTest' => __DIR__ 
. '/../..' . '/extensions/Constraints/tests/phpunit/ConstraintTest.php',
         'WikibaseQuality\\ConstraintReport\\Tests\\Fake\\FakeChecker' => 
__DIR__ . '/../..' . 
'/extensions/Constraints/tests/phpunit/Fake/FakeChecker.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index c788aa6..a02e270 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1358,12 +1358,12 @@
         "source": {
             "type": "git",
             "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-            "reference": "5023d440478a34e76a10d6a9458044a9f1a7d2cb"
+            "reference": "a0bf5150f983fcd826f976dc17756c7e6b4ad797"
         },
         "dist": {
             "type": "zip",
-            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/5023d440478a34e76a10d6a9458044a9f1a7d2cb";,
-            "reference": "5023d440478a34e76a10d6a9458044a9f1a7d2cb",
+            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/a0bf5150f983fcd826f976dc17756c7e6b4ad797";,
+            "reference": "a0bf5150f983fcd826f976dc17756c7e6b4ad797",
             "shasum": ""
         },
         "require": {
@@ -1395,7 +1395,7 @@
             "jakub-onderka/php-parallel-lint": ">=0.3 <0.10",
             "mediawiki/mediawiki-codesniffer": ">=0.4 <0.8"
         },
-        "time": "2017-04-11 21:13:05",
+        "time": "2017-04-12 20:11:47",
         "type": "mediawiki-extension",
         "installation-source": "dist",
         "autoload": {
@@ -1613,7 +1613,7 @@
         "source": {
             "type": "git",
             "url": 
"https://gerrit.wikimedia.org/r/mediawiki/extensions/WikibaseMediaInfo";,
-            "reference": "0a5def314cdb02dad1fedc262db501cd5ce00bf9"
+            "reference": "138807317e8f6f56d071cc3f86b6e199ac3fef05"
         },
         "require": {
             "php": ">=5.5.0",
@@ -1627,7 +1627,7 @@
             "mediawiki/mediawiki-codesniffer": "0.6.0",
             "phpunit/phpunit": "~4.8"
         },
-        "time": "2017-04-11 19:05:07",
+        "time": "2017-04-12 14:09:13",
         "type": "mediawiki-extension",
         "installation-source": "source",
         "autoload": {
@@ -1780,7 +1780,7 @@
         "source": {
             "type": "git",
             "url": 
"https://gerrit.wikimedia.org/r/mediawiki/extensions/WikibaseQualityConstraints";,
-            "reference": "dc74e18274838fd769ab6ef5cbde926a80caff68"
+            "reference": "43848706dee5965c7e4645a92780c5b18e1f1c19"
         },
         "require": {
             "php": ">=5.5.9",
@@ -1793,12 +1793,13 @@
             "phpunit/phpunit": "^3.7.37|~4.5",
             "satooshi/php-coveralls": "master-dev"
         },
-        "time": "2017-03-07 12:44:28",
+        "time": "2017-04-12 12:47:12",
         "type": "mediawiki-extension",
         "installation-source": "source",
         "autoload": {
             "psr-4": {
                 "WikibaseQuality\\ConstraintReport\\": "includes/",
+                "WikibaseQuality\\ConstraintReport\\Api\\": "api/",
                 "WikibaseQuality\\ConstraintReport\\Specials\\": "specials/",
                 "WikibaseQuality\\ConstraintReport\\Tests\\": "tests/phpunit/",
                 "WikibaseQuality\\ConstraintReport\\Maintenance\\": 
"maintenance/"

-- 
To view, visit https://gerrit.wikimedia.org/r/348054
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Iedd4207e1a7e150d269bceba32ad10cae736ba7d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikidata
Gerrit-Branch: master
Gerrit-Owner: WikidataBuilder <[email protected]>
Gerrit-Reviewer: Aude <[email protected]>
Gerrit-Reviewer: Umherirrender <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to