jenkins-bot has submitted this change and it was merged.
Change subject: Configure JS deserializers via entitytypes
......................................................................
Configure JS deserializers via entitytypes
Bug: T132558
Change-Id: Ic058f8c61f6ef06151acfb72a7e1f45d4837e45c
---
M docs/entitytypes.wiki
M lib/includes/EntityTypeDefinitions.php
A repo/includes/Modules/EntityTypesModuleWorker.php
A repo/includes/Modules/MwConfigModule.php
A repo/includes/Modules/MwConfigModuleWorker.php
M repo/includes/WikibaseRepo.php
M repo/resources/Resources.php
M repo/resources/wikibase.EntityInitializer.js
8 files changed, 183 insertions(+), 6 deletions(-)
Approvals:
Adrian Heine: Looks good to me, approved
Thiemo Mättig (WMDE): Looks good to me, but someone else must approve
jenkins-bot: Verified
diff --git a/docs/entitytypes.wiki b/docs/entitytypes.wiki
index 91016d3..7e99793 100644
--- a/docs/entitytypes.wiki
+++ b/docs/entitytypes.wiki
@@ -52,6 +52,9 @@
: a string representing the id of the content model
; content-handler-factory-callback (repo only)
: a callable that returns an EntityHandler instance supporting this entity type
+; js-deserializer-factory-function (repo only)
+: a string representing a resource loader module that, when `require`d,
returns a function returning
+ a `wikibase.serialization.Deserializer` instance supporting this entity type
Extensions that wish to register an entity type should use the
WikibaseRepoEntityTypes respectively
WikibaseClientEntityTypes hooks to provide additional entity type definitions.
diff --git a/lib/includes/EntityTypeDefinitions.php
b/lib/includes/EntityTypeDefinitions.php
index c2c44cf..d674200 100644
--- a/lib/includes/EntityTypeDefinitions.php
+++ b/lib/includes/EntityTypeDefinitions.php
@@ -109,4 +109,11 @@
return $this->getMapForDefinitionField(
'content-handler-factory-callback' );
}
+ /**
+ * @return string[]
+ */
+ public function getJsDeserializerFactoryFunctions() {
+ return $this->getMapForDefinitionField(
'js-deserializer-factory-function' );
+ }
+
}
diff --git a/repo/includes/Modules/EntityTypesModuleWorker.php
b/repo/includes/Modules/EntityTypesModuleWorker.php
new file mode 100644
index 0000000..a8a3bf1
--- /dev/null
+++ b/repo/includes/Modules/EntityTypesModuleWorker.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+use Wikibase\Lib\EntityTypeDefinitions;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class EntityTypesModuleWorker implements MwConfigModuleWorker {
+
+ /**
+ * @var EntityTypeDefinitions
+ */
+ private $entityTypeDefinitions;
+
+ public function __construct( EntityTypeDefinitions
$entityTypeDefinitions ) {
+ $this->entityTypeDefinitions = $entityTypeDefinitions;
+ }
+
+ /**
+ * @since 0.5
+ *
+ * @param ResourceLoaderContext $context
+ *
+ * @return mixed
+ */
+ public function getValue( ResourceLoaderContext $context ) {
+ return [
+ "types" =>
$this->entityTypeDefinitions->getEntityTypes(),
+ "deserializer-factory-functions" =>
$this->entityTypeDefinitions->getJsDeserializerFactoryFunctions()
+ ];
+ }
+
+}
diff --git a/repo/includes/Modules/MwConfigModule.php
b/repo/includes/Modules/MwConfigModule.php
new file mode 100644
index 0000000..c5a1898
--- /dev/null
+++ b/repo/includes/Modules/MwConfigModule.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoader;
+use ResourceLoaderContext;
+use ResourceLoaderModule;
+use Xml;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class MwConfigModule extends ResourceLoaderModule {
+
+ /**
+ * @var string
+ */
+ private $configName;
+
+ /**
+ * @var callable
+ */
+ private $getWorker;
+
+ public function __construct( $info ) {
+ $this->getWorker = $info['getworker'];
+ $this->configName = $info['name'];
+ }
+
+ /**
+ * @see ResourceLoaderModule::getScript
+ *
+ * @since 0.5
+ *
+ * @param ResourceLoaderContext $context
+ *
+ * @return string
+ */
+ public function getScript( ResourceLoaderContext $context ) {
+ return Xml::encodeJsCall(
+ 'mediaWiki.config.set',
+ [
+ $this->configName,
+ call_user_func( $this->getWorker )->getValue(
$context )
+ ],
+ ResourceLoader::inDebugMode()
+ );
+ }
+
+ /**
+ * @return bool
+ */
+ public function enableModuleContentVersion() {
+ return true;
+ }
+
+}
diff --git a/repo/includes/Modules/MwConfigModuleWorker.php
b/repo/includes/Modules/MwConfigModuleWorker.php
new file mode 100644
index 0000000..0ec31f3
--- /dev/null
+++ b/repo/includes/Modules/MwConfigModuleWorker.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+interface MwConfigModuleWorker {
+
+ /**
+ * @since 0.5
+ *
+ * @param ResourceLoaderContext $context
+ *
+ * @return mixed
+ */
+ public function getValue( ResourceLoaderContext $context );
+
+}
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index 7b0fe68..677ab8b 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -105,6 +105,7 @@
use Wikibase\Repo\Localizer\MessageExceptionLocalizer;
use Wikibase\Repo\Localizer\MessageParameterFormatter;
use Wikibase\Repo\Localizer\ParseExceptionLocalizer;
+use Wikibase\Repo\Modules\EntityTypesModuleWorker;
use Wikibase\Repo\Notifications\ChangeNotifier;
use Wikibase\Repo\Notifications\ChangeTransmitter;
use Wikibase\Repo\Notifications\DatabaseChangeTransmitter;
@@ -1660,4 +1661,8 @@
return new WikibaseHtmlSnakFormatterFactory(
$this->getSnakFormatterFactory() );
}
+ public function getEntityTypesModuleWorker() {
+ return new EntityTypesModuleWorker(
$this->entityTypeDefinitions );
+ }
+
}
diff --git a/repo/resources/Resources.php b/repo/resources/Resources.php
index e935bbb..53c2ada 100644
--- a/repo/resources/Resources.php
+++ b/repo/resources/Resources.php
@@ -1,6 +1,8 @@
<?php
use DataTypes\Modules\DataTypesModule;
+use Wikibase\Repo\Modules\EntityTypesModuleWorker;
+use Wikibase\Repo\Modules\MwConfigModule;
use Wikibase\Repo\WikibaseRepo;
/**
@@ -48,6 +50,14 @@
'datatypesconfigvarname' => 'wbDataTypes',
),
+ 'mw.config.values.wbEntityTypes' => $moduleTemplate + [
+ 'class' => MwConfigModule::class,
+ 'name' => 'wbEntityTypes',
+ 'getworker' => function() {
+ return
WikibaseRepo::getDefaultInstance()->getEntityTypesModuleWorker();
+ }
+ ],
+
'wikibase.dataTypeStore' => $moduleTemplate + array(
'scripts' => array(
'dataTypes/wikibase.dataTypeStore.js',
@@ -68,6 +78,7 @@
'dependencies' => array(
'mediawiki.page.watch.ajax',
'mediawiki.user',
+ 'mw.config.values.wbEntityTypes',
'mw.config.values.wbRepo',
'jquery.wikibase.toolbarcontroller',
'jquery.wikibase.toolbarcontroller.definitions.addtoolbar.statementgrouplistview-statementgroupview',
@@ -99,7 +110,6 @@
'wikibase.parsers.getStore',
'wikibase.api.RepoApi',
'wikibase.RevisionStore',
- 'wikibase.serialization.EntityDeserializer',
'wikibase.serialization.EntityDeserializer',
'wikibase.sites',
'wikibase.store.ApiEntityStore',
diff --git a/repo/resources/wikibase.EntityInitializer.js
b/repo/resources/wikibase.EntityInitializer.js
index eba10bd..5b60782 100644
--- a/repo/resources/wikibase.EntityInitializer.js
+++ b/repo/resources/wikibase.EntityInitializer.js
@@ -81,14 +81,43 @@
return;
}
- var entityJSON = JSON.parse( serializedEntity ),
- entityDeserializer = new
wb.serialization.EntityDeserializer();
-
- deferred.resolve(
entityDeserializer.deserialize( entityJSON ) );
- entityJSON = null;
+ self._getDeserializer().done( function(
entityDeserializer ) {
+ var entity =
entityDeserializer.deserialize( JSON.parse( serializedEntity ) );
+ deferred.resolve( entity );
+ } );
} );
return deferred.promise();
+ },
+
+ /**
+ * @return {Object} jQuery promise
+ * Resolved parameters:
+ * - {wikibase.serialization.EntityDeserializer}
+ * No rejected parameters.
+ */
+ _getDeserializer: function() {
+ var entityDeserializer = new
wb.serialization.EntityDeserializer(),
+ deferred = $.Deferred();
+
+ var entityTypes = mw.config.get( 'wbEntityTypes' );
+ var modules = [];
+ var typeNames = [];
+ entityTypes.types.forEach( function( type ) {
+ var deserializerFactoryFunction = entityTypes[
'deserializer-factory-functions' ][ type ];
+ if ( deserializerFactoryFunction ) {
+ modules.push(
deserializerFactoryFunction );
+ typeNames.push( type );
+ }
+ } );
+ mw.loader.using( modules, function() {
+ modules.forEach( function( module, index ) {
+ entityDeserializer.registerStrategy(
mw.loader.require( module )(), typeNames[ index ] );
+ } );
+
+ deferred.resolve( entityDeserializer );
+ } );
+ return deferred.promise();
}
} );
--
To view, visit https://gerrit.wikimedia.org/r/281635
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ic058f8c61f6ef06151acfb72a7e1f45d4837e45c
Gerrit-PatchSet: 10
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Adrian Heine <[email protected]>
Gerrit-Reviewer: Adrian Heine <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits