Tobias Gritschacher has uploaded a new change for review.
https://gerrit.wikimedia.org/r/58880
Change subject: Autosummary for setClaim (WIP,DNM)
......................................................................
Autosummary for setClaim (WIP,DNM)
still work in progress!
Bug: 45840
Bug: 45100
Change-Id: I6e90d80fc3d8d579f218a5d77906674e968d126c
---
M repo/Wikibase.i18n.php
M repo/includes/ClaimSaver.php
M repo/includes/api/CreateClaim.php
M repo/includes/api/ModifyClaim.php
M repo/includes/api/RemoveClaims.php
M repo/includes/api/SetClaim.php
6 files changed, 139 insertions(+), 80 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/80/58880/1
diff --git a/repo/Wikibase.i18n.php b/repo/Wikibase.i18n.php
index b298350..cf4e29e 100644
--- a/repo/Wikibase.i18n.php
+++ b/repo/Wikibase.i18n.php
@@ -293,6 +293,9 @@
'wikibase-item-summary-special-create-item' => 'Created an [$2] item
with {{PLURAL:$1|value|values}}',
'wikibase-item-summary-wbcreateclaim-create' => 'Created claim',
'wikibase-item-summary-wbremoveclaims-remove' => 'Removed
{{PLURAL:$3|claim|claims}}',
+ 'wikibase-item-summary-wbsetclaim-update' => 'Changed
{{PLURAL:$3|claim|claims}}',
+ 'wikibase-item-summary-wbsetclaim-create' => 'Created
{{PLURAL:$3|claim|claims}}',
+ 'wikibase-item-summary-wbsetqualifier-update' => 'Changed $1
{{PLURAL:$3|qualifier|qualifiers}}',
// property - summary and autocomment, see docs/summaries.txt
'wikibase-property-summary-wbeditentity-create' => 'Created a new
property',
diff --git a/repo/includes/ClaimSaver.php b/repo/includes/ClaimSaver.php
index 6f54708..fb84657 100644
--- a/repo/includes/ClaimSaver.php
+++ b/repo/includes/ClaimSaver.php
@@ -39,6 +39,22 @@
class ClaimSaver {
/**
+ * @var Summary
+ */
+ protected $summary;
+
+ /**
+ * Constructs a new ClaimSaver
+ *
+ * @since 0.4
+ *
+ * @param Summary|null $summary
+ */
+ public function __construct( $summary = null ) {
+ $this->summary = $summary;
+ }
+
+ /**
* @see ApiBase::execute
*
* @since 0.4
@@ -57,13 +73,13 @@
*
* This status object can be used with
ApiWikibase::handleSaveStatus().
*/
- public function saveClaim( Claim $claim, $baseRevId, $token, User $user
) {
+ public function saveClaim( Claim $claim, ClaimDiffer $claimDiffer,
$baseRevId, $token, User $user ) {
try {
$entityId = $this->getEntityIdForClaim( $claim );
$content = $this->getEntityContent( $entityId,
$baseRevId );
- $this->updateClaim( $content->getEntity(), $claim );
+ $this->updateClaim( $content->getEntity(), $claim,
$claimDiffer );
$status = $this->saveChanges( $content, $baseRevId,
$token, $user );
} catch ( ExceptionWithCode $ex ) {
@@ -116,17 +132,77 @@
*
* @param Entity $entity
* @param Claim $claim
+ * @param ClaimDiffer $claimDiffer
*/
- protected function updateClaim( Entity $entity, Claim $claim ) {
+ protected function updateClaim( Entity $entity, Claim $claim,
ClaimDiffer $claimDiffer ) {
$claims = new \Wikibase\Claims( $entity->getClaims() );
+ $this->summary->addAutoCommentArgs( 1 ); // we're always having
singular here
if ( $claims->hasClaimWithGuid( $claim->getGuid() ) ) {
+ //claim is changed
+ $oldClaim = $claims->getClaimWithGuid(
$claim->getGuid() );
+ $claimDifference = $claimDiffer->diffClaims( $oldClaim,
$claim );
+
+ $this->summary->setAction( 'update' );
+
+ if ( $claimDifference->getMainSnakChange() !== null ) {
+ $summaryArgs = $this->buildSummaryArgs( new
\Wikibase\Claims( array( $claim ) ), array( $claim->getGuid() ) );
+ $this->summary->addAutoSummaryArgs(
$summaryArgs );
+ }
+
+ if ( $claimDifference->getQualifierChanges()->isEmpty()
=== false ) {
+ $pair = array();
+
$pair[$claim->getMainSnak()->getPropertyId()->getPrefixedId()][] = '/*
wikibase-item-summary-wbsetqualifier-update */'; #"Modified qualifiers";
+ $summaryArgs = array( $pair );
+ $this->summary->addAutoSummaryArgs(
$summaryArgs );
+ }
+
$claims->removeClaimWithGuid( $claim->getGuid() );
+ } else {
+ //new claim is added
+ $summaryArgs = $this->buildSummaryArgs( new
\Wikibase\Claims( array( $claim ) ), array( $claim->getGuid() ) );
+ $this->summary->addAutoSummaryArgs( $summaryArgs );
+ $this->summary->setAction( 'create' );
}
$claims->addClaim( $claim );
$entity->setClaims( $claims );
+ }
+
+ /**
+ * Build key (property) => value pairs for summary arguments
+ *
+ * @todo see if this can be more generic and put elsewhere...
+ *
+ * @param Claims $claims
+ * @param string[] $guids
+ *
+ * @return mixed[] // propertyId (prefixed) => array of values
+ */
+ protected function buildSummaryArgs( Claims $claims, array $guids ) {
+ $pairs = array();
+
+ foreach( $guids as $guid ) {
+ if ( $claims->hasClaimWithGuid( $guid ) ) {
+ $snak = $claims->getClaimWithGuid( $guid
)->getMainSnak();
+ $key = $snak->getPropertyId()->getPrefixedId();
+
+ if ( !array_key_exists( $key, $pairs ) ) {
+ $pairs[$key] = array();
+ }
+
+ if ( $snak instanceof PropertyValueSnak ) {
+ $value = $snak->getDataValue();
+ } else {
+ $value = '-'; // todo handle no values
in general way (needed elsewhere)
+ }
+
+ $pairs[$key][] = $value;
+ }
+ }
+
+ return array( $pairs );
}
/**
@@ -175,7 +251,7 @@
$editEntity = new \Wikibase\EditEntity( $content, $user,
$baseRevisionId );
$status = $editEntity->attemptSave(
- '', // TODO: automcomment
+ $this->summary ? $this->summary->toString() : '',
EDIT_UPDATE,
$token
);
diff --git a/repo/includes/api/CreateClaim.php
b/repo/includes/api/CreateClaim.php
index 80da322..78cc90f 100644
--- a/repo/includes/api/CreateClaim.php
+++ b/repo/includes/api/CreateClaim.php
@@ -71,7 +71,8 @@
}
$claim = $this->addClaim( $entityContent->getEntity(), $snak );
- $summary = $this->createSummary( $snak, 'create' );
+ $summary = $this->createSummary( 'create' );
+ $summary->addAutoSummaryArgs( $snak->getPropertyId(),
$snak->getDataValue() );
$this->saveChanges( $entityContent, $summary );
diff --git a/repo/includes/api/ModifyClaim.php
b/repo/includes/api/ModifyClaim.php
index a7892a8..56b474b 100644
--- a/repo/includes/api/ModifyClaim.php
+++ b/repo/includes/api/ModifyClaim.php
@@ -2,6 +2,8 @@
namespace Wikibase\Api;
use ApiBase, MWException;
+use Wikibase\Claims;
+use Wikibase\PropertyValueSnak;
use Wikibase\Snak;
use Wikibase\Summary;
@@ -41,21 +43,54 @@
*
* @since 0.4
*
- * @param Snak $snak
* @param string $action
*
* @return Summary
*/
- protected function createSummary( Snak $snak, $action ) {
+ protected function createSummary( $action ) {
if ( !is_string( $action ) ) {
throw new \MWException( 'action is invalid or unknown
type.' );
}
$summary = new Summary( $this->getModuleName() );
$summary->setAction( $action );
- $summary->addAutoSummaryArgs( $snak->getPropertyId(),
$snak->getDataValue() );
return $summary;
}
+ /**
+ * Build key (property) => value pairs for summary arguments
+ *
+ * @todo see if this can be more generic and put elsewhere...
+ *
+ * @param Claims $claims
+ * @param string[] $guids
+ *
+ * @return mixed[] // propertyId (prefixed) => array of values
+ */
+ protected function buildSummaryArgs( Claims $claims, array $guids ) {
+ $pairs = array();
+
+ foreach( $guids as $guid ) {
+ if ( $claims->hasClaimWithGuid( $guid ) ) {
+ $snak = $claims->getClaimWithGuid( $guid
)->getMainSnak();
+ $key = $snak->getPropertyId()->getPrefixedId();
+
+ if ( !array_key_exists( $key, $pairs ) ) {
+ $pairs[$key] = array();
+ }
+
+ if ( $snak instanceof PropertyValueSnak ) {
+ $value = $snak->getDataValue();
+ } else {
+ $value = '-'; // todo handle no values
in general way (needed elsewhere)
+ }
+
+ $pairs[$key][] = $value;
+ }
+ }
+
+ return array( $pairs );
+ }
+
}
diff --git a/repo/includes/api/RemoveClaims.php
b/repo/includes/api/RemoveClaims.php
index 814454c..6e05bde 100644
--- a/repo/includes/api/RemoveClaims.php
+++ b/repo/includes/api/RemoveClaims.php
@@ -12,7 +12,6 @@
use Wikibase\EntityContentFactory;
use Wikibase\Claims;
use Wikibase\Summary;
-use Wikibase\PropertyValueSnak;
/**
* API module for removing claims.
@@ -40,7 +39,7 @@
* @licence GNU GPL v2+
* @author Jeroen De Dauw < [email protected] >
*/
-class RemoveClaims extends ApiWikibase {
+class RemoveClaims extends ModifyClaim {
// TODO: example
// TODO: rights
@@ -64,73 +63,6 @@
$this->outputResult( $removedClaimKeys );
wfProfileOut( __METHOD__ );
- }
-
- /**
- * Create a summary
- *
- * @since 0.4
- *
- * @param Claims $claims
- * @param string[] $guids
- * @param string $action
- *
- * @return Summary
- */
- protected function createSummary( Claims $claims, array $guids, $action
) {
- if ( !is_string( $action ) ) {
- throw new \MWException( 'action is invalid or unknown
type.' );
- }
-
- $summary = new Summary( $this->getModuleName() );
- $summary->setAction( $action );
-
- $count = count( $guids );
-
- $summary->addAutoCommentArgs( $count );
-
- $summaryArgs = $this->buildSummaryArgs( $claims, $guids );
-
- if ( $summaryArgs !== array() ) {
- $summary->addAutoSummaryArgs( $summaryArgs );
- }
-
- return $summary;
- }
-
- /**
- * Build key (property) => value pairs for summary arguments
- *
- * @todo see if this can be more generic and put elsewhere...
- *
- * @param Claims $claims
- * @param string[] $guids
- *
- * @return mixed[] // propertyId (prefixed) => array of values
- */
- protected function buildSummaryArgs( Claims $claims, array $guids ) {
- $pairs = array();
-
- foreach( $guids as $guid ) {
- if ( $claims->hasClaimWithGuid( $guid ) ) {
- $snak = $claims->getClaimWithGuid( $guid
)->getMainSnak();
- $key = $snak->getPropertyId()->getPrefixedId();
-
- if ( !array_key_exists( $key, $pairs ) ) {
- $pairs[$key] = array();
- }
-
- if ( $snak instanceof PropertyValueSnak ) {
- $value = $snak->getDataValue();
- } else {
- $value = '-'; // todo handle no values
in general way (needed elsewhere)
- }
-
- $pairs[$key][] = $value;
- }
- }
-
- return array( $pairs );
}
/**
@@ -186,7 +118,14 @@
$entity->setClaims( $claims );
- $summary = $this->createSummary( $removedClaims,
$guids[$entity->getPrefixedId()], 'remove' );
+ $summary = $this->createSummary( 'remove' );
+
+ $count = count( $guids[$entity->getPrefixedId()] );
+ $summary->addAutoCommentArgs( $count );
+ $summaryArgs = $this->buildSummaryArgs( $removedClaims,
$guids[$entity->getPrefixedId()] );
+ if ( $summaryArgs !== array() ) {
+ $summary->addAutoSummaryArgs( $summaryArgs );
+ }
$this->saveChanges( $entityContent, $summary );
}
diff --git a/repo/includes/api/SetClaim.php b/repo/includes/api/SetClaim.php
index e191703..fcfb2c4 100644
--- a/repo/includes/api/SetClaim.php
+++ b/repo/includes/api/SetClaim.php
@@ -5,11 +5,15 @@
use MWException;
use ApiBase;
+use Diff\ListDiffer;
+
use Wikibase\EntityContent;
use Wikibase\Claim;
use Wikibase\EntityContentFactory;
+use Wikibase\ClaimDiffer;
use Wikibase\ClaimSaver;
use Wikibase\ExceptionWithCode;
+use Wikibase\Summary;
/**
* API module for creating or updating an entire Claim.
@@ -49,7 +53,8 @@
public function execute() {
$claim = $this->getClaimFromRequest();
- $claimSetter = new ClaimSaver();
+ $claimSaver = new ClaimSaver( new Summary(
$this->getModuleName() ) );
+ $claimDiffer = new ClaimDiffer( new ListDiffer() );
$params = $this->extractRequestParams();
$baseRevisionId = isset( $params['baserevid'] ) ? intval(
$params['baserevid'] ) : null;
@@ -57,7 +62,7 @@
$newRevisionId = null;
- $status = $claimSetter->saveClaim( $claim, $baseRevisionId,
$token, $this->getUser() );
+ $status = $claimSaver->saveClaim( $claim, $claimDiffer,
$baseRevisionId, $token, $this->getUser() );
$this->handleSaveStatus( $status ); // die on error, report
warnings, etc
$statusValue = $status->getValue();
--
To view, visit https://gerrit.wikimedia.org/r/58880
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6e90d80fc3d8d579f218a5d77906674e968d126c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Tobias Gritschacher <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits