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