diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index ade41df..43bc321 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -13,7 +13,6 @@ jobs: fail-fast: false matrix: php: - - '7.3' - '7.4' - '8.0' - '8.1' diff --git a/composer.json b/composer.json index 24a4d9c..88dcf74 100644 --- a/composer.json +++ b/composer.json @@ -38,14 +38,14 @@ "docs": "https://github.com/DataValues/Geo/#usage" }, "require": { - "php": ">=7.3", + "php": ">=7.4", "data-values/data-values": "^3.0|^2.0|^1.0|~0.1", "data-values/interfaces": "^1.0.0|^0.2.0", "symfony/polyfill-php80": "^1.18.1" }, "require-dev": { "phpunit/phpunit": "^9.4.1", - "mediawiki/mediawiki-codesniffer": "^34 || ^35 || ^36 || ^38", + "mediawiki/mediawiki-codesniffer": "^45", "ockcyp/covers-validator": "^1.3.3", "phpstan/phpstan": "^0.12.68 || ^1.0.0", "phpmd/phpmd": "^2.9.1", @@ -83,5 +83,10 @@ "@test", "@cs" ] + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } } } diff --git a/phpcs.xml b/phpcs.xml index f1d841e..38c068b 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -12,4 +12,5 @@ + diff --git a/src/Formatters/GlobeCoordinateFormatter.php b/src/Formatters/GlobeCoordinateFormatter.php index b651e8a..fcdb525 100644 --- a/src/Formatters/GlobeCoordinateFormatter.php +++ b/src/Formatters/GlobeCoordinateFormatter.php @@ -30,7 +30,7 @@ class GlobeCoordinateFormatter implements ValueFormatter { */ private $formatter; - public function __construct( FormatterOptions $options = null ) { + public function __construct( ?FormatterOptions $options = null ) { $this->formatter = new LatLongFormatter( $options ); } diff --git a/src/Formatters/LatLongFormatter.php b/src/Formatters/LatLongFormatter.php index a10970a..c8c363d 100644 --- a/src/Formatters/LatLongFormatter.php +++ b/src/Formatters/LatLongFormatter.php @@ -93,9 +93,9 @@ class LatLongFormatter implements ValueFormatter { private const DEFAULT_PRECISION = 1 / 3600; - private $options; + private FormatterOptions $options; - public function __construct( FormatterOptions $options = null ) { + public function __construct( ?FormatterOptions $options = null ) { $this->options = $options ?? new FormatterOptions(); $this->defaultOption( self::OPT_NORTH_SYMBOL, 'N' ); @@ -211,7 +211,6 @@ private function formatLongitude( float $longitude, float $precision ): string { private function makeDirectionalIfNeeded( string $coordinate, string $positiveSymbol, string $negativeSymbol ): string { - if ( $this->options->getOption( self::OPT_DIRECTIONAL ) ) { return $this->makeDirectional( $coordinate, $positiveSymbol, $negativeSymbol ); } @@ -221,7 +220,6 @@ private function makeDirectionalIfNeeded( string $coordinate, string $positiveSy private function makeDirectional( string $coordinate, string $positiveSymbol, string $negativeSymbol ): string { - $isNegative = substr( $coordinate, 0, 1 ) === '-'; if ( $isNegative ) { diff --git a/src/GlobeMath.php b/src/GlobeMath.php index 23a2bd3..03a2ba8 100644 --- a/src/GlobeMath.php +++ b/src/GlobeMath.php @@ -59,7 +59,7 @@ public function normalizeGlobeCoordinate( GlobeCoordinateValue $value ): GlobeCo * * @return LatLongValue */ - public function normalizeGlobeLatLong( LatLongValue $value, string $globe = null ): LatLongValue { + public function normalizeGlobeLatLong( LatLongValue $value, ?string $globe = null ): LatLongValue { switch ( $this->normalizeGlobe( $globe ) ) { case GlobeCoordinateValue::GLOBE_EARTH: case self::GLOBE_MOON: diff --git a/src/PackagePrivate/DmPrecisionDetector.php b/src/PackagePrivate/DmPrecisionDetector.php index 50c4311..bcdaacc 100644 --- a/src/PackagePrivate/DmPrecisionDetector.php +++ b/src/PackagePrivate/DmPrecisionDetector.php @@ -6,7 +6,7 @@ class DmPrecisionDetector extends PrecisionDetector { - private $dmsPrecisionDetector; + private DmsPrecisionDetector $dmsPrecisionDetector; public function __construct() { $this->dmsPrecisionDetector = new DmsPrecisionDetector(); diff --git a/src/PackagePrivate/LatLongPrecisionParser.php b/src/PackagePrivate/LatLongPrecisionParser.php index 0713f59..61cdb65 100644 --- a/src/PackagePrivate/LatLongPrecisionParser.php +++ b/src/PackagePrivate/LatLongPrecisionParser.php @@ -11,10 +11,10 @@ class LatLongPrecisionParser { - private $options; - private $parsers; + private ?ParserOptions $options; + private ?array $parsers = null; - public function __construct( ParserOptions $options = null ) { + public function __construct( ?ParserOptions $options = null ) { $this->options = $options; } diff --git a/src/PackagePrivate/PreciseLatLong.php b/src/PackagePrivate/PreciseLatLong.php index 480f742..9351940 100644 --- a/src/PackagePrivate/PreciseLatLong.php +++ b/src/PackagePrivate/PreciseLatLong.php @@ -8,8 +8,8 @@ class PreciseLatLong { - private $latLong; - private $precision; + private LatLongValue $latLong; + private Precision $precision; public function __construct( LatLongValue $latLong, Precision $precision ) { $this->latLong = $latLong; diff --git a/src/PackagePrivate/Precision.php b/src/PackagePrivate/Precision.php index 60bd538..706db46 100644 --- a/src/PackagePrivate/Precision.php +++ b/src/PackagePrivate/Precision.php @@ -6,7 +6,7 @@ class Precision { - private $precision; + private float $precision; public function __construct( float $precisionInDegrees ) { if ( $precisionInDegrees < -360 || $precisionInDegrees > 360 ) { diff --git a/src/PackagePrivate/PrecisionParser.php b/src/PackagePrivate/PrecisionParser.php index 78d3752..d08b594 100644 --- a/src/PackagePrivate/PrecisionParser.php +++ b/src/PackagePrivate/PrecisionParser.php @@ -6,8 +6,8 @@ class PrecisionParser { - private $latLongParser; - private $precisionDetector; + private ValueParser $latLongParser; + private PrecisionDetector $precisionDetector; public function __construct( ValueParser $latLongParser, PrecisionDetector $precisionDetector ) { $this->latLongParser = $latLongParser; diff --git a/src/Parsers/DdCoordinateParser.php b/src/Parsers/DdCoordinateParser.php index 5c9b8f4..4de35c2 100644 --- a/src/Parsers/DdCoordinateParser.php +++ b/src/Parsers/DdCoordinateParser.php @@ -34,7 +34,7 @@ class DdCoordinateParser extends LatLongParserBase { /** * @param ParserOptions|null $options */ - public function __construct( ParserOptions $options = null ) { + public function __construct( ?ParserOptions $options = null ) { $options = $options ?: new ParserOptions(); $options->defaultOption( self::OPT_DEGREE_SYMBOL, '°' ); @@ -107,7 +107,7 @@ protected function areValidCoordinates( array $normalizedCoordinateSegments ): b } } - return ( 1 === $match ); + return ( $match === 1 ); } /** diff --git a/src/Parsers/DmCoordinateParser.php b/src/Parsers/DmCoordinateParser.php index 0725a7c..810319f 100644 --- a/src/Parsers/DmCoordinateParser.php +++ b/src/Parsers/DmCoordinateParser.php @@ -29,7 +29,7 @@ class DmCoordinateParser extends DdCoordinateParser { /** * @param ParserOptions|null $options */ - public function __construct( ParserOptions $options = null ) { + public function __construct( ?ParserOptions $options = null ) { $options = $options ?: new ParserOptions(); $options->defaultOption( self::OPT_MINUTE_SYMBOL, "'" ); @@ -151,7 +151,7 @@ protected function parseCoordinate( string $coordinateSegment ): float { ); } - list( $degrees, $minutes ) = $exploded; + [ $degrees, $minutes ] = $exploded; $minutes = substr( $minutes, 0, -1 ); diff --git a/src/Parsers/DmsCoordinateParser.php b/src/Parsers/DmsCoordinateParser.php index 8fbf0f4..2ab7cc0 100644 --- a/src/Parsers/DmsCoordinateParser.php +++ b/src/Parsers/DmsCoordinateParser.php @@ -27,9 +27,9 @@ class DmsCoordinateParser extends DmCoordinateParser { public const OPT_SECOND_SYMBOL = 'second'; /** - * @param ParserOptions|null $options + * @param ?ParserOptions $options */ - public function __construct( ParserOptions $options = null ) { + public function __construct( ?ParserOptions $options = null ) { $options = $options ?: new ParserOptions(); $options->defaultOption( self::OPT_SECOND_SYMBOL, '"' ); diff --git a/src/Parsers/FloatCoordinateParser.php b/src/Parsers/FloatCoordinateParser.php index e70005e..b7fe57f 100644 --- a/src/Parsers/FloatCoordinateParser.php +++ b/src/Parsers/FloatCoordinateParser.php @@ -71,7 +71,7 @@ protected function areValidCoordinates( array $normalizedCoordinateSegments ): b } } - return ( 1 === $match ); + return ( $match === 1 ); } /** diff --git a/src/Parsers/GlobeCoordinateParser.php b/src/Parsers/GlobeCoordinateParser.php index 50bff3d..5ce2fa7 100644 --- a/src/Parsers/GlobeCoordinateParser.php +++ b/src/Parsers/GlobeCoordinateParser.php @@ -33,10 +33,10 @@ class GlobeCoordinateParser implements ValueParser { */ public const OPT_GLOBE = 'globe'; - private $options; - private $latLongPrecisionParser; + private ParserOptions $options; + private ?LatLongPrecisionParser $latLongPrecisionParser = null; - public function __construct( ParserOptions $options = null ) { + public function __construct( ?ParserOptions $options = null ) { $this->options = $options ?: new ParserOptions(); $this->options->defaultOption( ValueParser::OPT_LANG, 'en' ); @@ -71,6 +71,9 @@ public function parse( $value ): GlobeCoordinateValue { ); } + /** + * @return LatLongPrecisionParser + */ private function getParser() { if ( $this->latLongPrecisionParser === null ) { $this->latLongPrecisionParser = new LatLongPrecisionParser( $this->options ); diff --git a/src/Parsers/LatLongParser.php b/src/Parsers/LatLongParser.php index 69649fe..31b5e37 100644 --- a/src/Parsers/LatLongParser.php +++ b/src/Parsers/LatLongParser.php @@ -66,7 +66,7 @@ class LatLongParser implements ValueParser { */ private $options; - public function __construct( ParserOptions $options = null ) { + public function __construct( ?ParserOptions $options = null ) { $this->options = $options ?: new ParserOptions(); $this->options->defaultOption( ValueParser::OPT_LANG, 'en' ); } diff --git a/src/Parsers/LatLongParserBase.php b/src/Parsers/LatLongParserBase.php index d5a4862..1312ae3 100644 --- a/src/Parsers/LatLongParserBase.php +++ b/src/Parsers/LatLongParserBase.php @@ -38,7 +38,7 @@ abstract class LatLongParserBase implements ValueParser { */ private $options; - public function __construct( ParserOptions $options = null ) { + public function __construct( ?ParserOptions $options = null ) { $this->options = $options ?: new ParserOptions(); $this->options->defaultOption( ValueParser::OPT_LANG, 'en' ); @@ -94,7 +94,7 @@ public function parse( $value ): LatLongValue { throw new ParseException( 'Not a valid geographical coordinate', $rawValue, static::FORMAT_NAME ); } - list( $latitude, $longitude ) = $normalizedCoordinateSegments; + [ $latitude, $longitude ] = $normalizedCoordinateSegments; return new LatLongValue( $this->getParsedCoordinate( $latitude ), @@ -183,6 +183,10 @@ protected function resolveDirection( string $coordinateSegment ): string { return $coordinateSegment; } + /** + * @param string $optionName + * @return mixed + */ protected function getOption( string $optionName ) { return $this->options->getOption( $optionName ); } diff --git a/src/Values/GlobeCoordinateValue.php b/src/Values/GlobeCoordinateValue.php index 52c97e1..ac9d510 100644 --- a/src/Values/GlobeCoordinateValue.php +++ b/src/Values/GlobeCoordinateValue.php @@ -19,19 +19,13 @@ */ class GlobeCoordinateValue implements DataValue { - private $latLong; - - /** - * @var float|null - */ - private $precision; + private LatLongValue $latLong; + private ?float $precision; /** * IRI of the globe on which the location resides. - * - * @var string */ - private $globe; + private string $globe; /** * Wikidata concept URI for the Earth. Used as default value when no other globe was specified. @@ -40,12 +34,12 @@ class GlobeCoordinateValue implements DataValue { /** * @param LatLongValue $latLong - * @param float|int|null $precision in degrees, e.g. 0.01. - * @param string|null $globe IRI, defaults to 'http://www.wikidata.org/entity/Q2'. + * @param ?float $precision in degrees, e.g. 0.01. + * @param ?string $globe IRI, defaults to 'http://www.wikidata.org/entity/Q2'. * * @throws IllegalValueException */ - public function __construct( LatLongValue $latLong, float $precision = null, string $globe = null ) { + public function __construct( LatLongValue $latLong, ?float $precision = null, ?string $globe = null ) { $this->assertIsPrecision( $precision ); if ( $globe === null ) { @@ -143,7 +137,7 @@ public function __serialize(): array { * @throws InvalidArgumentException */ public function unserialize( $value ) { - $this->__unserialize( json_decode( $value) ); + $this->__unserialize( json_decode( $value ) ); } public function __unserialize( array $data ): void { diff --git a/src/Values/LatLongValue.php b/src/Values/LatLongValue.php index dc072e4..1784cee 100644 --- a/src/Values/LatLongValue.php +++ b/src/Values/LatLongValue.php @@ -21,8 +21,8 @@ */ class LatLongValue implements DataValue { - private $latitude; - private $longitude; + private float $latitude; + private float $longitude; /** * @param float|int $latitude Latitude in degrees within the range [-360, 360] @@ -82,7 +82,7 @@ public function getHash(): string { public function getSerializationForHash(): string { $data = $this->serialize(); return 'C:' . strlen( static::class ) . ':"' . static::class . - '":' . strlen( $data ) . ':{' . $data . '}'; + '":' . strlen( $data ) . ':{' . $data . '}'; } public function getCopy(): self { diff --git a/tests/unit/GlobeMathTest.php b/tests/unit/GlobeMathTest.php index ed8fa6e..1f8d1cd 100644 --- a/tests/unit/GlobeMathTest.php +++ b/tests/unit/GlobeMathTest.php @@ -51,14 +51,14 @@ public function latLongProvider() { // west to east. For other globes see http://planetarynames.wr.usgs.gov/TargetCoordinates return [ // Yes, there really are nine ways to describe the same point - [ 0, 0, 0, 0 ], - [ 0, 0, 0, 360 ], - [ 0, 0, 0, -360 ], - [ 0, 0, 360, 0 ], - [ 0, 0, -360, 0 ], - [ 0, 0, 180, 180 ], - [ 0, 0, 180, -180 ], - [ 0, 0, -180, 180 ], + [ 0, 0, 0, 0 ], + [ 0, 0, 0, 360 ], + [ 0, 0, 0, -360 ], + [ 0, 0, 360, 0 ], + [ 0, 0, -360, 0 ], + [ 0, 0, 180, 180 ], + [ 0, 0, 180, -180 ], + [ 0, 0, -180, 180 ], [ 0, 0, -180, -180 ], // Earth (default) vs. other globes @@ -68,21 +68,21 @@ public function latLongProvider() { [ 0, 350, 0, 350, 'Vulcan' ], // Make sure the methods do not simply return true - [ 0, 0, 0, 180, null, false ], - [ 0, 0, 0, -180, null, false ], - [ 0, 0, 180, 0, null, false ], - [ 0, 0, 180, 360, null, false ], + [ 0, 0, 0, 180, null, false ], + [ 0, 0, 0, -180, null, false ], + [ 0, 0, 180, 0, null, false ], + [ 0, 0, 180, 360, null, false ], // Dark side of the Moon, erm Earth - [ 0, -180, 0, 180 ], - [ 0, -180, 0, -180 ], - [ 0, -180, 180, 0 ], - [ 0, -180, -180, 0 ], + [ 0, -180, 0, 180 ], + [ 0, -180, 0, -180 ], + [ 0, -180, 180, 0 ], + [ 0, -180, -180, 0 ], [ 0, -180, -360, -180 ], // Half way to the north pole - [ 45, 0, 45, -360 ], - [ 45, 0, 135, 180 ], + [ 45, 0, 45, -360 ], + [ 45, 0, 135, 180 ], [ 45, 0, 135, -180 ], // North pole is a special case, drop longitude @@ -91,9 +91,9 @@ public function latLongProvider() { [ 90, 0, -270, 180 ], [ 90, 0, -90, 0, null, false ], // Same for south pole - [ -90, 0, -90, 123 ], - [ -90, 0, 270, 0 ], - [ -90, 0, 270, -180 ], + [ -90, 0, -90, 123 ], + [ -90, 0, 270, 0 ], + [ -90, 0, 270, -180 ], // Make sure we cover all cases in the code [ 10, 10, 10, 10 ], diff --git a/tests/unit/Values/GlobeCoordinateValueTest.php b/tests/unit/Values/GlobeCoordinateValueTest.php index e484b9c..facda97 100644 --- a/tests/unit/Values/GlobeCoordinateValueTest.php +++ b/tests/unit/Values/GlobeCoordinateValueTest.php @@ -302,7 +302,6 @@ public function nonNumericStringProvider() { yield [ [ 'latitude' => '1.23a', 'longitude' => '3.45b' ] ]; } - /** * @dataProvider withPrecisionProvider */