jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/387792 )

Change subject: Move option helper functions to new Options class
......................................................................


Move option helper functions to new Options class

These functions were added in change I78cfb4d8d5 (commit fdc210cafa),
but were scattered across two classes. Let’s create a new class to
collect them, and also add some more tests.

Change-Id: I1e5277cf1398d04f3e6e6501848213de6b95e16f
---
M embed.html
M index.html
M wikibase/queryService/ui/ResultView.js
M wikibase/queryService/ui/resultBrowser/AbstractResultBrowser.js
M wikibase/queryService/ui/resultBrowser/CoordinateResultBrowser.js
M wikibase/queryService/ui/resultBrowser/helper/FormatterHelper.js
A wikibase/queryService/ui/resultBrowser/helper/Options.js
M wikibase/tests/index.html
M wikibase/tests/queryService/ui/resultBrowser/helper/FormatterHelper.test.js
A wikibase/tests/queryService/ui/resultBrowser/helper/Options.test.js
10 files changed, 192 insertions(+), 72 deletions(-)

Approvals:
  Smalyshev: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/embed.html b/embed.html
index 5b98e78..78c0109 100644
--- a/embed.html
+++ b/embed.html
@@ -201,6 +201,7 @@
        <script src="wikibase/config.js"></script>
        <script src="wikibase/queryService/ui/ResultView.js"></script>
        <script 
src="wikibase/queryService/ui/resultBrowser/helper/FormatterHelper.js"></script>
+       <script 
src="wikibase/queryService/ui/resultBrowser/helper/Options.js"></script>
        <script 
src="wikibase/queryService/ui/resultBrowser/AbstractResultBrowser.js"></script>
        <script 
src="wikibase/queryService/ui/resultBrowser/AbstractChartResultBrowser.js"></script>
        <script 
src="wikibase/queryService/ui/resultBrowser/AbstractDimpleChartResultBrowser.js"></script>
diff --git a/index.html b/index.html
index abca5e7..4d846ac 100644
--- a/index.html
+++ b/index.html
@@ -378,6 +378,7 @@
        <script src="wikibase/queryService/ui/dialog/CodeExample.js"></script>
        <script src="wikibase/queryService/ui/ResultView.js"></script>
        <script 
src="wikibase/queryService/ui/resultBrowser/helper/FormatterHelper.js"></script>
+       <script 
src="wikibase/queryService/ui/resultBrowser/helper/Options.js"></script>
        <script 
src="wikibase/queryService/ui/resultBrowser/AbstractResultBrowser.js"></script>
        <script 
src="wikibase/queryService/ui/resultBrowser/AbstractChartResultBrowser.js"></script>
        <script 
src="wikibase/queryService/ui/resultBrowser/AbstractDimpleChartResultBrowser.js"></script>
diff --git a/wikibase/queryService/ui/ResultView.js 
b/wikibase/queryService/ui/ResultView.js
index 882348e..bd9cfaa 100644
--- a/wikibase/queryService/ui/ResultView.js
+++ b/wikibase/queryService/ui/ResultView.js
@@ -362,7 +362,10 @@
                                self._setSelectedDisplayType( b );
                                defaultBrowser = instance;
                                if ( 'options' in defaultBrowserOptions ) {
-                                       instance.setOptions( 
defaultBrowserOptions.options );
+                                       var options = new 
wikibase.queryService.ui.resultBrowser.helper.Options(
+                                               defaultBrowserOptions.options
+                                       );
+                                       instance.setOptions( options );
                                }
                        }
                        b.object = instance;
diff --git a/wikibase/queryService/ui/resultBrowser/AbstractResultBrowser.js 
b/wikibase/queryService/ui/resultBrowser/AbstractResultBrowser.js
index 65813f0..13b5d60 100644
--- a/wikibase/queryService/ui/resultBrowser/AbstractResultBrowser.js
+++ b/wikibase/queryService/ui/resultBrowser/AbstractResultBrowser.js
@@ -32,10 +32,10 @@
        SELF.prototype._result = null;
 
        /**
-        * @property {Object}
+        * @property {wikibase.queryService.ui.resultBrowser.helper.Options}
         * @protected
         */
-       SELF.prototype._options = {};
+       SELF.prototype._options = null;
 
        /**
         * @property {Function}
@@ -67,44 +67,21 @@
        };
 
        /**
-        * Sets the options
+        * Sets the options object.
         *
-        * @param {Object} options set
+        * @param {wikibase.queryService.ui.resultBrowser.helper.Options} 
options
         */
        SELF.prototype.setOptions = function( options ) {
                this._options = options;
        };
 
        /**
-        * Get options
+        * Gets the options object
         *
-        * @return {Object} options set
+        * @return {wikibase.queryService.ui.resultBrowser.helper.Options} 
options
         */
        SELF.prototype.getOptions = function() {
-               return this._options || {};
-       };
-
-       /**
-        * Get a single option,
-        * using a certain default value
-        * if the option is not specified.
-        *
-        * @param {string} name The name of the option.
-        * @param {*} defaultValue The default value to use if the option is 
not specified.
-        * This parameter is not optional – if the option may be absent,
-        * explicitly pass undefined as the default value.
-        * @return {*}
-        */
-       SELF.prototype.getOption = function( name, defaultValue ) {
-               if ( arguments.length !== 2 ) {
-                       throw new Error( 'getOption must be called with exactly 
two arguments' );
-               }
-
-               if ( name in this._options ) {
-                       return this._options[ name ];
-               } else {
-                       return defaultValue;
-               }
+               return this._options || new 
wikibase.queryService.ui.resultBrowser.helper.Options( {} );
        };
 
        /**
diff --git a/wikibase/queryService/ui/resultBrowser/CoordinateResultBrowser.js 
b/wikibase/queryService/ui/resultBrowser/CoordinateResultBrowser.js
index 1dbae88..e9cd6bf 100644
--- a/wikibase/queryService/ui/resultBrowser/CoordinateResultBrowser.js
+++ b/wikibase/queryService/ui/resultBrowser/CoordinateResultBrowser.js
@@ -348,8 +348,8 @@
         * @private
         */
        SELF.prototype._getMarkerGroupsLayer = function( row ) {
-               var variables = this.getOption( 'layer', 
DEFAULT_LAYER_VARIABLES ),
-                       columns = this._getFormatter().getColumnNamesOption( 
variables ),
+               var options = this.getOptions(),
+                       columns = options.getColumnNames( 'layer', 
DEFAULT_LAYER_VARIABLES ),
                        column = columns.find( function( column ) {
                                return row[column];
                        } );
diff --git a/wikibase/queryService/ui/resultBrowser/helper/FormatterHelper.js 
b/wikibase/queryService/ui/resultBrowser/helper/FormatterHelper.js
index 5a5f6ac..69fde1b 100644
--- a/wikibase/queryService/ui/resultBrowser/helper/FormatterHelper.js
+++ b/wikibase/queryService/ui/resultBrowser/helper/FormatterHelper.js
@@ -457,33 +457,6 @@
        };
 
        /**
-        * Gets a list of column names from a result browser option
-        * specifying one or more corresponding variable names.
-        * (The variable names start with a question mark,
-        * the returned column names don’t.)
-        *
-        * @param {string[]|string} optionValue
-        * @return {string[]}
-        */
-       SELF.prototype.getColumnNamesOption = function( optionValue ) {
-               if ( !Array.isArray( optionValue ) ) {
-                       optionValue = [ optionValue ];
-               }
-               optionValue = optionValue.filter( function( variableName ) {
-                       if ( !variableName.startsWith( '?' ) ) {
-                               window.console.warn(
-                                       'column name ' + variableName + ' is 
not a variable name, ignoring'
-                               );
-                               return false;
-                       }
-                       return true;
-               } );
-               return optionValue.map( function( variableName ) {
-                       return variableName.substring( 1 );
-               } );
-       };
-
-       /**
         * @see AbstractResultBrowser._i18n
         */
        SELF.prototype._i18n = null;
diff --git a/wikibase/queryService/ui/resultBrowser/helper/Options.js 
b/wikibase/queryService/ui/resultBrowser/helper/Options.js
new file mode 100644
index 0000000..05f9b6e
--- /dev/null
+++ b/wikibase/queryService/ui/resultBrowser/helper/Options.js
@@ -0,0 +1,116 @@
+var wikibase = wikibase || {};
+wikibase.queryService = wikibase.queryService || {};
+wikibase.queryService.ui = wikibase.queryService.ui || {};
+wikibase.queryService.ui.resultBrowser = 
wikibase.queryService.ui.resultBrowser || {};
+wikibase.queryService.ui.resultBrowser.helper = 
wikibase.queryService.ui.resultBrowser.helper || {};
+
+wikibase.queryService.ui.resultBrowser.helper.Options = ( function ( $ ) {
+       'use strict';
+
+       /**
+        * A set of options for result views,
+        * with some convenience accessor methods.
+        *
+        * @class wikibase.queryService.ui.resultBrowser.helper.Options
+        * @license GNU GPL v2+
+        *
+        * @author Lucas Werkmeister
+        * @constructor
+        */
+       function SELF( options ) {
+               if ( typeof options !== 'object' ) {
+                       throw new Error( 'options must be an object' );
+               }
+
+               // TODO clone+freeze options?
+               this._options = options;
+       }
+
+       /**
+        * @property {Object}
+        * @private
+        */
+       SELF.prototype._options = null;
+
+       /**
+        * @private
+        */
+       SELF.prototype._requireTwoArguments = function( args ) {
+               if ( args.length !== 2 ) {
+                       throw new Error( 'must be called with exactly two 
arguments' );
+               }
+       };
+
+       /**
+        * Get a single option,
+        * using a certain default value
+        * if the option is not specified.
+        *
+        * @param {string} name The name of the option.
+        * @param {*} defaultValue The default value to use if the option is 
not specified.
+        * This parameter is not optional – if the option may be absent,
+        * explicitly pass undefined as the default value.
+        * @return {*}
+        */
+       SELF.prototype.get = function( name, defaultValue ) {
+               this._requireTwoArguments( arguments );
+
+               if ( name in this._options ) {
+                       return this._options[ name ];
+               } else {
+                       return defaultValue;
+               }
+       };
+
+       /**
+        * Get an option that should be an array.
+        * If the options specify a single value,
+        * it is wrapped in a single-element array.
+        *
+        * @param {string} name
+        * @param {*} defaultValue
+        * @return {Array}
+        */
+       SELF.prototype.getArray = function( name, defaultValue ) {
+               this._requireTwoArguments( arguments );
+
+               var option = this.get( name, defaultValue );
+               if ( Array.isArray( option ) ) {
+                       return option;
+               } else {
+                       return [ option ];
+               }
+       };
+
+       /**
+        * Get a list of column names
+        * from an option specifying an array of variables names.
+        * (The variable names start with a question mark,
+        * the returned column names don’t.)
+        *
+        * @param {string} name
+        * @param {*} defaultValue
+        * @return {Array}
+        */
+       SELF.prototype.getColumnNames = function( name, defaultValue ) {
+               this._requireTwoArguments( arguments );
+
+               return this.getArray( name, defaultValue )
+                       .filter( function( variableName ) {
+                               if ( typeof variableName !== 'string' ||
+                                       !variableName.startsWith( '?' ) ) {
+                                       window.console.warn(
+                                               'column name ' + variableName + 
' is not a variable name, ignoring'
+                                       );
+                                       return false;
+                               }
+                               return true;
+                       } )
+                       .map( function( variableName ) {
+                               return variableName.substring( 1 );
+                       } );
+       };
+
+       return SELF;
+
+}( jQuery ) );
diff --git a/wikibase/tests/index.html b/wikibase/tests/index.html
index 87e73ee..66e12a9 100644
--- a/wikibase/tests/index.html
+++ b/wikibase/tests/index.html
@@ -43,6 +43,7 @@
        <script src="../queryService/ui/editor/hint/Rdf.js"></script>
        <script src="../queryService/RdfNamespaces.js"></script>
        <script 
src="../queryService/ui/resultBrowser/helper/FormatterHelper.js"></script>
+       <script 
src="../queryService/ui/resultBrowser/helper/Options.js"></script>
        <script 
src="../queryService/ui/resultBrowser/AbstractResultBrowser.js"></script>
        <script 
src="../queryService/ui/resultBrowser/AbstractChartResultBrowser.js"></script>
        <script 
src="../queryService/ui/resultBrowser/AbstractDimpleChartResultBrowser.js"></script>
@@ -64,6 +65,7 @@
 <!-- Tests -->
        <script src="queryService/ui/editor/hint/Rdf.test.js"></script>
        <script 
src="queryService/ui/resultBrowser/helper/FormatterHelper.test.js"></script>
+       <script 
src="queryService/ui/resultBrowser/helper/Options.test.js"></script>
        <script 
src="queryService/ui/resultBrowser/ResultBrowser.test.js"></script>
        <script 
src="queryService/ui/resultBrowser/CoordinateResultBrowser.test.js"></script>
        <script src="queryService/api/CodeSamples.test.js"></script>
diff --git 
a/wikibase/tests/queryService/ui/resultBrowser/helper/FormatterHelper.test.js 
b/wikibase/tests/queryService/ui/resultBrowser/helper/FormatterHelper.test.js
index fc0a9ab..b08858a 100644
--- 
a/wikibase/tests/queryService/ui/resultBrowser/helper/FormatterHelper.test.js
+++ 
b/wikibase/tests/queryService/ui/resultBrowser/helper/FormatterHelper.test.js
@@ -86,16 +86,4 @@
                } );
        } );
 
-       QUnit.test( 'getColumnNamesOption', function( assert ) {
-               assert.deepEqual( helper.getColumnNamesOption( '?foo' ), [ 
'foo' ], 'message foo' );
-
-               assert.deepEqual( helper.getColumnNamesOption( [ '?bar', '?baz' 
] ), [ 'bar', 'baz' ] );
-
-               var realWarn = window.console.warn;
-               window.console.warn = sinon.spy();
-               assert.deepEqual( helper.getColumnNamesOption( 'reserved' ), [] 
);
-               assert.ok( window.console.warn.calledOnce );
-               window.console.warn = realWarn;
-       } );
-
 }( QUnit, wikibase ) );
diff --git 
a/wikibase/tests/queryService/ui/resultBrowser/helper/Options.test.js 
b/wikibase/tests/queryService/ui/resultBrowser/helper/Options.test.js
new file mode 100644
index 0000000..95f82e9
--- /dev/null
+++ b/wikibase/tests/queryService/ui/resultBrowser/helper/Options.test.js
@@ -0,0 +1,59 @@
+( function( $, QUnit, sinon, wb ) {
+       'use strict';
+
+       QUnit.module( 'wikibase.queryService.ui.resultBrowser.helper.Options' );
+
+       var Options = wb.queryService.ui.resultBrowser.helper.Options;
+
+       QUnit.test( 'get', function( assert ) {
+               var options = new Options( {
+                       test1: 'foo',
+                       test2: [ 'bar' ],
+                       /* test3 not defined */
+                       test4: undefined
+               } );
+
+               assert.strictEqual( options.get( 'test1', undefined ), 'foo' );
+               assert.deepEqual( options.get( 'test2', [ 'foo' ] ), [ 'bar' ] 
);
+               assert.strictEqual( options.get( 'test3', 42.0 ), 42.0 );
+               assert.strictEqual( options.get( 'test4', 'value' ), undefined 
);
+
+               assert.throws( function() { options.get( 'test1' ); } );
+       } );
+
+       QUnit.test( 'getArray', function( assert ) {
+               var options = new Options( {
+                       test1: 'foo',
+                       test2: [ 'bar' ]
+                       /* test3 not defined */
+               } );
+
+               assert.deepEqual( options.getArray( 'test1', undefined ), [ 
'foo' ] );
+               assert.deepEqual( options.getArray( 'test2', undefined ), [ 
'bar' ] );
+               assert.deepEqual( options.getArray( 'test3', 'default' ), [ 
'default' ] );
+
+               assert.throws( function() { options.getArray( 'test1' ); } );
+       } );
+
+       QUnit.test( 'getColumnNames', function( assert ) {
+               var options = new Options( {
+                       test1: '?foo',
+                       test2: [ '?bar', '?baz' ],
+                       /* test3 not defined */
+                       test4: 'reserved'
+               } );
+
+               assert.deepEqual( options.getColumnNames( 'test1', undefined ), 
[ 'foo' ] );
+               assert.deepEqual( options.getColumnNames( 'test2', [ '?unused' 
] ), [ 'bar', 'baz' ] );
+               assert.deepEqual( options.getColumnNames( 'test3', [ '?default' 
] ), [ 'default' ] );
+
+               var realWarn = window.console.warn;
+               window.console.warn = sinon.spy();
+               assert.deepEqual( options.getColumnNames( 'test4', undefined ), 
[] );
+               assert.ok( window.console.warn.calledOnce );
+               window.console.warn = realWarn;
+
+               assert.throws( function() { options.getColumnNames( 'test1' ); 
} );
+       } );
+
+}( jQuery, QUnit, sinon, wikibase ) );

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I1e5277cf1398d04f3e6e6501848213de6b95e16f
Gerrit-PatchSet: 3
Gerrit-Project: wikidata/query/gui
Gerrit-Branch: master
Gerrit-Owner: Lucas Werkmeister (WMDE) <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Smalyshev <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to