Aleksey Bekh-Ivanov (WMDE) has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/361498 )

Change subject: [DNM] Prototype of expert dynamic registration
......................................................................

[DNM] Prototype of expert dynamic registration

TODO:
* Create tests
* Change all experts to use `module.exports = ` pattern to return constructor
* Change config for all types to contain "expert-module" key

Change-Id: I0252d16ec531b4aee65e51029fee3051b37f872e
---
M lib/includes/DataTypeDefinitions.php
M repo/WikibaseRepo.datatypes.php
A repo/includes/Modules/PropertyValueExpertsModule.php
M repo/includes/WikibaseRepo.php
M repo/resources/Resources.php
M repo/resources/experts/getStore.js
M repo/resources/experts/resources.php
7 files changed, 76 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/98/361498/1

diff --git a/lib/includes/DataTypeDefinitions.php 
b/lib/includes/DataTypeDefinitions.php
index 9651626..6c5f5ce 100644
--- a/lib/includes/DataTypeDefinitions.php
+++ b/lib/includes/DataTypeDefinitions.php
@@ -142,6 +142,19 @@
                return array_keys( $ptDefinitions );
        }
 
+       public function getExpertModules() {
+               $ptDefinitions = $this->getFilteredByPrefix( 
$this->dataTypeDefinitions, 'PT:' );
+
+               return array_map(
+                       function ( array $d ) {
+                               return $d['expert-module'];
+                       },
+                       $ptDefinitions
+               );
+
+               return $this->getMapForDefinitionField( 'expert-module' );
+       }
+
        /**
         * @param string $field
         *
diff --git a/repo/WikibaseRepo.datatypes.php b/repo/WikibaseRepo.datatypes.php
index 97c898c..3cd00c7 100644
--- a/repo/WikibaseRepo.datatypes.php
+++ b/repo/WikibaseRepo.datatypes.php
@@ -110,6 +110,7 @@
                        ) {
                                return new CommonsMediaRdfBuilder( $vocab );
                        },
+                       'expert-module' => 
'jquery.valueview.experts.CommonsMediaType',
                ),
                'PT:geo-shape' => array(
                        'validator-factory-callback' => function() {
diff --git a/repo/includes/Modules/PropertyValueExpertsModule.php 
b/repo/includes/Modules/PropertyValueExpertsModule.php
new file mode 100644
index 0000000..0ff4e4c
--- /dev/null
+++ b/repo/includes/Modules/PropertyValueExpertsModule.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+use Wikibase\Lib\DataTypeDefinitions;
+
+class PropertyValueExpertsModule extends \ResourceLoaderModule {
+
+       /**
+        * @var DataTypeDefinitions
+        */
+       private $dataTypeDefinitions;
+
+       public function __construct( DataTypeDefinitions $dataTypeDefinitions ) 
{
+
+               $this->dataTypeDefinitions = $dataTypeDefinitions;
+       }
+
+       public function getScript( ResourceLoaderContext $context ) {
+
+               $json = \XML::encodeJsVar( 
$this->dataTypeDefinitions->getExpertModules() );
+
+               //TODO Throw exception if no expert module defined. Probably 
not here, but somewhere.
+               //TODO Change all experts to use `module.exports =` construct
+
+               $js = <<<JS
+module.exports = ( function () {
+       'use strict';
+       return $json;
+}() );
+JS;
+
+               return $js;
+       }
+
+       public function getDependencies( ResourceLoaderContext $context = null 
) {
+               return array_values( 
$this->dataTypeDefinitions->getExpertModules() );
+       }
+
+}
+
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index 967768f..185a666 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -85,6 +85,7 @@
 use Wikibase\Lib\Store\EntityRevisionLookup;
 use Wikibase\Lib\Store\EntityStore;
 use Wikibase\Lib\Store\EntityStoreWatcher;
+use Wikibase\Repo\Modules\PropertyValueExpertsModule;
 use Wikibase\Repo\Modules\SettingsValueProvider;
 use Wikibase\Rdf\EntityRdfBuilderFactory;
 use Wikibase\Repo\ChangeOp\Deserialization\ChangeOpDeserializerFactory;
@@ -1983,4 +1984,10 @@
                return $this->repositoryDefinitions->getConceptBaseUris();
        }
 
+       public function getPropertyValueExpertsModule() {
+
+
+               return new 
PropertyValueExpertsModule($this->getDataTypeDefinitions());
+       }
+
 }
diff --git a/repo/resources/Resources.php b/repo/resources/Resources.php
index 89940bf..3bbee5c 100644
--- a/repo/resources/Resources.php
+++ b/repo/resources/Resources.php
@@ -2,6 +2,7 @@
 
 use DataTypes\Modules\DataTypesModule;
 use Wikibase\Repo\Modules\MediaWikiConfigModule;
+use Wikibase\Repo\Modules\PropertyValueExpertsModule;
 use Wikibase\Repo\WikibaseRepo;
 
 /**
@@ -172,6 +173,12 @@
                        ),
                ),
 
+               'wikibase.experts.modules' => $moduleTemplate + [
+                               'factory' => function () {
+                                       return 
WikibaseRepo::getDefaultInstance()->getPropertyValueExpertsModule();
+                               }
+               ],
+
        );
 
        return array_merge(
diff --git a/repo/resources/experts/getStore.js 
b/repo/resources/experts/getStore.js
index a786913..53a140a 100644
--- a/repo/resources/experts/getStore.js
+++ b/repo/resources/experts/getStore.js
@@ -5,6 +5,8 @@
 ( function ( wb, vv, dv ) {
        'use strict';
 
+       var registeredExperts = require( 'wikibase.experts.modules' );
+
        var MODULE = wb.experts;
 
        /**
@@ -41,8 +43,10 @@
                // Register experts for data types defined in Wikibase. Since 
those data types are defined by a
                // setting, it needs to be checked whether they are actually 
defined.
 
+               //TODO After fixing all expert modules and PT declarations 
`dataTypeIdToExpertConstructor` should be built dynamically
+
                var dataTypeIdToExpertConstructor = {
-                       commonsMedia: vv.experts.CommonsMediaType,
+                       commonsMedia: 
require(registeredExperts['commonsMedia']), // Comment this line to test that 
it is failing
                        'geo-shape': vv.experts.GeoShape,
                        'tabular-data': vv.experts.TabularData,
                        'external-id': vv.experts.StringValue,
diff --git a/repo/resources/experts/resources.php 
b/repo/resources/experts/resources.php
index fe1c8e3..855c0f4 100644
--- a/repo/resources/experts/resources.php
+++ b/repo/resources/experts/resources.php
@@ -30,6 +30,7 @@
                                'getStore.js',
                        ),
                        'dependencies' => array(
+                               'wikibase.experts.modules',
                                'dataValues.values',
                                'jquery.valueview.ExpertStore',
                                'jquery.valueview.experts.CommonsMediaType',

-- 
To view, visit https://gerrit.wikimedia.org/r/361498
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0252d16ec531b4aee65e51029fee3051b37f872e
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Aleksey Bekh-Ivanov (WMDE) <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to