From bddaafa64af54a19d2f48afc76df1fa9894837de Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 5 Jun 2020 17:00:36 -0400 Subject: [PATCH 01/14] allow template input in Lib.coerce2 - fix issue 4852 - set axes tickcolor, tickwidth & tiklen via template --- src/lib/coerce.js | 9 +++ .../mocks/axes_custom-ticks_log-date.json | 80 ++++++++++--------- 2 files changed, 51 insertions(+), 38 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 108370cfe40..5f6d4a79fb8 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -412,6 +412,15 @@ exports.coerce2 = function(containerIn, containerOut, attributes, attribute, dfl var propOut = exports.coerce(containerIn, containerOut, attributes, attribute, dflt); var valIn = propIn.get(); + var attr = attributes[attribute]; + var theDefault = (dflt !== undefined) ? dflt : (attr || {}).dflt; + if( + theDefault !== undefined && + theDefault !== propOut + ) { + return propOut; + } + return (valIn !== undefined && valIn !== null) ? propOut : false; }; diff --git a/test/image/mocks/axes_custom-ticks_log-date.json b/test/image/mocks/axes_custom-ticks_log-date.json index 261015f32d1..3adb12d7b7a 100644 --- a/test/image/mocks/axes_custom-ticks_log-date.json +++ b/test/image/mocks/axes_custom-ticks_log-date.json @@ -15,44 +15,48 @@ "layout": { "width": 500, "height": 300, - "title": { - "text": "custom ticks on date & log axes" - }, - "paper_bgcolor": "lightblue", - "plot_bgcolor": "#ddd", - "yaxis": { - "type": "log", - "tickmode": "array", - "tickvals": [ - 1, - 10, - 100 - ], - "ticktext": [ - "one", - "ten", - "one
hundred" - ], - "gridwidth": 2, - "tickwidth": 15, - "tickcolor": "green", - "gridcolor": "green" - }, - "xaxis": { - "type": "date", - "tickmode": "array", - "tickvals": [ - "2010-01-16", - "2010-02-14" - ], - "ticktext": [ - "Jan 16", - "Feb 14" - ], - "gridwidth": 10, - "tickwidth": 50, - "tickcolor": "rgba(255,0,0,0.75)", - "gridcolor": "rgba(255,0,0,0.25)" + "template": { + "layout": { + "title": { + "text": "custom ticks on date & log axes" + }, + "paper_bgcolor": "lightblue", + "plot_bgcolor": "#ddd", + "yaxis": { + "type": "log", + "tickmode": "array", + "tickvals": [ + 1, + 10, + 100 + ], + "ticktext": [ + "one", + "ten", + "one
hundred" + ], + "gridwidth": 2, + "tickwidth": 15, + "tickcolor": "green", + "gridcolor": "green" + }, + "xaxis": { + "type": "date", + "tickmode": "array", + "tickvals": [ + "2010-01-16", + "2010-02-14" + ], + "ticktext": [ + "Jan 16", + "Feb 14" + ], + "gridwidth": 10, + "tickwidth": 50, + "tickcolor": "rgba(255,0,0,0.75)", + "gridcolor": "rgba(255,0,0,0.25)" + } + } } } } From 11fd23c290c21bc3538f679421f392a290678858 Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 5 Jun 2020 18:08:06 -0400 Subject: [PATCH 02/14] update axes_breaks-round-weekdaysm baseline --- .../baselines/axes_breaks-round-weekdays.png | Bin 40726 -> 40939 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/image/baselines/axes_breaks-round-weekdays.png b/test/image/baselines/axes_breaks-round-weekdays.png index 9f20ece5dfa6ccdbd90548076ae8c1cc3d9f5d6b..4f3b0c6ffdd937760ac0609cfc3281831548ff0d 100644 GIT binary patch literal 40939 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 literal 40726 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 From 756a0ee4441df7eb4ad8c347c17f2018a86e086e Mon Sep 17 00:00:00 2001 From: archmoj Date: Sun, 7 Jun 2020 18:58:03 -0400 Subject: [PATCH 03/14] refactor coerce rename v to valIn --- src/lib/coerce.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 5f6d4a79fb8..5e69cea1064 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -364,11 +364,11 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt var opts = nestedProperty(attributes, attribute).get(); var propIn = nestedProperty(containerIn, attribute); var propOut = nestedProperty(containerOut, attribute); - var v = propIn.get(); + var valIn = propIn.get(); var template = containerOut._template; - if(v === undefined && template) { - v = nestedProperty(template, attribute).get(); + if(valIn === undefined && template) { + valIn = nestedProperty(template, attribute).get(); // already used the template value, so short-circuit the second check template = 0; } @@ -381,20 +381,20 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt * individual form (eg. some array vals can be numbers, even if the * single values must be color strings) */ - if(opts.arrayOk && isArrayOrTypedArray(v)) { - propOut.set(v); - return v; + if(opts.arrayOk && isArrayOrTypedArray(valIn)) { + propOut.set(valIn); + return valIn; } var coerceFunction = exports.valObjectMeta[opts.valType].coerceFunction; - coerceFunction(v, propOut, dflt, opts); + coerceFunction(valIn, propOut, dflt, opts); var out = propOut.get(); // in case v was provided but invalid, try the template again so it still // overrides the regular default - if(template && out === dflt && !validate(v, opts)) { - v = nestedProperty(template, attribute).get(); - coerceFunction(v, propOut, dflt, opts); + if(template && out === dflt && !validate(valIn, opts)) { + valIn = nestedProperty(template, attribute).get(); + coerceFunction(valIn, propOut, dflt, opts); out = propOut.get(); } return out; From a2c1c93d5458c6ece98637bc3c9c2be8f3cd9f2f Mon Sep 17 00:00:00 2001 From: archmoj Date: Sun, 7 Jun 2020 18:59:45 -0400 Subject: [PATCH 04/14] refactor coerce rename out to valOut --- src/lib/coerce.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 5e69cea1064..51f8ce18129 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -389,15 +389,15 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt var coerceFunction = exports.valObjectMeta[opts.valType].coerceFunction; coerceFunction(valIn, propOut, dflt, opts); - var out = propOut.get(); + var valOut = propOut.get(); // in case v was provided but invalid, try the template again so it still // overrides the regular default - if(template && out === dflt && !validate(valIn, opts)) { + if(template && valOut === dflt && !validate(valIn, opts)) { valIn = nestedProperty(template, attribute).get(); coerceFunction(valIn, propOut, dflt, opts); - out = propOut.get(); + valOut = propOut.get(); } - return out; + return valOut; }; /** From 8d0b4cb588ef398315013aa7916e88002f125b36 Mon Sep 17 00:00:00 2001 From: archmoj Date: Sun, 7 Jun 2020 19:25:39 -0400 Subject: [PATCH 05/14] exit early --- src/lib/coerce.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 51f8ce18129..2973dd94e72 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -408,9 +408,7 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt * returns false if there is no user input. */ exports.coerce2 = function(containerIn, containerOut, attributes, attribute, dflt) { - var propIn = nestedProperty(containerIn, attribute); var propOut = exports.coerce(containerIn, containerOut, attributes, attribute, dflt); - var valIn = propIn.get(); var attr = attributes[attribute]; var theDefault = (dflt !== undefined) ? dflt : (attr || {}).dflt; @@ -421,6 +419,7 @@ exports.coerce2 = function(containerIn, containerOut, attributes, attribute, dfl return propOut; } + var valIn = nestedProperty(containerIn, attribute).get(); return (valIn !== undefined && valIn !== null) ? propOut : false; }; From 5c3be81ee1073d199b8399ff02ce8dd7ddf0a3fa Mon Sep 17 00:00:00 2001 From: archmoj Date: Sun, 7 Jun 2020 19:27:26 -0400 Subject: [PATCH 06/14] rename propOut to valOut --- src/lib/coerce.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 2973dd94e72..bdfb0531be6 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -408,19 +408,19 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt * returns false if there is no user input. */ exports.coerce2 = function(containerIn, containerOut, attributes, attribute, dflt) { - var propOut = exports.coerce(containerIn, containerOut, attributes, attribute, dflt); + var valOut = exports.coerce(containerIn, containerOut, attributes, attribute, dflt); var attr = attributes[attribute]; var theDefault = (dflt !== undefined) ? dflt : (attr || {}).dflt; if( theDefault !== undefined && - theDefault !== propOut + theDefault !== valOut ) { - return propOut; + return valOut; } var valIn = nestedProperty(containerIn, attribute).get(); - return (valIn !== undefined && valIn !== null) ? propOut : false; + return (valIn !== undefined && valIn !== null) ? valOut : false; }; /* From 642bf285c6bdfbff3d6f72ae4352be8b06a4670d Mon Sep 17 00:00:00 2001 From: archmoj Date: Sun, 7 Jun 2020 19:29:55 -0400 Subject: [PATCH 07/14] add internal _coerce function --- src/lib/coerce.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index bdfb0531be6..4ad1bae8fc2 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -361,6 +361,10 @@ exports.valObjectMeta = { * as a convenience, returns the value it finally set */ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt) { + return _coerce(containerIn, containerOut, attributes, attribute, dflt).value; +}; + +function _coerce(containerIn, containerOut, attributes, attribute, dflt) { var opts = nestedProperty(attributes, attribute).get(); var propIn = nestedProperty(containerIn, attribute); var propOut = nestedProperty(containerOut, attribute); @@ -383,7 +387,10 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt */ if(opts.arrayOk && isArrayOrTypedArray(valIn)) { propOut.set(valIn); - return valIn; + return { + value: valIn, + default: dflt + }; } var coerceFunction = exports.valObjectMeta[opts.valType].coerceFunction; @@ -397,8 +404,11 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt coerceFunction(valIn, propOut, dflt, opts); valOut = propOut.get(); } - return valOut; -}; + return { + value: valOut, + default: dflt + }; +} /** * Variation on coerce @@ -408,11 +418,11 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt * returns false if there is no user input. */ exports.coerce2 = function(containerIn, containerOut, attributes, attribute, dflt) { - var valOut = exports.coerce(containerIn, containerOut, attributes, attribute, dflt); - - var attr = attributes[attribute]; - var theDefault = (dflt !== undefined) ? dflt : (attr || {}).dflt; + var out = _coerce(containerIn, containerOut, attributes, attribute, dflt); + var valOut = out.value; + var theDefault = out.default; if( + valOut !== undefined && theDefault !== undefined && theDefault !== valOut ) { From 57cec14677eaba0619ca00adc972c6c62e18e926 Mon Sep 17 00:00:00 2001 From: archmoj Date: Sun, 7 Jun 2020 20:27:56 -0400 Subject: [PATCH 08/14] reduce condition checks --- src/lib/coerce.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 4ad1bae8fc2..9cfc4581278 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -420,11 +420,9 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { exports.coerce2 = function(containerIn, containerOut, attributes, attribute, dflt) { var out = _coerce(containerIn, containerOut, attributes, attribute, dflt); var valOut = out.value; - var theDefault = out.default; if( valOut !== undefined && - theDefault !== undefined && - theDefault !== valOut + valOut !== out.default ) { return valOut; } From 1d9cc4a91d33b69490f9ee7d51e008c6571e9392 Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 9 Jun 2020 12:27:08 -0400 Subject: [PATCH 09/14] keep track of source and input in _coerce function --- src/lib/coerce.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 9cfc4581278..ac54e062d14 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -361,11 +361,14 @@ exports.valObjectMeta = { * as a convenience, returns the value it finally set */ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt) { - return _coerce(containerIn, containerOut, attributes, attribute, dflt).value; + return _coerce(containerIn, containerOut, attributes, attribute, dflt).val; }; function _coerce(containerIn, containerOut, attributes, attribute, dflt) { var opts = nestedProperty(attributes, attribute).get(); + if(dflt === undefined) dflt = opts.dflt; + var src = ''; // i.e. default + var propIn = nestedProperty(containerIn, attribute); var propOut = nestedProperty(containerOut, attribute); var valIn = propIn.get(); @@ -373,12 +376,12 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { var template = containerOut._template; if(valIn === undefined && template) { valIn = nestedProperty(template, attribute).get(); + if(valIn !== undefined) src = 't'; // template + // already used the template value, so short-circuit the second check template = 0; } - if(dflt === undefined) dflt = opts.dflt; - /** * arrayOk: value MAY be an array, then we do no value checking * at this point, because it can be more complicated than the @@ -388,8 +391,9 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { if(opts.arrayOk && isArrayOrTypedArray(valIn)) { propOut.set(valIn); return { - value: valIn, - default: dflt + inp: valIn, + val: valIn, + src: 'c' // container }; } @@ -397,16 +401,22 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { coerceFunction(valIn, propOut, dflt, opts); var valOut = propOut.get(); + if(valOut !== undefined) src = 'c'; // container + // in case v was provided but invalid, try the template again so it still // overrides the regular default if(template && valOut === dflt && !validate(valIn, opts)) { valIn = nestedProperty(template, attribute).get(); coerceFunction(valIn, propOut, dflt, opts); valOut = propOut.get(); + + if(valOut !== undefined) src = 't'; // template } + return { - value: valOut, - default: dflt + inp: valIn, + val: valOut, + src: src }; } @@ -419,16 +429,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { */ exports.coerce2 = function(containerIn, containerOut, attributes, attribute, dflt) { var out = _coerce(containerIn, containerOut, attributes, attribute, dflt); - var valOut = out.value; - if( - valOut !== undefined && - valOut !== out.default - ) { - return valOut; - } - - var valIn = nestedProperty(containerIn, attribute).get(); - return (valIn !== undefined && valIn !== null) ? valOut : false; + return (out.src && out.inp !== undefined) ? out.val : false; }; /* From cf7c0617c07fad434e906ad95d66dcbaf2a7898b Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 10 Jun 2020 12:00:51 -0400 Subject: [PATCH 10/14] fixup Lib.coerce2 description and color test --- test/jasmine/tests/lib_test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jasmine/tests/lib_test.js b/test/jasmine/tests/lib_test.js index 4105e5455ea..342741e49d5 100644 --- a/test/jasmine/tests/lib_test.js +++ b/test/jasmine/tests/lib_test.js @@ -778,7 +778,7 @@ describe('Test lib.js:', function() { expect(sizeOut).toBe(outObj.testMarker.testSize); }); - it('should set and return the default if the user input is not valid', function() { + it('should set the default and return false if the user input is not valid', function() { var colVal = 'r'; var sizeVal = 'aaaaah!'; var attrs = { @@ -793,7 +793,7 @@ describe('Test lib.js:', function() { var sizeOut = coerce2(obj, outObj, attrs, 'testMarker.testSize'); expect(colOut).toBe('rgba(0, 0, 0, 0)'); - expect(sizeOut).toBe(outObj.testMarker.testSize); + expect(colOut).toBe(outObj.testMarker.testColor); expect(sizeOut).toBe(20); expect(sizeOut).toBe(outObj.testMarker.testSize); }); From 21b86cdc76f0aa7bad2613816afe8b3699d5faf8 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 10 Jun 2020 12:24:46 -0400 Subject: [PATCH 11/14] add jasmine tests to cover invalid inputs in Lib.coerce2 --- test/jasmine/tests/lib_test.js | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/test/jasmine/tests/lib_test.js b/test/jasmine/tests/lib_test.js index 342741e49d5..f9b6a7fca92 100644 --- a/test/jasmine/tests/lib_test.js +++ b/test/jasmine/tests/lib_test.js @@ -798,6 +798,74 @@ describe('Test lib.js:', function() { expect(sizeOut).toBe(outObj.testMarker.testSize); }); + it('should set the user input', function() { + var colVal = 'red'; + var sizeVal = '1e2'; + var attrs = { + testMarker: { + testColor: {valType: 'color', dflt: 'rgba(0, 0, 0, 0)'}, + testSize: {valType: 'number', dflt: 20} + } + }; + var obj = {testMarker: {testColor: colVal, testSize: sizeVal}}; + var outObj = {}; + var colOut = coerce2(obj, outObj, attrs, 'testMarker.testColor'); + var sizeOut = coerce2(obj, outObj, attrs, 'testMarker.testSize'); + + expect(colOut).toBe('red'); + expect(colOut).toBe(outObj.testMarker.testColor); + expect(sizeOut).toBe(100); + expect(sizeOut).toBe(outObj.testMarker.testSize); + }); + + it('should set to template if the container input is not valid', function() { + var attrs = { + testMarker: { + testColor: {valType: 'color', dflt: 'rgba(0, 0, 0, 0)'}, + testSize: {valType: 'number', dflt: 20} + } + }; + var obj = { + testMarker: {testColor: 'invalid', testSize: 'invalid'} + }; + var outObj = { + _template: { + testMarker: {testColor: 'red', testSize: '1e2'} + } + }; + var colOut = coerce2(obj, outObj, attrs, 'testMarker.testColor'); + var sizeOut = coerce2(obj, outObj, attrs, 'testMarker.testSize'); + + expect(colOut).toBe('red'); + expect(colOut).toBe(outObj.testMarker.testColor); + expect(sizeOut).toBe(100); + expect(sizeOut).toBe(outObj.testMarker.testSize); + }); + + it('should set to default if the both container and template inputs are not valid', function() { + var attrs = { + testMarker: { + testColor: {valType: 'color', dflt: 'rgba(0, 0, 0, 0)'}, + testSize: {valType: 'number', dflt: 20} + } + }; + var obj = { + testMarker: {testColor: 'invalid', testSize: 'invalid'} + }; + var outObj = { + _template: { + testMarker: {testColor: 'invalid', testSize: 'invalid'} + } + }; + var colOut = coerce2(obj, outObj, attrs, 'testMarker.testColor'); + var sizeOut = coerce2(obj, outObj, attrs, 'testMarker.testSize'); + + expect(colOut).toBe('rgba(0, 0, 0, 0)'); + expect(colOut).toBe(outObj.testMarker.testColor); + expect(sizeOut).toBe(20); + expect(sizeOut).toBe(outObj.testMarker.testSize); + }); + it('should return false if there is no user input', function() { var colVal = null; var sizeVal; // undefined From 2b911d13ddb6e4834ce1700c41dbcbbde81d0855 Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 16 Jun 2020 14:00:51 -0400 Subject: [PATCH 12/14] make room for opts - rename opts to attr --- src/lib/coerce.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index ac54e062d14..295f24200c8 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -365,8 +365,8 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt }; function _coerce(containerIn, containerOut, attributes, attribute, dflt) { - var opts = nestedProperty(attributes, attribute).get(); - if(dflt === undefined) dflt = opts.dflt; + var attr = nestedProperty(attributes, attribute).get(); + if(dflt === undefined) dflt = attr.dflt; var src = ''; // i.e. default var propIn = nestedProperty(containerIn, attribute); @@ -388,7 +388,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { * individual form (eg. some array vals can be numbers, even if the * single values must be color strings) */ - if(opts.arrayOk && isArrayOrTypedArray(valIn)) { + if(attr.arrayOk && isArrayOrTypedArray(valIn)) { propOut.set(valIn); return { inp: valIn, @@ -397,17 +397,17 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { }; } - var coerceFunction = exports.valObjectMeta[opts.valType].coerceFunction; - coerceFunction(valIn, propOut, dflt, opts); + var coerceFunction = exports.valObjectMeta[attr.valType].coerceFunction; + coerceFunction(valIn, propOut, dflt, attr); var valOut = propOut.get(); if(valOut !== undefined) src = 'c'; // container // in case v was provided but invalid, try the template again so it still // overrides the regular default - if(template && valOut === dflt && !validate(valIn, opts)) { + if(template && valOut === dflt && !validate(valIn, attr)) { valIn = nestedProperty(template, attribute).get(); - coerceFunction(valIn, propOut, dflt, opts); + coerceFunction(valIn, propOut, dflt, attr); valOut = propOut.get(); if(valOut !== undefined) src = 't'; // template From adc36cd1b04bd097f5de7ae9a694df8712e0365c Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 16 Jun 2020 14:14:03 -0400 Subject: [PATCH 13/14] validate input when calling from coerce2 - fixup lib and axes tests - add info about Lib.coerce2 function --- src/lib/coerce.js | 16 +++++++++++----- test/jasmine/tests/axes_test.js | 8 ++++---- test/jasmine/tests/lib_test.js | 18 +++++++++--------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 295f24200c8..11b0f360696 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -364,7 +364,9 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt return _coerce(containerIn, containerOut, attributes, attribute, dflt).val; }; -function _coerce(containerIn, containerOut, attributes, attribute, dflt) { +function _coerce(containerIn, containerOut, attributes, attribute, dflt, opts) { + var shouldValidate = (opts || {}).shouldValidate; + var attr = nestedProperty(attributes, attribute).get(); if(dflt === undefined) dflt = attr.dflt; var src = ''; // i.e. default @@ -376,7 +378,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { var template = containerOut._template; if(valIn === undefined && template) { valIn = nestedProperty(template, attribute).get(); - if(valIn !== undefined) src = 't'; // template + if(valIn !== undefined && shouldValidate && validate(valIn, attr)) src = 't'; // template // already used the template value, so short-circuit the second check template = 0; @@ -401,7 +403,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { coerceFunction(valIn, propOut, dflt, attr); var valOut = propOut.get(); - if(valOut !== undefined) src = 'c'; // container + if(valOut !== undefined && shouldValidate && validate(valIn, attr)) src = 'c'; // container // in case v was provided but invalid, try the template again so it still // overrides the regular default @@ -410,7 +412,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { coerceFunction(valIn, propOut, dflt, attr); valOut = propOut.get(); - if(valOut !== undefined) src = 't'; // template + if(valOut !== undefined && shouldValidate && validate(valIn, attr)) src = 't'; // template } return { @@ -422,13 +424,17 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt) { /** * Variation on coerce + * useful when setting an attribute to a valid value + * can change the default for another attribute. * * Uses coerce to get attribute value if user input is valid, * returns attribute default if user input it not valid or * returns false if there is no user input. */ exports.coerce2 = function(containerIn, containerOut, attributes, attribute, dflt) { - var out = _coerce(containerIn, containerOut, attributes, attribute, dflt); + var out = _coerce(containerIn, containerOut, attributes, attribute, dflt, { + shouldValidate: true + }); return (out.src && out.inp !== undefined) ? out.val : false; }; diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 8730ed09d5f..cbf0c71eafe 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -1803,10 +1803,10 @@ describe('Test axes', function() { Plotly.plot(gd, data, layout); var yaxis = gd._fullLayout.yaxis; - expect(yaxis.ticklen).toBe(5); - expect(yaxis.tickwidth).toBe(1); - expect(yaxis.tickcolor).toBe('#444'); - expect(yaxis.ticks).toBe('outside'); + expect(yaxis.ticklen).toBe(undefined); + expect(yaxis.tickwidth).toBe(undefined); + expect(yaxis.tickcolor).toBe(undefined); + expect(yaxis.ticks).toBe(''); expect(yaxis.showticklabels).toBe(true); expect(yaxis.tickfont).toEqual({ family: '"Open Sans", verdana, arial, sans-serif', size: 12, color: '#444' }); expect(yaxis.tickangle).toBe('auto'); diff --git a/test/jasmine/tests/lib_test.js b/test/jasmine/tests/lib_test.js index f9b6a7fca92..b9fa49649e0 100644 --- a/test/jasmine/tests/lib_test.js +++ b/test/jasmine/tests/lib_test.js @@ -792,10 +792,10 @@ describe('Test lib.js:', function() { var colOut = coerce2(obj, outObj, attrs, 'testMarker.testColor'); var sizeOut = coerce2(obj, outObj, attrs, 'testMarker.testSize'); - expect(colOut).toBe('rgba(0, 0, 0, 0)'); - expect(colOut).toBe(outObj.testMarker.testColor); - expect(sizeOut).toBe(20); - expect(sizeOut).toBe(outObj.testMarker.testSize); + expect(colOut).toBe(false); + expect(outObj.testMarker.testColor).toBe('rgba(0, 0, 0, 0)'); + expect(sizeOut).toBe(false); + expect(outObj.testMarker.testSize).toBe(20); }); it('should set the user input', function() { @@ -842,7 +842,7 @@ describe('Test lib.js:', function() { expect(sizeOut).toBe(outObj.testMarker.testSize); }); - it('should set to default if the both container and template inputs are not valid', function() { + it('should set to default and return false if the both container and template inputs are not valid', function() { var attrs = { testMarker: { testColor: {valType: 'color', dflt: 'rgba(0, 0, 0, 0)'}, @@ -860,10 +860,10 @@ describe('Test lib.js:', function() { var colOut = coerce2(obj, outObj, attrs, 'testMarker.testColor'); var sizeOut = coerce2(obj, outObj, attrs, 'testMarker.testSize'); - expect(colOut).toBe('rgba(0, 0, 0, 0)'); - expect(colOut).toBe(outObj.testMarker.testColor); - expect(sizeOut).toBe(20); - expect(sizeOut).toBe(outObj.testMarker.testSize); + expect(colOut).toBe(false); + expect(outObj.testMarker.testColor).toBe('rgba(0, 0, 0, 0)'); + expect(sizeOut).toBe(false); + expect(outObj.testMarker.testSize).toBe(20); }); it('should return false if there is no user input', function() { From 24d1da9d3d134a28523622bfa4275fc43f9aed37 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 17 Jun 2020 09:29:34 -0400 Subject: [PATCH 14/14] remove unnecessary validation, also - use false and true values for src - reduce if statements --- src/lib/coerce.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 11b0f360696..b36cc1c1b95 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -369,7 +369,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt, opts) { var attr = nestedProperty(attributes, attribute).get(); if(dflt === undefined) dflt = attr.dflt; - var src = ''; // i.e. default + var src = false; var propIn = nestedProperty(containerIn, attribute); var propOut = nestedProperty(containerOut, attribute); @@ -378,7 +378,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt, opts) { var template = containerOut._template; if(valIn === undefined && template) { valIn = nestedProperty(template, attribute).get(); - if(valIn !== undefined && shouldValidate && validate(valIn, attr)) src = 't'; // template + src = (valIn !== undefined); // already used the template value, so short-circuit the second check template = 0; @@ -395,7 +395,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt, opts) { return { inp: valIn, val: valIn, - src: 'c' // container + src: true }; } @@ -403,7 +403,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt, opts) { coerceFunction(valIn, propOut, dflt, attr); var valOut = propOut.get(); - if(valOut !== undefined && shouldValidate && validate(valIn, attr)) src = 'c'; // container + src = (valOut !== undefined) && shouldValidate && validate(valIn, attr); // in case v was provided but invalid, try the template again so it still // overrides the regular default @@ -412,7 +412,7 @@ function _coerce(containerIn, containerOut, attributes, attribute, dflt, opts) { coerceFunction(valIn, propOut, dflt, attr); valOut = propOut.get(); - if(valOut !== undefined && shouldValidate && validate(valIn, attr)) src = 't'; // template + src = (valOut !== undefined) && shouldValidate && validate(valIn, attr); } return {