Adrian Lang has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/188357

Change subject: Introduce wikibase.view.ViewFactory
......................................................................

Introduce wikibase.view.ViewFactory

Bug: T87434
Change-Id: I0ff09c7621f478bf05a87a072954d405971750eb
---
M repo/resources/Resources.php
M repo/resources/wikibase.ui.entityViewInit.js
A view/resources/ViewFactory.js
M view/resources/resources.php
A view/tests/qunit/ViewFactory.tests.js
M view/tests/qunit/resources.php
6 files changed, 264 insertions(+), 29 deletions(-)


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

diff --git a/repo/resources/Resources.php b/repo/resources/Resources.php
index 068a24b..c76b1a8 100644
--- a/repo/resources/Resources.php
+++ b/repo/resources/Resources.php
@@ -148,8 +148,6 @@
                        'dependencies' => array(
                                'mediawiki.user',
                                'mw.config.values.wbRepo',
-                               'jquery.wikibase.itemview',
-                               'jquery.wikibase.propertyview',
                                'jquery.wikibase.toolbarcontroller',
                                
'jquery.wikibase.toolbarcontroller.definitions.addtoolbar.statementgrouplistview-statementgroupview',
                                
'jquery.wikibase.toolbarcontroller.definitions.addtoolbar.statementlistview-statementview',
@@ -183,7 +181,7 @@
                                'wikibase.store.CombiningEntityStore',
                                'wikibase.store.FetchedContentUnserializer',
                                'wikibase.store.MwConfigEntityStore',
-                               'wikibase.ValueViewBuilder'
+                               'wikibase.view.ViewFactory'
                        ),
                        'messages' => array(
                                'pagetitle',
diff --git a/repo/resources/wikibase.ui.entityViewInit.js 
b/repo/resources/wikibase.ui.entityViewInit.js
index eec6125..263477d 100644
--- a/repo/resources/wikibase.ui.entityViewInit.js
+++ b/repo/resources/wikibase.ui.entityViewInit.js
@@ -103,12 +103,12 @@
 
        /**
         * Builds an entity store.
-        * @todo Move to a top-level factory or application scope
         *
         * @param {wikibase.api.RepoApi} repoApi
+        * @param {string} language The language code of the ui language
         * @return {wikibase.store.CombiningEntityStore}
         */
-       function buildEntityStore( repoApi ) {
+       function buildEntityStore( repoApi, language ) {
                // Deserializer for fetched content whose content is a 
wb.datamodel.Entity:
                var fetchedEntityDeserializer = new 
wb.store.FetchedContentUnserializer(
                                new wb.serialization.EntityDeserializer()
@@ -119,10 +119,9 @@
                        new wb.store.ApiEntityStore(
                                repoApi,
                                fetchedEntityDeserializer,
-                               [ mw.config.get( 'wgUserLanguage' ) ]
+                               [ language ]
                        )
                ] );
-
        }
 
        /**
@@ -136,40 +135,32 @@
                var repoConfig = mw.config.get( 'wbRepo' );
                var mwApi = wb.api.getLocationAgnosticMwApi( repoConfig.url + 
repoConfig.scriptPath + '/api.php' );
                var repoApi = new wb.api.RepoApi( mwApi ),
-                       entityStore = buildEntityStore( repoApi ),
+                       userLanguages = getUserLanguages(),
+                       entityStore = buildEntityStore( repoApi, 
userLanguages[0] ),
                        revisionStore = new wb.RevisionStore( mw.config.get( 
'wgCurRevisionId' ) ),
                        entityChangersFactory = new 
wb.entityChangers.EntityChangersFactory(
                                repoApi,
                                revisionStore,
                                entity
-                       );
-
-               var viewName = entity.getType() + 'view';
-
-               if( !$.wikibase[ viewName ] ) {
-                       throw new Error( 'View for entity type ' + 
entity.getType() + ' does not exist' );
-               }
-
-               $entityview[ viewName ]( {
-                       value: entity,
-                       languages: getUserLanguages(),
-                       entityChangersFactory: entityChangersFactory,
-                       entityStore: entityStore,
-                       valueViewBuilder: new wb.ValueViewBuilder(
+                       ),
+                       viewFactory = new wikibase.view.ViewFactory(
+                               dataTypeStore,
+                               entityChangersFactory,
+                               entityStore,
                                getExpertsStore( dataTypeStore ),
                                getFormatterStore( repoApi, dataTypeStore ),
-                               getParserStore( repoApi ),
-                               mw.config.get( 'wgUserLanguage' ),
                                {
                                        getMessage: function( key, params ) {
                                                return mw.msg.apply( mw, [ key 
].concat( params ) );
                                        }
-                               }
-                       ),
-                       dataTypeStore: dataTypeStore
-               } );
+                               },
+                               getParserStore( repoApi ),
+                               userLanguages
+                       );
 
-               return viewName;
+               var entityView = viewFactory.getEntityView( entity, $entityview 
);
+
+               return entityView.widgetName;
        }
 
        /**
diff --git a/view/resources/ViewFactory.js b/view/resources/ViewFactory.js
new file mode 100644
index 0000000..3b5f45a
--- /dev/null
+++ b/view/resources/ViewFactory.js
@@ -0,0 +1,132 @@
+( function( $, wb ) {
+       'use strict';
+
+       var MODULE = wb.view;
+
+       /**
+        * A factory for creating view widgets
+        *
+        * @class wikibase.view.ViewFactory
+        * @license GNU GPL v2+
+        * @author Adrian Heine < [email protected] >
+        *
+        * @param {dataTypes.DataTypeStore} dataTypeStore
+        * @param {wikibase.entityChangers.EntityChangersFactory} 
entityChangersFactory
+        * @param {wikibase.store.EntityStore} entityStore
+        * @param {jQuery.valueview.ExpertStore} expertStore
+        * @param {valueFormatters.ValueFormatterStore} formatterStore
+        * @param {util.MessageProvider} messageProvider
+        * @param {valueParsers.ValueParserStore} parserStore
+        * @param {string[]} userLanguages An array of language codes, the 
first being the UI language
+        */
+       var SELF = MODULE.ViewFactory = function ViewFactory(
+               dataTypeStore,
+               entityChangersFactory,
+               entityStore,
+               expertStore,
+               formatterStore,
+               messageProvider,
+               parserStore,
+               userLanguages
+       ) {
+               this._dataTypeStore = dataTypeStore;
+               this._entityChangersFactory = entityChangersFactory;
+               this._entityStore = entityStore;
+               this._expertStore = expertStore;
+               this._formatterStore = formatterStore;
+               this._messageProvider = messageProvider;
+               this._parserStore = parserStore;
+               this._userLanguages = userLanguages;
+       };
+
+       /**
+        * @property {dataTypes.DataTypeStore}
+        * @private
+        **/
+       SELF.prototype._dataTypeStore = null;
+
+       /**
+        * @property {wikibase.entityChangers.EntityChangersFactory}
+        * @private
+        **/
+       SELF.prototype._entityChangersFactory = null;
+
+       /**
+        * @property {wikibase.store.EntityStore}
+        * @private
+        **/
+       SELF.prototype._entityStore = null;
+
+       /**
+        * @property {jQuery.valueview.ExpertStore}
+        * @private
+        **/
+       SELF.prototype._expertStore = null;
+
+       /**
+        * @property {valueFormatters.ValueFormatterStore}
+        * @private
+        **/
+       SELF.prototype._formatterStore = null;
+
+       /**
+        * @property {util.MessageProvider}
+        * @private
+        **/
+       SELF.prototype._messageProvider = null;
+
+       /**
+        * @property {valueParsers.ValueParserStore}
+        * @private
+        **/
+       SELF.prototype._parserStore = null;
+
+       /**
+        * @property {string[]}
+        * @private
+        **/
+       SELF.prototype._userLanguages = null;
+
+       /**
+        * Construct a suitable view for the given entity on the given DOM 
element
+        *
+        * @param {wikibase.datamodel.Entity} entity
+        * @param {jQuery} $dom
+        * @return {Object} The constructed entity view
+        **/
+       SELF.prototype.getEntityView = function( entity, $dom ) {
+               return this._getView(
+                       entity.getType() + 'view',
+                       $dom,
+                       {
+                               dataTypeStore: this._dataTypeStore,
+                               entityChangersFactory: 
this._entityChangersFactory,
+                               entityStore: this._entityStore,
+                               languages: this._userLanguages,
+                               value: entity,
+                               valueViewBuilder: this._getValueViewBuilder()
+                       }
+               );
+       };
+
+       SELF.prototype._getValueViewBuilder = function() {
+               return new wb.ValueViewBuilder(
+                       this._expertStore,
+                       this._formatterStore,
+                       this._parserStore,
+                       this._userLanguages && this._userLanguages[0],
+                       this._messageProvider
+               );
+       };
+
+       SELF.prototype._getView = function( viewName, $dom, options ) {
+               if( !$.wikibase[ viewName ] ) {
+                       throw new Error( 'View ' + viewName + ' does not exist' 
);
+               }
+
+               $dom[ viewName ]( options );
+
+               return $dom.data( viewName );
+       };
+
+} ( jQuery, wikibase ) );
diff --git a/view/resources/resources.php b/view/resources/resources.php
index b47358d..edd593d 100644
--- a/view/resources/resources.php
+++ b/view/resources/resources.php
@@ -19,6 +19,17 @@
                                'namespace.js'
                        ),
                ),
+               'wikibase.view.ViewFactory' => $moduleTemplate + array(
+                       'scripts' => array(
+                               'ViewFactory.js'
+                       ),
+                       'dependencies' => array(
+                               'jquery.wikibase.itemview',
+                               'jquery.wikibase.propertyview',
+                               'wikibase.view.__namespace',
+                               'wikibase.ValueViewBuilder'
+                       )
+               ),
        );
 
        return $modules;
diff --git a/view/tests/qunit/ViewFactory.tests.js 
b/view/tests/qunit/ViewFactory.tests.js
new file mode 100644
index 0000000..19fd779
--- /dev/null
+++ b/view/tests/qunit/ViewFactory.tests.js
@@ -0,0 +1,94 @@
+( function( $, wikibase, ViewFactory ) {
+       'use strict';
+
+       QUnit.module( 'wikibase.view.ViewFactory', QUnit.newMwEnvironment() );
+
+       QUnit.test( 'is constructable', function( assert ) {
+               assert.ok( new ViewFactory() instanceof ViewFactory );
+       } );
+
+       function getEntityStub( type ) {
+               return {
+                       getType: function() {
+                               return type;
+                       }
+               };
+       }
+
+       QUnit.test( 'getEntityView constructs correct views', function( assert 
) {
+               var viewFactory = new ViewFactory(),
+                       fooView = {},
+                       $dom = {
+                               data: function( type ) {
+                                       return fooView;
+                               }
+                       },
+                       FooView = $dom.fooview = $.wikibase.fooview = 
sinon.spy();
+
+               var res = viewFactory.getEntityView( getEntityStub( 'foo' ), 
$dom );
+
+               assert.strictEqual( res, fooView );
+               sinon.assert.calledOnce( FooView );
+       } );
+
+       QUnit.test( 'getEntityView throws on incorrect views', function( assert 
) {
+               var viewFactory = new ViewFactory();
+
+               assert.throws(
+                       function() {
+                               viewFactory.getEntityView( getEntityStub( 
'unknown' ) );
+                       },
+                       new Error( 'View unknownview does not exist' )
+               );
+       } );
+
+       QUnit.test( 'getEntityView passes correct options to views', function( 
assert ) {
+               var dataTypeStore = {},
+                       entity = getEntityStub( 'foo' ),
+                       entityChangersFactory = {},
+                       entityStore = {},
+                       expertStore = {},
+                       formatterStore = {},
+                       messageProvider = {},
+                       parserStore = {},
+                       userLanguages = [],
+                       viewFactory = new ViewFactory(
+                               dataTypeStore,
+                               entityChangersFactory,
+                               entityStore,
+                               expertStore,
+                               formatterStore,
+                               messageProvider,
+                               parserStore,
+                               userLanguages
+                       ),
+                       $dom = {
+                               data: function( type ) {}
+                       },
+                       FooView = $dom.fooview = $.wikibase.fooview = 
sinon.spy();
+
+               sinon.spy( wb, 'ValueViewBuilder' );
+
+               viewFactory.getEntityView( entity, $dom );
+
+               sinon.assert.calledWith( wb.ValueViewBuilder,
+                       expertStore,
+                       formatterStore,
+                       parserStore,
+                       userLanguages[0],
+                       messageProvider
+               );
+
+               sinon.assert.calledWith( FooView, {
+                       dataTypeStore: dataTypeStore,
+                       entityChangersFactory: entityChangersFactory,
+                       entityStore: entityStore,
+                       languages: userLanguages,
+                       value: entity,
+                       valueViewBuilder: wb.ValueViewBuilder.thisValues[0]
+               } );
+
+               wb.ValueViewBuilder.restore();
+       } );
+
+}( jQuery, wikibase, wikibase.view.ViewFactory ) );
diff --git a/view/tests/qunit/resources.php b/view/tests/qunit/resources.php
index e06c6c8..447ef14 100644
--- a/view/tests/qunit/resources.php
+++ b/view/tests/qunit/resources.php
@@ -15,6 +15,15 @@
 
        $modules = array(
 
+               'wikibase.view.ViewFactory.tests' => $moduleBase + array(
+                       'scripts' => array(
+                               'ViewFactory.tests.js',
+                       ),
+                       'dependencies' => array(
+                               'wikibase.view.ViewFactory',
+                       ),
+               ),
+
        );
 
        return $modules;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ff09c7621f478bf05a87a072954d405971750eb
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Adrian Lang <[email protected]>

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

Reply via email to