diff --git a/RELEASE-NOTES-1.37 b/RELEASE-NOTES-1.37 index 2eb7313db23..ca835f15647 100644 --- a/RELEASE-NOTES-1.37 +++ b/RELEASE-NOTES-1.37 @@ -715,6 +715,8 @@ because of Phabricator reports. - loadRestrictions() * User::isAllowUsertalk was hard deprecated. Use User::getBlock and AbstractBlock::isUsertalkEditAllowed instead. +* Collation::singleton and ::factory were deprecated, obtain an CollationFactory + instance from MediaWikiServices instead. * … === Other changes in 1.37 === diff --git a/autoload.php b/autoload.php index f0d2666e1ad..bc9dc83e3e0 100644 --- a/autoload.php +++ b/autoload.php @@ -852,6 +852,7 @@ $wgAutoloadLocalClasses = [ 'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php', 'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php', 'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php', + 'MediaWiki\\Collation\\CollationFactory' => __DIR__ . '/includes/collation/CollationFactory.php', 'MediaWiki\\DAO\\WikiAwareEntity' => __DIR__ . '/includes/dao/WikiAwareEntity.php', 'MediaWiki\\DAO\\WikiAwareEntityTrait' => __DIR__ . '/includes/dao/WikiAwareEntityTrait.php', 'MediaWiki\\Debug\\DeprecatablePropertyArray' => __DIR__ . '/includes/debug/DeprecatablePropertyArray.php', diff --git a/includes/CategoryViewer.php b/includes/CategoryViewer.php index 251404b52da..feab6f0b0e3 100644 --- a/includes/CategoryViewer.php +++ b/includes/CategoryViewer.php @@ -105,7 +105,7 @@ class CategoryViewer extends ContextSource { $this->limit = $context->getConfig()->get( 'CategoryPagingLimit' ); $this->cat = Category::newFromTitle( $title ); $this->query = $query; - $this->collation = Collation::singleton(); + $this->collation = MediaWikiServices::getInstance()->getCollationFactory()->getCategoryCollation(); $this->languageConverter = MediaWikiServices::getInstance() ->getLanguageConverterFactory()->getLanguageConverter(); unset( $this->query['title'] ); diff --git a/includes/MediaWikiServices.php b/includes/MediaWikiServices.php index 445e8fe58ec..e0c30296c11 100644 --- a/includes/MediaWikiServices.php +++ b/includes/MediaWikiServices.php @@ -39,6 +39,7 @@ use MediaWiki\Block\BlockUtils; use MediaWiki\Block\DatabaseBlockStore; use MediaWiki\Block\UnblockUserFactory; use MediaWiki\Cache\LinkBatchFactory; +use MediaWiki\Collation\CollationFactory; use MediaWiki\Config\ConfigRepository; use MediaWiki\Content\IContentHandlerFactory; use MediaWiki\Content\Transform\ContentTransformer; @@ -734,6 +735,14 @@ class MediaWikiServices extends ServiceContainer { return $this->getService( 'ChangeTagDefStore' ); } + /** + * @since 1.37 + * @return CollationFactory + */ + public function getCollationFactory(): CollationFactory { + return $this->getService( 'CollationFactory' ); + } + /** * @since 1.31 * @return CommentStore diff --git a/includes/MovePage.php b/includes/MovePage.php index 111a4adf162..b8d784925b2 100644 --- a/includes/MovePage.php +++ b/includes/MovePage.php @@ -19,6 +19,7 @@ * @file */ +use MediaWiki\Collation\CollationFactory; use MediaWiki\Config\ServiceOptions; use MediaWiki\Content\IContentHandlerFactory; use MediaWiki\EditPage\SpamChecker; @@ -119,6 +120,9 @@ class MovePage { /** @var MovePageFactory */ private $movePageFactory; + /** @var CollationFactory */ + public $collationFactory; + /** * @internal For use by PageCommandFactory */ @@ -143,6 +147,7 @@ class MovePage { * @param UserFactory|null $userFactory * @param UserEditTracker|null $userEditTracker * @param MovePageFactory|null $movePageFactory + * @param CollationFactory|null $collationFactory * @deprecated since 1.34, hard deprecated since 1.37. Use MovePageFactory instead. */ public function __construct( @@ -160,7 +165,8 @@ class MovePage { WikiPageFactory $wikiPageFactory = null, UserFactory $userFactory = null, UserEditTracker $userEditTracker = null, - MovePageFactory $movePageFactory = null + MovePageFactory $movePageFactory = null, + CollationFactory $collationFactory = null ) { if ( !$options ) { wfDeprecatedMsg( @@ -195,6 +201,7 @@ class MovePage { $this->userFactory = $userFactory ?? $services()->getUserFactory(); $this->userEditTracker = $userEditTracker ?? $services()->getUserEditTracker(); $this->movePageFactory = $movePageFactory ?? $services()->getMovePageFactory(); + $this->collationFactory = $collationFactory ?? $services()->getCollationFactory(); } /** @@ -689,12 +696,13 @@ class MovePage { __METHOD__ ); $type = $this->nsInfo->getCategoryLinkType( $this->newTitle->getNamespace() ); + $collation = $this->collationFactory->getCategoryCollation(); foreach ( $prefixes as $prefixRow ) { $prefix = $prefixRow->cl_sortkey_prefix; $catTo = $prefixRow->cl_to; $dbw->update( 'categorylinks', [ - 'cl_sortkey' => Collation::singleton()->getSortKey( + 'cl_sortkey' => $collation->getSortKey( $this->newTitle->getCategorySortkey( $prefix ) ), 'cl_collation' => $this->options->get( 'CategoryCollation' ), 'cl_type' => $type, diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 5a1e1af976b..885966bc424 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -59,6 +59,7 @@ use MediaWiki\Block\DatabaseBlockStore; use MediaWiki\Block\UnblockUserFactory; use MediaWiki\Block\UserBlockCommandFactory; use MediaWiki\Cache\LinkBatchFactory; +use MediaWiki\Collation\CollationFactory; use MediaWiki\Config\ConfigRepository; use MediaWiki\Config\ServiceOptions; use MediaWiki\Content\ContentHandlerFactory; @@ -318,6 +319,15 @@ return [ return $services->getNameTableStoreFactory()->getChangeTagDef(); }, + 'CollationFactory' => static function ( MediaWikiServices $services ): CollationFactory { + return new CollationFactory( + new ServiceOptions( + CollationFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ), + $services->getObjectFactory(), + $services->getHookContainer() + ); + }, + 'CommentStore' => static function ( MediaWikiServices $services ): CommentStore { return new CommentStore( $services->getContentLanguage(), @@ -1888,7 +1898,8 @@ return [ $services->getActorMigration(), $services->getActorNormalization(), $services->getTitleFactory(), - $services->getUserEditTracker() + $services->getUserEditTracker(), + $services->getCollationFactory() ); }, diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index 8e87b0a44f6..d1c1b7d1b0d 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -266,6 +266,9 @@ class ApiQuery extends ApiBase { ], 'categorymembers' => [ 'class' => ApiQueryCategoryMembers::class, + 'services' => [ + 'CollationFactory', + ] ], 'deletedrevs' => [ 'class' => ApiQueryDeletedrevs::class, diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php index 7673c5f8b53..a22ef2ae99d 100644 --- a/includes/api/ApiQueryCategoryMembers.php +++ b/includes/api/ApiQueryCategoryMembers.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\Collation\CollationFactory; + /** * A query module to enumerate pages that belong to a category. * @@ -27,12 +29,21 @@ */ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { + /** @var Collation */ + private $collation; + /** * @param ApiQuery $query * @param string $moduleName + * @param CollationFactory $collationFactory */ - public function __construct( ApiQuery $query, $moduleName ) { + public function __construct( + ApiQuery $query, + $moduleName, + CollationFactory $collationFactory + ) { parent::__construct( $query, $moduleName, 'cm' ); + $this->collation = $collationFactory->getCategoryCollation(); } public function execute() { @@ -150,7 +161,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { $this->addWhereRange( 'cl_from', $dir, null, null ); } else { if ( $params['startsortkeyprefix'] !== null ) { - $startsortkey = Collation::singleton()->getSortKey( $params['startsortkeyprefix'] ); + $startsortkey = $this->collation->getSortKey( $params['startsortkeyprefix'] ); } elseif ( $params['starthexsortkey'] !== null ) { if ( !$this->validateHexSortkey( $params['starthexsortkey'] ) ) { $encParamName = $this->encodeParamName( 'starthexsortkey' ); @@ -161,7 +172,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { $startsortkey = $params['startsortkey']; } if ( $params['endsortkeyprefix'] !== null ) { - $endsortkey = Collation::singleton()->getSortKey( $params['endsortkeyprefix'] ); + $endsortkey = $this->collation->getSortKey( $params['endsortkeyprefix'] ); } elseif ( $params['endhexsortkey'] !== null ) { if ( !$this->validateHexSortkey( $params['endhexsortkey'] ) ) { $encParamName = $this->encodeParamName( 'endhexsortkey' ); diff --git a/includes/collation/AbkhazUppercaseCollation.php b/includes/collation/AbkhazUppercaseCollation.php index b35fde7a016..93ba79a882a 100644 --- a/includes/collation/AbkhazUppercaseCollation.php +++ b/includes/collation/AbkhazUppercaseCollation.php @@ -20,17 +20,16 @@ * @file */ +use MediaWiki\Languages\LanguageFactory; + class AbkhazUppercaseCollation extends CustomUppercaseCollation { /** - * @param Language $abLanguage Language object for Abkhaz - * @param Language $enLanguage Language object for English + * @param LanguageFactory $languageFactory */ - public function __construct( - Language $abLanguage, - Language $enLanguage - ) { + public function __construct( LanguageFactory $languageFactory ) { parent::__construct( + $languageFactory, [ 'А', 'Б', @@ -97,8 +96,7 @@ class AbkhazUppercaseCollation extends CustomUppercaseCollation { 'ь', 'ә', ], - $abLanguage, - $enLanguage + 'ab' ); } } diff --git a/includes/collation/BashkirUppercaseCollation.php b/includes/collation/BashkirUppercaseCollation.php index 5c277c88009..867a89e6510 100644 --- a/includes/collation/BashkirUppercaseCollation.php +++ b/includes/collation/BashkirUppercaseCollation.php @@ -20,17 +20,16 @@ * @file */ +use MediaWiki\Languages\LanguageFactory; + class BashkirUppercaseCollation extends CustomUppercaseCollation { /** - * @param Language $baLanguage Language object for Bashkir - * @param Language $enLanguage Language object for English + * @param LanguageFactory $languageFactory */ - public function __construct( - Language $baLanguage, - Language $enLanguage - ) { + public function __construct( LanguageFactory $languageFactory ) { parent::__construct( + $languageFactory, [ 'А', 'Б', @@ -75,8 +74,7 @@ class BashkirUppercaseCollation extends CustomUppercaseCollation { 'Ю', 'Я', ], - $baLanguage, - $enLanguage + 'ba' ); } } diff --git a/includes/collation/Collation.php b/includes/collation/Collation.php index d7783e5d7df..3bfeba1fd0b 100644 --- a/includes/collation/Collation.php +++ b/includes/collation/Collation.php @@ -20,7 +20,6 @@ * @file */ -use MediaWiki\HookContainer\HookRunner; use MediaWiki\MediaWikiServices; /** @@ -32,6 +31,7 @@ abstract class Collation { private static $instance; /** + * @deprecated 1.37 Use MediaWikiServices::getCollationFactory()->getCategoryCollation() * @since 1.16.3 * @return Collation */ @@ -45,70 +45,13 @@ abstract class Collation { /** * @since 1.16.3 + * @deprecated 1.37 Use MediaWikiServices::getCollationFactory()->makeCollation() * @throws MWException * @param string $collationName * @return Collation */ public static function factory( $collationName ) { - $mwServices = MediaWikiServices::getInstance(); - $languageFactory = $mwServices->getLanguageFactory(); - switch ( $collationName ) { - case 'uppercase': - return new UppercaseCollation( - $languageFactory->getLanguage( 'en' ) - ); - case 'numeric': - return new NumericUppercaseCollation( - $mwServices->getContentLanguage(), - $languageFactory->getLanguage( 'en' ) - ); - case 'identity': - return new IdentityCollation( - $mwServices->getContentLanguage() - ); - case 'uca-default': - return new IcuCollation( - $languageFactory, - 'root' - ); - case 'uca-default-u-kn': - return new IcuCollation( - $languageFactory, - 'root-u-kn' - ); - case 'xx-uca-ckb': - return new CollationCkb( $languageFactory ); - case 'uppercase-ab': - return new AbkhazUppercaseCollation( - $languageFactory->getLanguage( 'ab' ), - $languageFactory->getLanguage( 'en' ) - ); - case 'uppercase-ba': - return new BashkirUppercaseCollation( - $languageFactory->getLanguage( 'ba' ), - $languageFactory->getLanguage( 'en' ) - ); - default: - $match = []; - if ( preg_match( '/^uca-([A-Za-z@=-]+)$/', $collationName, $match ) ) { - return new IcuCollation( - $languageFactory, - $match[1] - ); - } - - # Provide a mechanism for extensions to hook in. - $collationObject = null; - $hookRunner = new HookRunner( $mwServices->getHookContainer() ); - $hookRunner->onCollation__factory( $collationName, $collationObject ); - - if ( $collationObject instanceof self ) { - return $collationObject; - } - - // If all else fails... - throw new MWException( __METHOD__ . ": unknown collation type \"$collationName\"" ); - } + return MediaWikiServices::getInstance()->getCollationFactory()->makeCollation( $collationName ); } /** diff --git a/includes/collation/CollationFactory.php b/includes/collation/CollationFactory.php new file mode 100644 index 00000000000..e1d8f62462d --- /dev/null +++ b/includes/collation/CollationFactory.php @@ -0,0 +1,180 @@ + [ + 'class' => \UppercaseCollation::class, + 'services' => [ + 'LanguageFactory', + ] + ], + 'numeric' => [ + 'class' => \NumericUppercaseCollation::class, + 'services' => [ + 'LanguageFactory', + 'ContentLanguage', + ] + ], + 'identity' => [ + 'class' => \IdentityCollation::class, + 'services' => [ + 'ContentLanguage', + ] + ], + 'uca-default' => [ + 'class' => \IcuCollation::class, + 'services' => [ + 'LanguageFactory', + ], + 'args' => [ + 'root', + ] + ], + 'uca-default-u-kn' => [ + 'class' => \IcuCollation::class, + 'services' => [ + 'LanguageFactory', + ], + 'args' => [ + 'root-u-kn', + ] + ], + 'xx-uca-ckb' => [ + 'class' => \CollationCkb::class, + 'services' => [ + 'LanguageFactory', + ] + ], + 'uppercase-ab' => [ + 'class' => \AbkhazUppercaseCollation::class, + 'services' => [ + 'LanguageFactory', + ] + ], + 'uppercase-ba' => [ + 'class' => \BashkirUppercaseCollation::class, + 'services' => [ + 'LanguageFactory', + ] + ], + ]; + + /** @var ServiceOptions */ + private $options; + + /** @var ObjectFactory */ + private $objectFactory; + + /** @var HookRunner */ + private $hookRunner; + + /** + * @param ServiceOptions $options + * @param ObjectFactory $objectFactory + * @param HookContainer $hookContainer + */ + public function __construct( + ServiceOptions $options, + ObjectFactory $objectFactory, + HookContainer $hookContainer + ) { + $options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS ); + $this->options = $options; + $this->objectFactory = $objectFactory; + $this->hookRunner = new HookRunner( $hookContainer ); + } + + /** + * @return Collation + */ + public function getCategoryCollation(): Collation { + return $this->makeCollation( $this->options->get( 'CategoryCollation' ) ); + } + + /** + * @throws MWException + * @param string $collationName + * @return Collation + */ + public function makeCollation( string $collationName ): Collation { + if ( isset( self::CORE_COLLATIONS[$collationName] ) ) { + return $this->instantiateCollation( self::CORE_COLLATIONS[$collationName] ); + } + + if ( preg_match( '/^uca-([A-Za-z@=-]+)$/', $collationName, $match ) ) { + return $this->instantiateCollation( [ + 'class' => \IcuCollation::class, + 'services' => [ + 'LanguageFactory', + ], + 'args' => [ + $match[1], + ] + ] ); + } + + // Provide a mechanism for extensions to hook in. + $collationObject = null; + $this->hookRunner->onCollation__factory( $collationName, $collationObject ); + + if ( !$collationObject instanceof Collation ) { + throw new MWException( __METHOD__ . ": unknown collation type \"$collationName\"" ); + } + + return $collationObject; + } + + /** + * @param array $spec + * @return Collation + */ + private function instantiateCollation( $spec ): Collation { + return $this->objectFactory->createObject( + $spec, + [ + 'assertClass' => Collation::class + ] + ); + } + +} diff --git a/includes/collation/CustomUppercaseCollation.php b/includes/collation/CustomUppercaseCollation.php index e4478e7e080..3459d4dc9dd 100644 --- a/includes/collation/CustomUppercaseCollation.php +++ b/includes/collation/CustomUppercaseCollation.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\Languages\LanguageFactory; + /** * Resort normal UTF-8 order by putting a bunch of stuff in PUA * @@ -51,19 +53,22 @@ class CustomUppercaseCollation extends NumericUppercaseCollation { /** * @note This assumes $alphabet does not contain U+F3000-U+F3FFF * + * @param LanguageFactory $languageFactory * @param array $alphabet Sorted array of uppercase characters. - * @param Language $digitTransformLang What language for number sorting. - * @param Language $enLanguage + * @param string|Language $digitTransformLang What language for number sorting. */ public function __construct( + LanguageFactory $languageFactory, array $alphabet, - Language $digitTransformLang, - Language $enLanguage + $digitTransformLang ) { if ( count( $alphabet ) < 1 || count( $alphabet ) >= 4096 ) { throw new UnexpectedValueException( "Alphabet must be < 4096 items" ); } $this->firstLetters = $alphabet; + $digitTransformLang = $digitTransformLang instanceof Language + ? $digitTransformLang + : $languageFactory->getLanguage( $digitTransformLang ); // For digraphs, only the first letter is capitalized in input $this->alphabet = array_map( [ $digitTransformLang, 'uc' ], $alphabet ); @@ -78,7 +83,7 @@ class CustomUppercaseCollation extends NumericUppercaseCollation { $lengths = array_map( 'mb_strlen', $this->alphabet ); array_multisort( $lengths, SORT_DESC, $this->firstLetters, $this->alphabet, $this->puaSubset ); - parent::__construct( $digitTransformLang, $enLanguage ); + parent::__construct( $languageFactory, $digitTransformLang ); } private function convertToPua( $string ) { diff --git a/includes/collation/NumericUppercaseCollation.php b/includes/collation/NumericUppercaseCollation.php index 3cf4ab22940..55e42338fb7 100644 --- a/includes/collation/NumericUppercaseCollation.php +++ b/includes/collation/NumericUppercaseCollation.php @@ -18,6 +18,8 @@ * @file */ +use MediaWiki\Languages\LanguageFactory; + /** * Collation that orders text with numbers "naturally", so that 'Foo 1' < 'Foo 2' < 'Foo 12'. * @@ -40,17 +42,19 @@ class NumericUppercaseCollation extends UppercaseCollation { private $digitTransformLang; /** - * @param Language $digitTransformLang How to convert digits. + * @param LanguageFactory $languageFactory + * @param string|Language $digitTransformLang How to convert digits. * For example, if given language "my" than ၇ is treated like 7. * It is expected that usually this is given the content language. - * @param Language $enLanguage */ public function __construct( - Language $digitTransformLang, - Language $enLanguage + LanguageFactory $languageFactory, + $digitTransformLang ) { - $this->digitTransformLang = $digitTransformLang; - parent::__construct( $enLanguage ); + $this->digitTransformLang = $digitTransformLang instanceof Language + ? $digitTransformLang + : $languageFactory->getLanguage( $digitTransformLang ); + parent::__construct( $languageFactory ); } public function getSortKey( $string ) { diff --git a/includes/collation/UppercaseCollation.php b/includes/collation/UppercaseCollation.php index fc100686cd2..ff1fe11bb24 100644 --- a/includes/collation/UppercaseCollation.php +++ b/includes/collation/UppercaseCollation.php @@ -20,17 +20,20 @@ * @file */ +use MediaWiki\Languages\LanguageFactory; + class UppercaseCollation extends Collation { - /** @var Language */ + /** @var Language Language object for English, so we can use the generic + * UTF-8 uppercase function there + */ private $lang; /** - * @param Language $enLanguage Language object for English, so we can use the generic - * UTF-8 uppercase function there + * @param LanguageFactory $languageFactory */ - public function __construct( Language $enLanguage ) { - $this->lang = $enLanguage; + public function __construct( LanguageFactory $languageFactory ) { + $this->lang = $languageFactory->getLanguage( 'en' ); } public function getSortKey( $string ) { diff --git a/includes/deferred/LinksUpdate.php b/includes/deferred/LinksUpdate.php index 43cbdffd248..e8367d7fb07 100644 --- a/includes/deferred/LinksUpdate.php +++ b/includes/deferred/LinksUpdate.php @@ -649,7 +649,7 @@ class LinksUpdate extends DataUpdate { $languageConverter = MediaWikiServices::getInstance()->getLanguageConverterFactory() ->getLanguageConverter(); - $collation = Collation::singleton(); + $collation = MediaWikiServices::getInstance()->getCollationFactory()->getCategoryCollation(); foreach ( $diffs as $name => $prefix ) { $nt = Title::makeTitleSafe( NS_CATEGORY, $name ); $languageConverter->findVariantLink( $name, $nt, true ); diff --git a/includes/page/PageCommandFactory.php b/includes/page/PageCommandFactory.php index f27b1bcef21..fcf8e99b79c 100644 --- a/includes/page/PageCommandFactory.php +++ b/includes/page/PageCommandFactory.php @@ -25,6 +25,7 @@ namespace MediaWiki\Page; use ActorMigration; use Config; use ContentModelChange; +use MediaWiki\Collation\CollationFactory; use MediaWiki\Config\ServiceOptions; use MediaWiki\Content\IContentHandlerFactory; use MediaWiki\EditPage\SpamChecker; @@ -110,6 +111,9 @@ class PageCommandFactory implements /** @var UserEditTracker */ private $userEditTracker; + /** @var CollationFactory */ + private $collationFactory; + public function __construct( Config $config, ILoadBalancer $loadBalancer, @@ -127,7 +131,8 @@ class PageCommandFactory implements ActorMigration $actorMigration, ActorNormalization $actorNormalization, TitleFactory $titleFactory, - UserEditTracker $userEditTracker + UserEditTracker $userEditTracker, + CollationFactory $collationFactory ) { $this->config = $config; $this->loadBalancer = $loadBalancer; @@ -146,6 +151,7 @@ class PageCommandFactory implements $this->actorNormalization = $actorNormalization; $this->titleFactory = $titleFactory; $this->userEditTracker = $userEditTracker; + $this->collationFactory = $collationFactory; } /** @@ -218,7 +224,8 @@ class PageCommandFactory implements $this->wikiPageFactory, $this->userFactory, $this->userEditTracker, - $this + $this, + $this->collationFactory ); } diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php index 0eb288e17e5..a0150b7c449 100644 --- a/maintenance/updateCollation.php +++ b/maintenance/updateCollation.php @@ -75,11 +75,10 @@ TEXT $verboseStats = $this->getOption( 'verbose-stats' ); if ( $this->hasOption( 'target-collation' ) ) { $collationName = $this->getOption( 'target-collation' ); - $collation = Collation::factory( $collationName ); } else { $collationName = $this->getConfig()->get( 'CategoryCollation' ); - $collation = Collation::singleton(); } + $collation = MediaWikiServices::getInstance()->getCollationFactory()->makeCollation( $collationName ); // Collation sanity check: in some cases the constructor will work, // but this will raise an exception, breaking all category pages diff --git a/tests/phpunit/includes/collation/CollationTest.php b/tests/phpunit/includes/collation/CollationTest.php index e34f91812de..a8e87fa84cc 100644 --- a/tests/phpunit/includes/collation/CollationTest.php +++ b/tests/phpunit/includes/collation/CollationTest.php @@ -84,7 +84,7 @@ class CollationTest extends MediaWikiLangTestCase { * @dataProvider firstLetterProvider */ public function testGetFirstLetter( $collation, $string, $firstLetter ) { - $col = Collation::factory( $collation ); + $col = $this->getServiceContainer()->getCollationFactory()->makeCollation( $collation ); $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) ); } diff --git a/tests/phpunit/includes/collation/CustomUppercaseCollationTest.php b/tests/phpunit/includes/collation/CustomUppercaseCollationTest.php index d77469b06a8..e1bb26d59a8 100644 --- a/tests/phpunit/includes/collation/CustomUppercaseCollationTest.php +++ b/tests/phpunit/includes/collation/CustomUppercaseCollationTest.php @@ -11,16 +11,15 @@ class CustomUppercaseCollationTest extends MediaWikiIntegrationTestCase { protected function setUp(): void { parent::setUp(); - $enLanguage = MediaWikiServices::getInstance()->getLanguageFactory()->getLanguage( 'en' ); $this->collation = new CustomUppercaseCollation( + MediaWikiServices::getInstance()->getLanguageFactory(), [ 'D', 'C', 'Cs', 'B' ], - $enLanguage, // digital transformation language - $enLanguage // English, for generic uppercase + 'en' // digital transformation language ); }