jenkins-bot has submitted this change and it was merged.

Change subject: Refactor setclaim to use changeops
......................................................................


Refactor setclaim to use changeops

This is the final api modules that was not using
changeops! Now it does!

Change-Id: I80dce3af7fec3e4c922ada87646be581873267f9
---
M repo/includes/ChangeOp/ChangeOpClaim.php
M repo/includes/api/ModifyClaim.php
M repo/includes/api/SetClaim.php
M repo/tests/phpunit/includes/api/SetClaimTest.php
4 files changed, 115 insertions(+), 156 deletions(-)

Approvals:
  Daniel Kinzler: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/repo/includes/ChangeOp/ChangeOpClaim.php 
b/repo/includes/ChangeOp/ChangeOpClaim.php
index 6f3e540..0f4576e 100644
--- a/repo/includes/ChangeOp/ChangeOpClaim.php
+++ b/repo/includes/ChangeOp/ChangeOpClaim.php
@@ -4,6 +4,7 @@
 
 use InvalidArgumentException;
 use Wikibase\Claim;
+use Wikibase\Claims;
 use Wikibase\Entity;
 use Wikibase\Lib\ClaimGuidGenerator;
 use Wikibase\Lib\ClaimGuidValidator;
@@ -65,8 +66,7 @@
                if( $this->claim->getGuid() === null ){
                        $this->claim->setGuid( $this->guidGenerator->newGuid() 
);
                }
-               $guid = $this->claim->getGuid();
-               $guid = $guidParser->parse( $guid );
+               $guid = $guidParser->parse( $this->claim->getGuid() );
 
                if ( $guidValidator->validate( $guid->getSerialization() ) === 
false ) {
                        throw new ChangeOpException( "Claim does not have a 
valid GUID" );
@@ -74,8 +74,15 @@
                        throw new ChangeOpException( "Claim GUID invalid for 
given entity" );
                }
 
-               $entity->addClaim( $this->claim );
-               $this->updateSummary( $summary, 'add' );
+               $claims = new Claims( $entity->getClaims() );
+               if( $claims->hasClaimWithGuid( $guid->getSerialization() ) ){
+                       $claims->removeClaimWithGuid( $guid->getSerialization() 
);
+                       $this->updateSummary( $summary, 'update' );
+               } else {
+                       $this->updateSummary( $summary, 'create' );
+               }
+               $claims->addClaim( $this->claim );
+               $entity->setClaims( $claims );
 
                return true;
        }
diff --git a/repo/includes/api/ModifyClaim.php 
b/repo/includes/api/ModifyClaim.php
index 3b83d6c..851cbc3 100644
--- a/repo/includes/api/ModifyClaim.php
+++ b/repo/includes/api/ModifyClaim.php
@@ -39,12 +39,19 @@
        protected $claimGuidParser;
 
        /**
+        * @since 0.5
+        *
+        * @var SnakValidationHelper
+        */
+       protected $snakValidation;
+
+       /**
         * see ApiBase::__construct()
         */
        public function __construct( ApiMain $mainModule, $moduleName, 
$modulePrefix = '' ) {
                parent::__construct( $mainModule, $moduleName, $modulePrefix );
 
-               $snakValidation = new SnakValidationHelper(
+               $this->snakValidation = new SnakValidationHelper(
                        $this,
                        
WikibaseRepo::getDefaultInstance()->getPropertyDataTypeLookup(),
                        
WikibaseRepo::getDefaultInstance()->getDataTypeFactory(),
@@ -57,7 +64,7 @@
                        
WikibaseRepo::getDefaultInstance()->getSnakConstructionService(),
                        WikibaseRepo::getDefaultInstance()->getEntityIdParser(),
                        
WikibaseRepo::getDefaultInstance()->getClaimGuidValidator(),
-                       $snakValidation
+                       $this->snakValidation
                );
 
                $this->claimGuidParser = 
WikibaseRepo::getDefaultInstance()->getClaimGuidParser();
diff --git a/repo/includes/api/SetClaim.php b/repo/includes/api/SetClaim.php
index beb29ba..d29a737 100644
--- a/repo/includes/api/SetClaim.php
+++ b/repo/includes/api/SetClaim.php
@@ -2,62 +2,39 @@
 
 namespace Wikibase\Api;
 
-use DataValues\IllegalValueException;
 use ApiMain;
+use ApiBase;
+use MWException;
+use DataValues\IllegalValueException;
 use Diff\Comparer\ComparableComparer;
 use Diff\OrderedListDiffer;
-use MWException;
-use ApiBase;
+use FormatJson;
 use Diff\ListDiffer;
 use ValueFormatters\FormatterOptions;
-use ValueFormatters\ValueFormatter;
+use Wikibase\ChangeOp\ChangeOpClaim;
+use Wikibase\ChangeOp\ChangeOpException;
+use Wikibase\ClaimDiffer;
+use Wikibase\Claims;
+use Wikibase\ClaimSummaryBuilder;
 use Wikibase\EntityContent;
 use Wikibase\Claim;
 use Wikibase\EntityContentFactory;
-use Wikibase\ClaimDiffer;
-use Wikibase\ClaimSaver;
-use Wikibase\ClaimSummaryBuilder;
+use Wikibase\Lib\ClaimGuidGenerator;
+use Wikibase\Lib\Serializers\SerializerFactory;
 use Wikibase\Lib\SnakFormatter;
 use Wikibase\Repo\WikibaseRepo;
 use Wikibase\Summary;
-use Wikibase\Validators\ValidatorErrorLocalizer;
 
 /**
  * API module for creating or updating an entire Claim.
  *
  * @since 0.4
- *
- * @ingroup WikibaseRepo
- * @ingroup API
- *
  * @licence GNU GPL v2+
  * @author Jeroen De Dauw < [email protected] >
  * @author Tobias Gritschacher < [email protected] >
+ * @author Adam Shorland
  */
-class SetClaim extends ApiWikibase {
-
-       /**
-        * @var SnakValidationHelper
-        */
-       protected $snakValidation;
-
-       /**
-        * see ApiBase::__construct()
-        *
-        * @param ApiMain $mainModule
-        * @param string  $moduleName
-        * @param string  $modulePrefix
-        */
-       public function __construct( ApiMain $mainModule, $moduleName, 
$modulePrefix = '' ) {
-               parent::__construct( $mainModule, $moduleName, $modulePrefix );
-
-               $this->snakValidation = new SnakValidationHelper(
-                       $this,
-                       
WikibaseRepo::getDefaultInstance()->getPropertyDataTypeLookup(),
-                       
WikibaseRepo::getDefaultInstance()->getDataTypeFactory(),
-                       new ValidatorErrorLocalizer()
-               );
-       }
+class SetClaim extends ModifyClaim {
 
        /**
         * @see ApiBase::execute
@@ -65,95 +42,79 @@
         * @since 0.4
         */
        public function execute() {
-               $claim = $this->getClaimFromRequest();
-
+               $params = $this->extractRequestParams();
+               $claim = $this->getClaimFromParams( $params );
                $this->snakValidation->validateClaimSnaks( $claim );
 
-               $claimDiffer = new ClaimDiffer( new OrderedListDiffer( new 
ComparableComparer() ) );
+               $guid = $claim->getGuid();
+               if( $guid === null ){
+                       $this->dieUsage( 'GUID must be set when setting a 
claim', 'invalid-claim' );
+               }
+               $guid = $this->claimGuidParser->parse( $guid );
 
-               $options = new FormatterOptions( array(
-                       //TODO: fallback chain
-                       ValueFormatter::OPT_LANG => 
$this->getContext()->getLanguage()->getCode()
-               ) );
+               $entityId = $guid->getEntityId();
+               $entityContentFactory = 
WikibaseRepo::getDefaultInstance()->getEntityContentFactory();
+               $entityContent = $entityContentFactory->getFromId( $entityId );
+               $entity = $entityContent->getEntity();
+               $summary = $this->getSummary( $params, $claim, $entityContent );
 
-               $claimSummaryBuilder = new ClaimSummaryBuilder(
-                       $this->getModuleName(),
-                       $claimDiffer,
-                       
WikibaseRepo::getDefaultInstance()->getSnakFormatterFactory()->getSnakFormatter(
 SnakFormatter::FORMAT_PLAIN, $options )
-               );
-               $claimSaver = new ClaimSaver();
-
-               $params = $this->extractRequestParams();
-
-               $baseRevisionId = isset( $params['baserevid'] ) ? intval( 
$params['baserevid'] ) : null;
-               $token = isset( $params['token'] ) ? $params['token'] : '';
-
-               $user = $this->getUser();
-               $flags = ( $user->isAllowed( 'bot' ) && $params['bot'] ) ? 
EDIT_FORCE_BOT : 0;
-
-               $newRevisionId = null;
-
-               $status = $claimSaver->saveClaim(
-                       $claim,
-                       $baseRevisionId,
-                       $token,
-                       $user,
-                       $claimSummaryBuilder,
-                       $flags
-               );
-               $this->handleSaveStatus( $status ); // die on error, report 
warnings, etc
-
-               $statusValue = $status->getValue();
-               $newRevisionId = isset( $statusValue['revision'] ) ? 
$statusValue['revision']->getId() : null;
-
-               if ( $newRevisionId !== null ) {
-                       $this->getResult()->addValue( null, 'success', 1 );
-                       $this->getResult()->addValue(
-                               'pageinfo',
-                               'lastrevid',
-                               $newRevisionId
-                       );
+               $changeop = new ChangeOpClaim( $claim , new ClaimGuidGenerator( 
$guid->getEntityId() ) );
+               try{
+                       $changeop->apply( $entity, $summary );
+               } catch( ChangeOpException $exception ){
+                       $this->dieUsage( 'Failed to apply changeOp:' . 
$exception->getMessage(), 'save-failed' );
                }
 
-               $this->outputClaim( $claim );
+               $this->saveChanges( $entityContent, $summary );
+               $this->claimModificationHelper->addClaimToApiResult( $claim );
+       }
+
+       /**
+        * @param array $params
+        * @param Claim $claim
+        * @param EntityContent $entityContent
+        * @return Summary
+        * @todo this summary builder is ugly and summary stuff needs to be 
refactored
+        */
+       protected function getSummary( array $params, Claim $claim, 
EntityContent $entityContent ){
+               $claimSummaryBuilder = new ClaimSummaryBuilder(
+                       $this->getModuleName(),
+                       new ClaimDiffer( new OrderedListDiffer( new 
ComparableComparer() ) ),
+                       
WikibaseRepo::getDefaultInstance()->getSnakFormatterFactory()->getSnakFormatter(
+                               SnakFormatter::FORMAT_PLAIN,
+                               new FormatterOptions()
+                       )
+               );
+               $summary = $claimSummaryBuilder->buildClaimSummary(
+                       new Claims( $entityContent->getEntity()->getClaims() ),
+                       $claim
+               );
+               if ( isset( $params['summary'] ) ) {
+                       $summary->setUserSummary( $params['summary'] );
+               }
+               return $summary;
        }
 
        /**
         * @since 0.4
-        *
+        * @param array $params
         * @return Claim
         */
-       protected function getClaimFromRequest() {
-               $serializerFactory = new 
\Wikibase\Lib\Serializers\SerializerFactory();
+       protected function getClaimFromParams( array $params ) {
+               $serializerFactory = new SerializerFactory();
                $unserializer = $serializerFactory->newUnserializerForClass( 
'Wikibase\Claim' );
 
-               $params = $this->extractRequestParams();
-
                try {
-                       $claim = $unserializer->newFromSerialization( 
\FormatJson::decode( $params['claim'], true ) );
-
-                       assert( $claim instanceof Claim );
+                       $claim = $unserializer->newFromSerialization( 
FormatJson::decode( $params['claim'], true ) );
+                       if( !$claim instanceof Claim ) {
+                               $this->dieUsage( 'Failed to get claim from 
claim Serialization', 'invalid-claim' );
+                       }
                        return $claim;
                } catch ( IllegalValueException $illegalValueException ) {
                        $this->dieUsage( $illegalValueException->getMessage(), 
'invalid-claim' );
+               } catch( MWException $mwException ) {
+                       $this->dieUsage( 'Failed to get claim from claim 
Serialization ' . $mwException->getMessage(), 'invalid-claim' );
                }
-       }
-
-       /**
-        * @since 0.4
-        *
-        * @param Claim $claim
-        */
-       protected function outputClaim( Claim $claim ) {
-               $serializerFactory = new 
\Wikibase\Lib\Serializers\SerializerFactory();
-               $serializer = $serializerFactory->newSerializerForObject( 
$claim );
-               $serializer->getOptions()->setIndexTags( 
$this->getResult()->getIsRawMode() );
-
-               $this->getResult()->addValue(
-                       null,
-                       'claim',
-                       $serializer->getSerialized( $claim )
-               );
        }
 
        /**
@@ -164,16 +125,14 @@
         * @return array
         */
        public function getAllowedParams() {
-               return array(
-                       'claim' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true,
+               return array_merge(
+                       array(
+                               'claim' => array(
+                                       ApiBase::PARAM_TYPE => 'string',
+                                       ApiBase::PARAM_REQUIRED => true
+                               )
                        ),
-                       'token' => null,
-                       'baserevid' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'bot' => false,
+                       parent::getAllowedParams()
                );
        }
 
@@ -194,15 +153,11 @@
         * @return array
         */
        public function getParamDescription() {
-               return array(
-                       'claim' => 'Claim serialization',
-                       'token' => 'An "edittoken" token previously obtained 
through the token module (prop=info).',
-                       'baserevid' => array( 'The numeric identifier for the 
revision to base the modification on.',
-                               "This is used for detecting conflicts during 
save."
-                       ),
-                       'bot' => array( 'Mark this edit as bot',
-                               'This URL flag will only be respected if the 
user belongs to the group "bot".'
-                       ),
+               return array_merge(
+                       parent::getParamDescription(),
+                       array(
+                               'claim' => 'Claim serialization'
+                       )
                );
        }
 
@@ -231,14 +186,6 @@
                        
'api.php?action=wbsetclaim&claim={"id":"Q2$5627445f-43cb-ed6d-3adb-760e85bd17ee","type":"claim","mainsnak":{"snaktype":"value","property":"P1","datavalue":{"value":"City","type":"string"}}}'
                        => 'Set the claim with the given id to property P1 with 
a string value of "City',
                );
-       }
-
-       /**
-        * @see ApiBase::isWriteMode
-        * @return bool true
-        */
-       public function isWriteMode() {
-               return true;
        }
 
 }
diff --git a/repo/tests/phpunit/includes/api/SetClaimTest.php 
b/repo/tests/phpunit/includes/api/SetClaimTest.php
index dd09006..383118f 100644
--- a/repo/tests/phpunit/includes/api/SetClaimTest.php
+++ b/repo/tests/phpunit/includes/api/SetClaimTest.php
@@ -2,6 +2,7 @@
 
 namespace Wikibase\Test\Api;
 
+use FormatJson;
 use Wikibase\Claim;
 use Wikibase\Claims;
 use Wikibase\DataModel\Entity\PropertyId;
@@ -126,7 +127,7 @@
        public function testAddClaim( Claim $claim ) {
                $item = Item::newEmpty();
                $content = new ItemContent( $item );
-               $content->save( '', null, EDIT_NEW );
+               $content->save( 'setclaimtest', null, EDIT_NEW );
 
                $guidGenerator = new ClaimGuidGenerator( $item->getId() );
                $guid = $guidGenerator->newGuid();
@@ -134,7 +135,7 @@
                $claim->setGuid( $guid );
 
                // Addition request
-               $this->makeRequest( $claim, $item->getId(), 1 );
+               $this->makeRequest( $claim, $item->getId(), 1, 'addition 
request' );
 
                // Reorder qualifiers
                if( count( $claim->getQualifiers() ) > 0 ) {
@@ -146,54 +147,51 @@
                        $serializedClaim = $serializer->getSerialized( $claim );
                        $firstPropertyId = array_shift( 
$serializedClaim['qualifiers-order'] );
                        array_push( $serializedClaim['qualifiers-order'], 
$firstPropertyId );
-                       $this->makeRequest( $serializedClaim, $item->getId(), 1 
);
+                       $this->makeRequest( $serializedClaim, $item->getId(), 
1, 'reorder qualifiers' );
                }
 
                $claim = new Statement( new PropertyNoValueSnak( 9001 ) );
                $claim->setGuid( $guid );
 
                // Update request
-               $this->makeRequest( $claim, $item->getId(), 1 );
+               $this->makeRequest( $claim, $item->getId(), 1, 'update request' 
);
        }
 
        /**
         * @param Claim|array $claim Native or serialized claim object.
         * @param EntityId $entityId
         * @param $claimCount
+        * @param $requestLabel string a label to identify requests that are 
made in errors
         */
-       protected function makeRequest( $claim, EntityId $entityId, $claimCount 
) {
+       protected function makeRequest( $claim, EntityId $entityId, 
$claimCount, $requestLabel ) {
                $serializerFactory = new SerializerFactory();
 
                if( is_a( $claim, '\Wikibase\Claim' ) ) {
-                       $serializer = 
$serializerFactory->newSerializerForObject( $claim );
-                       $serializedClaim = $serializer->getSerialized( $claim );
+                       $unserializer = 
$serializerFactory->newSerializerForObject( $claim );
+                       $serializedClaim = $unserializer->getSerialized( $claim 
);
                } else {
-                       $serializer = 
$serializerFactory->newUnserializerForClass( 'Wikibase\Claim' );
+                       $unserializer = 
$serializerFactory->newUnserializerForClass( 'Wikibase\Claim' );
                        $serializedClaim = $claim;
-                       $claim = $serializer->newFromSerialization( 
$serializedClaim );
+                       $claim = $unserializer->newFromSerialization( 
$serializedClaim );
                }
 
-               $params = array(
+               $this->makeValidRequest( array(
                        'action' => 'wbsetclaim',
-                       'claim' => \FormatJson::encode( $serializedClaim ),
-               );
-
-               $this->makeValidRequest( $params );
+                       'claim' => FormatJson::encode( $serializedClaim ),
+               ) );
 
                $content = 
WikibaseRepo::getDefaultInstance()->getEntityContentFactory()->getFromId( 
$entityId );
-
                $this->assertInstanceOf( '\Wikibase\EntityContent', $content );
 
                $claims = new Claims( $content->getEntity()->getClaims() );
-
-               $this->assertTrue( $claims->hasClaim( $claim ) );
+               $this->assertTrue( $claims->hasClaim( $claim ), "Claims list 
does not have claim after {$requestLabel}" );
 
                $savedClaim = $claims->getClaimWithGuid( $claim->getGuid() );
                if( count( $claim->getQualifiers() ) ) {
                        $this->assertArrayEquals( 
$claim->getQualifiers()->toArray(), $savedClaim->getQualifiers()->toArray(), 
true );
                }
 
-               $this->assertEquals( $claimCount, $claims->count() );
+               $this->assertEquals( $claimCount, $claims->count(), "Claims 
count is wrong after {$requestLabel}" );
        }
 
        protected function makeValidRequest( array $params ) {

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I80dce3af7fec3e4c922ada87646be581873267f9
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>
Gerrit-Reviewer: Aude <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: Hoo man <[email protected]>
Gerrit-Reviewer: Jeroen De Dauw <[email protected]>
Gerrit-Reviewer: Tobias Gritschacher <[email protected]>
Gerrit-Reviewer: jenkins-bot

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

Reply via email to