Thiemo Mättig (WMDE) has uploaded a new change for review.
https://gerrit.wikimedia.org/r/178922
Change subject: Avoid RegexValidator if possible
......................................................................
Avoid RegexValidator if possible
... and a bit of refactoring, mainly:
* Removing optional parameters.
* MembershipValidator uses strict comparison now.
* Commons file name check is a little bit more strict.
Change-Id: I85e908dfd8ae36a6c6bead024005fadb47837b21
---
M lib/includes/Validators/MembershipValidator.php
M lib/includes/WikibaseDataTypeBuilders.php
2 files changed, 52 insertions(+), 51 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/22/178922/1
diff --git a/lib/includes/Validators/MembershipValidator.php
b/lib/includes/Validators/MembershipValidator.php
index 042d570..aa07154 100644
--- a/lib/includes/Validators/MembershipValidator.php
+++ b/lib/includes/Validators/MembershipValidator.php
@@ -33,17 +33,17 @@
/**
* @param array $allowed The allowed values
* @param string $errorCode Code to use in Errors; should indicate what
kind of value would have been allowed.
- * @param callable|string|null $normalizer An optional function to
normalize the value before
+ * @param callable|null $normalizer An optional function to normalize
the value before
* comparing it to the list of allowed values,
e.g. 'strtolower'.
*
* @throws InvalidArgumentException
*/
- public function __construct( array $allowed, $errorCode =
'not-allowed', $normalizer = null ) {
+ public function __construct( array $allowed, $errorCode =
'not-allowed', callable $normalizer = null ) {
if ( !is_string( $errorCode ) ) {
throw new InvalidArgumentException( 'Error code must be
a string' );
}
- if ( !is_null( $normalizer ) && !is_callable( $normalizer ) ) {
+ if ( !is_callable( $normalizer ) && !is_null( $normalizer ) ) {
throw new InvalidArgumentException( 'Normalizer must be
callable (or null)' );
}
@@ -53,7 +53,7 @@
}
/**
- * @see ValueValidator::validate()
+ * @see ValueValidator::validate
*
* @param string $value The value to validate
*
@@ -64,9 +64,14 @@
$value = call_user_func( $this->normalizer, $value );
}
- if ( !in_array( $value, $this->allowed ) ) {
+ if ( !in_array( $value, $this->allowed, true ) ) {
return Result::newError( array(
- Error::newError( 'not a legal value: ' .
$value, null, $this->errorCode, array( $value ) )
+ Error::newError(
+ 'Not a legal value: ' . $value,
+ null,
+ $this->errorCode,
+ array( $value )
+ )
) );
}
@@ -74,7 +79,7 @@
}
/**
- * @see ValueValidator::setOptions()
+ * @see ValueValidator::setOptions
*
* @param array $options
*/
diff --git a/lib/includes/WikibaseDataTypeBuilders.php
b/lib/includes/WikibaseDataTypeBuilders.php
index 1bdfade..1aa3a29 100644
--- a/lib/includes/WikibaseDataTypeBuilders.php
+++ b/lib/includes/WikibaseDataTypeBuilders.php
@@ -169,13 +169,14 @@
$validators = $this->getCommonStringValidators( 240 );
$validators[] = new RegexValidator( '@[#/:\\\\]@u', true ); //
no nasty chars
- $validators[] = new RegexValidator( '@\..+@u', false ); // must
contain a file extension
+ // Must contain a non-empty file name and a non-empty,
character-only file extension.
+ $validators[] = new RegexValidator( '/.\.\w+$/u' );
//TODO: add a validator that checks the rules that MediaWiki
imposes on filenames for uploads.
// $wgLegalTitleChars and $wgIllegalFileChars define this,
but we need these for the *target* wiki.
//TODO: add a validator that uses a foreign DB query to check
whether the file actually exists on commons.
- $topValidator = new DataValueValidator( //Note: validate the
DataValue's native value.
- new CompositeValidator( $validators, true ) //Note:
each validator is fatal
+ $topValidator = new DataValueValidator(
+ new CompositeValidator( $validators ) //Note: each
validator is fatal
);
return new DataType( $id, 'string', array( new TypeValidator(
'DataValues\DataValue' ), $topValidator ) );
@@ -189,8 +190,8 @@
public function buildStringType( $id ) {
$validators = $this->getCommonStringValidators();
- $topValidator = new DataValueValidator( //Note: validate the
DataValue's native value.
- new CompositeValidator( $validators, true ) //Note:
each validator is fatal
+ $topValidator = new DataValueValidator(
+ new CompositeValidator( $validators ) //Note: each
validator is fatal
);
return new DataType( $id, 'string', array( new TypeValidator(
'DataValues\DataValue' ), $topValidator ) );
@@ -204,10 +205,7 @@
public function buildMonolingualTextType( $id ) {
$textValidator = new DataFieldValidator(
'text',
- new CompositeValidator(
- $this->getCommonStringValidators(),
- true //Note: each validator is fatal
- )
+ new CompositeValidator(
$this->getCommonStringValidators() ) //Note: each validator is fatal
);
$languageValidator = new DataFieldValidator(
@@ -216,8 +214,7 @@
);
$topValidator = new DataValueValidator( new CompositeValidator(
- array( $textValidator, $languageValidator ),
- true
+ array( $textValidator, $languageValidator )
) );
return new DataType( $id, 'monolingualtext', array( new
TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
@@ -238,8 +235,9 @@
$calendarIdValidators[] = $urlValidator =
$this->buildUrlValidator( array( 'http', 'https' ), 255 );
//TODO: enforce well known calendar models from config
- $validators[] = new DataFieldValidator( 'calendarmodel', //
Note: validate the 'calendarmodel' field
- new CompositeValidator( $calendarIdValidators, true )
//Note: each validator is fatal
+ $validators[] = new DataFieldValidator(
+ 'calendarmodel',
+ new CompositeValidator( $calendarIdValidators ) //Note:
each validator is fatal
);
// time string field
@@ -256,21 +254,22 @@
$timeStringValidators[] = new RegexValidator( $isoDataPattern );
- $validators[] = new DataFieldValidator( 'time', // Note:
validate the 'time' field
- new CompositeValidator( $timeStringValidators, true )
//Note: each validator is fatal
+ $validators[] = new DataFieldValidator(
+ 'time',
+ new CompositeValidator( $timeStringValidators ) //Note:
each validator is fatal
);
$precisionValidators = array();
$precisionValidators[] = new TypeValidator( 'integer' );
$precisionValidators[] = new NumberRangeValidator(
TimeValue::PRECISION_Ga, $maxPrecision );
- $validators[] = new DataFieldValidator( 'precision', // Note:
validate the 'precision' field
- new CompositeValidator( $precisionValidators, true )
//Note: each validator is fatal
+ $validators[] = new DataFieldValidator(
+ 'precision',
+ new CompositeValidator( $precisionValidators ) //Note:
each validator is fatal
);
- // top validator
- $topValidator = new DataValueValidator( //Note: validate the
DataValue's native value.
- new CompositeValidator( $validators, true ) //Note:
each validator is fatal
+ $topValidator = new DataValueValidator(
+ new CompositeValidator( $validators ) //Note: each
validator is fatal
);
return new DataType( $id, 'time', array( new TypeValidator(
'DataValues\DataValue' ), $topValidator ) );
@@ -293,17 +292,18 @@
$precisionValidators = array();
$precisionValidators[] = new NumberValidator();
- $validators[] = new DataFieldValidator( 'precision',
- new CompositeValidator( $precisionValidators, true )
+ $validators[] = new DataFieldValidator(
+ 'precision',
+ new CompositeValidator( $precisionValidators )
);
- $validators[] = new DataFieldValidator( 'globe', // Note:
validate the 'globe' field
- new CompositeValidator( $globeIdValidators, true )
//Note: each validator is fatal
+ $validators[] = new DataFieldValidator(
+ 'globe',
+ new CompositeValidator( $globeIdValidators ) //Note:
each validator is fatal
);
- // top validator
- $topValidator = new DataValueValidator( //Note: validate the
DataValue's native value.
- new CompositeValidator( $validators, true ) //Note:
each validator is fatal
+ $topValidator = new DataValueValidator(
+ new CompositeValidator( $validators ) //Note: each
validator is fatal
);
return new DataType( $id, 'globecoordinate', array( new
TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
@@ -325,7 +325,7 @@
$urlSchemeValidators = $urlValidators->getValidators(
$urlSchemes );
$validators[] = new UrlValidator( $urlSchemeValidators );
- return new CompositeValidator( $validators, true ); //Note:
each validator is fatal
+ return new CompositeValidator( $validators ); //Note: each
validator is fatal
}
/**
@@ -336,7 +336,7 @@
public function buildUrlType( $id ) {
$urlValidator = $this->buildUrlValidator( $this->urlSchemes );
- $topValidator = new DataValueValidator( //Note: validate the
DataValue's native value.
+ $topValidator = new DataValueValidator(
$urlValidator
);
@@ -355,23 +355,19 @@
// the 'amount' field is already validated by QuantityValue's
constructor
// the 'digits' field is already validated by QuantityValue's
constructor
- // only allow the '1' unit for now:
- $unitValidators = array();
- $unitValidators[] = new AlternativeValidator( array (
- // NOTE: "1" is always considered legal for historical
reasons,
- // since we use it to represent "unitless" quantities.
We could also use
- // http://qudt.org/vocab/unit#Unitless or
https://www.wikidata.org/entity/Q199
- new RegexValidator( '/^1$/' ),
- $this->buildUrlValidator( array( 'http', 'https' ), 255
),
- ) );
-
- $validators[] = new DataFieldValidator( 'unit', // Note:
validate the 'unit' field
- new CompositeValidator( $unitValidators, true ) //Note:
each validator is fatal
+ $validators[] = new DataFieldValidator(
+ 'unit',
+ new AlternativeValidator( array (
+ // NOTE: "1" is always considered legal for
historical reasons,
+ // since we use it to represent "unitless"
quantities. We could also use
+ // http://qudt.org/vocab/unit#Unitless or
https://www.wikidata.org/entity/Q199
+ new MembershipValidator( array( '1' ) ),
+ $this->buildUrlValidator( array( 'http',
'https' ), 255 ),
+ ) )
);
- // top validator
- $topValidator = new DataValueValidator( //Note: validate the
DataValue's native value.
- new CompositeValidator( $validators, true ) //Note:
each validator is fatal
+ $topValidator = new DataValueValidator(
+ new CompositeValidator( $validators ) //Note: each
validator is fatal
);
return new DataType( $id, 'quantity', array( new TypeValidator(
'DataValues\QuantityValue' ), $topValidator ) );
--
To view, visit https://gerrit.wikimedia.org/r/178922
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I85e908dfd8ae36a6c6bead024005fadb47837b21
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits