From 965a1f09430db60bd17db3bcb42d08767341f361 Mon Sep 17 00:00:00 2001 From: KeyboardTsundoku Date: Sat, 5 Nov 2016 22:41:47 +1100 Subject: [PATCH 1/9] COMPASS-226 added string comparison to server version to determine decimal hiding --- .../lib/components/common/bson-type-selector.jsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx index 717deb0df7e..d64f7717e6b 100644 --- a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx +++ b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx @@ -1,8 +1,9 @@ const React = require('react'); const _ = require('lodash'); const OptionSelector = require('./option-selector'); +const app = require('ampersand-app'); -// const debug = require('debug')('mongodb-compass:validation'); +const debug = require('debug')('mongodb-compass:validation'); const BSON_TYPES = [ {name: 'Double', number: 1, alias: 'double'}, @@ -81,8 +82,8 @@ class BSONTypeSelector extends React.Component { */ render() { const selectedTypeName = _.get(this.state.type, 'alias', ''); - // TODO: make recentServer true if server is 3.4 < - const recentServer = true; + // string compare server version if it's under 3.4, set falsey + const recentServer = !('3.4.0-rc0'.localeCompare(app.instance.build.version) === 1); // remove the decimal version if not recentServer const typeOptions = _.zipObject(_.map(_.filter(BSON_TYPES, (t) => { // filter out decimal if server < 3.4 From 128dc9649c46b181c4a785fec4bf41a607044a39 Mon Sep 17 00:00:00 2001 From: KeyboardTsundoku Date: Mon, 7 Nov 2016 06:46:43 +1100 Subject: [PATCH 2/9] COMPASS-226 commented out debug statement --- .../validation/lib/components/common/bson-type-selector.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx index d64f7717e6b..1aa73029c37 100644 --- a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx +++ b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx @@ -3,7 +3,7 @@ const _ = require('lodash'); const OptionSelector = require('./option-selector'); const app = require('ampersand-app'); -const debug = require('debug')('mongodb-compass:validation'); +// const debug = require('debug')('mongodb-compass:validation'); const BSON_TYPES = [ {name: 'Double', number: 1, alias: 'double'}, From 15a5f9123744e892b56e9927b5b8afb766ec689f Mon Sep 17 00:00:00 2001 From: KeyboardTsundoku Date: Mon, 7 Nov 2016 10:49:31 +1100 Subject: [PATCH 3/9] COMPASS-226 testing for travis issues --- .../validation/lib/components/common/bson-type-selector.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx index 1aa73029c37..ca127f55e4d 100644 --- a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx +++ b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx @@ -83,10 +83,9 @@ class BSONTypeSelector extends React.Component { render() { const selectedTypeName = _.get(this.state.type, 'alias', ''); // string compare server version if it's under 3.4, set falsey - const recentServer = !('3.4.0-rc0'.localeCompare(app.instance.build.version) === 1); - // remove the decimal version if not recentServer + const recentServer = !('3.4.0'.localeCompare(app.instance.build.version) > 0); const typeOptions = _.zipObject(_.map(_.filter(BSON_TYPES, (t) => { - // filter out decimal if server < 3.4 + // filter out decimal if server < 3.4.0 return !(t.alias === 'decimal128' && !recentServer); }), (type) => { return [type.alias, type.name]; From 3fb84bb226ded0135f81652abd3f57df5eff9c6b Mon Sep 17 00:00:00 2001 From: KeyboardTsundoku Date: Mon, 7 Nov 2016 15:00:08 +1100 Subject: [PATCH 4/9] COMPASS-226 put server version info in validation store --- .../components/common/bson-type-selector.jsx | 25 +++++++++++++------ .../lib/components/rule-builder.jsx | 5 ++-- .../lib/components/rule-categories/type.jsx | 5 ++-- .../validation/lib/components/rule.jsx | 4 ++- .../validation/lib/components/validation.jsx | 4 ++- .../validation/lib/stores/index.js | 7 +++++- test/validation.store.test.js | 5 ++-- 7 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx index ca127f55e4d..9ef78cc6725 100644 --- a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx +++ b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx @@ -1,7 +1,7 @@ const React = require('react'); const _ = require('lodash'); const OptionSelector = require('./option-selector'); -const app = require('ampersand-app'); +const semver = require('semver'); // const debug = require('debug')('mongodb-compass:validation'); @@ -34,6 +34,20 @@ class BSONTypeSelector extends React.Component { constructor(props) { super(props); + + // try catch block in case semver typeerrors while remove decimal128 + // if server is < 3.4.x + let canRemoveDecimal = false; + try { + canRemoveDecimal = semver.gt('3.4.0-rc0', this.props.serverVersion); + } catch (e) { + canRemoveDecimal = true; + } + + if (canRemoveDecimal) { + _.remove(BSON_TYPES, (type) => type.number === 19); + } + this.state = { type: null }; @@ -83,11 +97,7 @@ class BSONTypeSelector extends React.Component { render() { const selectedTypeName = _.get(this.state.type, 'alias', ''); // string compare server version if it's under 3.4, set falsey - const recentServer = !('3.4.0'.localeCompare(app.instance.build.version) > 0); - const typeOptions = _.zipObject(_.map(_.filter(BSON_TYPES, (t) => { - // filter out decimal if server < 3.4.0 - return !(t.alias === 'decimal128' && !recentServer); - }), (type) => { + const typeOptions = _.zipObject(_.map(BSON_TYPES, (type) => { return [type.alias, type.name]; })); @@ -107,7 +117,8 @@ BSONTypeSelector.propTypes = { typeNumber: React.PropTypes.number, typeAlias: React.PropTypes.string, typeName: React.PropTypes.string, - onTypeClicked: React.PropTypes.func.isRequired + onTypeClicked: React.PropTypes.func, + serverVersion: React.PropTypes.string }; BSONTypeSelector.displayName = 'BSONTypeSelector'; diff --git a/src/internal-packages/validation/lib/components/rule-builder.jsx b/src/internal-packages/validation/lib/components/rule-builder.jsx index 7a398beac10..dee64bb4ec2 100644 --- a/src/internal-packages/validation/lib/components/rule-builder.jsx +++ b/src/internal-packages/validation/lib/components/rule-builder.jsx @@ -91,7 +91,7 @@ class RuleBuilder extends React.Component { renderRules() { return _.map(this.props.validationRules, (rule) => { - return ; + return ; }); } /** @@ -174,7 +174,8 @@ RuleBuilder.propTypes = { editState: React.PropTypes.oneOf(['unmodified', 'modified', 'updating', 'error', 'success']).isRequired, validationAction: React.PropTypes.oneOf(['warn', 'error']).isRequired, validationLevel: React.PropTypes.oneOf(['off', 'moderate', 'strict']).isRequired, - validationRules: React.PropTypes.array.isRequired + validationRules: React.PropTypes.array.isRequired, + serverVersion: React.PropTypes.string }; RuleBuilder.displayName = 'RuleBuilder'; diff --git a/src/internal-packages/validation/lib/components/rule-categories/type.jsx b/src/internal-packages/validation/lib/components/rule-categories/type.jsx index 7c1ddbf255e..5db62296457 100644 --- a/src/internal-packages/validation/lib/components/rule-categories/type.jsx +++ b/src/internal-packages/validation/lib/components/rule-categories/type.jsx @@ -80,14 +80,15 @@ class RuleCategoryType extends React.Component { const typeNumber = this.props.parameters.type; return ( - + ); } } RuleCategoryType.propTypes = { id: React.PropTypes.string.isRequired, - parameters: React.PropTypes.object.isRequired + parameters: React.PropTypes.object.isRequired, + serverVersion: React.PropTypes.string }; RuleCategoryType.displayName = 'RuleCategoryType'; diff --git a/src/internal-packages/validation/lib/components/rule.jsx b/src/internal-packages/validation/lib/components/rule.jsx index 4ad1289e6d1..0c5c97a52cf 100644 --- a/src/internal-packages/validation/lib/components/rule.jsx +++ b/src/internal-packages/validation/lib/components/rule.jsx @@ -59,6 +59,7 @@ class Rule extends React.Component { : null; @@ -106,7 +107,8 @@ Rule.propTypes = { field: React.PropTypes.string.isRequired, category: React.PropTypes.string.isRequired, parameters: React.PropTypes.object.isRequired, - nullable: React.PropTypes.bool.isRequired + nullable: React.PropTypes.bool.isRequired, + serverVersion: React.PropTypes.string }; Rule.displayName = 'Rule'; diff --git a/src/internal-packages/validation/lib/components/validation.jsx b/src/internal-packages/validation/lib/components/validation.jsx index 3bfa7d00dc3..c240eae6d65 100644 --- a/src/internal-packages/validation/lib/components/validation.jsx +++ b/src/internal-packages/validation/lib/components/validation.jsx @@ -46,6 +46,7 @@ class Validation extends React.Component { validationAction={this.props.validationAction} validationLevel={this.props.validationLevel} editState={this.props.editState} + serverVersion={this.props.serverVersion} /> ) : ( @@ -86,7 +87,8 @@ Validation.propTypes = { validationAction: React.PropTypes.oneOf(['warn', 'error']).isRequired, validatorDoc: React.PropTypes.object.isRequired, validationLevel: React.PropTypes.oneOf(['off', 'moderate', 'strict']).isRequired, - validationRules: React.PropTypes.array.isRequired + validationRules: React.PropTypes.array.isRequired, + serverVersion: React.PropTypes.string }; Validation.defaultProps = { diff --git a/src/internal-packages/validation/lib/stores/index.js b/src/internal-packages/validation/lib/stores/index.js index 98a4df45dcf..6bfdf288117 100644 --- a/src/internal-packages/validation/lib/stores/index.js +++ b/src/internal-packages/validation/lib/stores/index.js @@ -12,6 +12,7 @@ const NamespaceStore = require('hadron-reflux-store').NamespaceStore; const debug = require('debug')('mongodb-compass:stores:validation'); +const OLD_SERVER_VERSION = '3.1.9'; /** * Validation store. */ @@ -54,7 +55,8 @@ const ValidationStore = Reflux.createStore({ validationAction: 'warn', // one of `warn`, `error` fetchState: 'initial', // one of `initial`, `fetching`, `success`, `error` editState: 'unmodified', // one of `unmodified`, `modified`, `updating`, `success`, `error` - isExpressibleByRules: true // boolean + isExpressibleByRules: true, // boolean + serverVersion: '' }; }, @@ -223,6 +225,9 @@ const ValidationStore = Reflux.createStore({ */ _fetchFromServer(callback) { const ns = toNS(NamespaceStore.ns); + + const serverVersion = app.instance === null ? OLD_SERVER_VERSION : app.instance.build.version; + this.setState({serverVersion: serverVersion}); app.dataService.listCollections(ns.database, {name: ns.collection}, function(err, res) { if (err) { return callback(err); diff --git a/test/validation.store.test.js b/test/validation.store.test.js index 0f1334bcf3e..1ce30c26c02 100644 --- a/test/validation.store.test.js +++ b/test/validation.store.test.js @@ -5,15 +5,16 @@ const ValidationStore = require('../src/internal-packages/validation/lib/stores' const sinon = require('sinon'); const _ = require('lodash'); -function mockFetchFromServer(err, res, delay) { +function mockFetchFromServer(err, res, delay, serverVersion) { if (delay === undefined) { delay = 0; } ValidationStore._fetchFromServer = function(callback) { + this.setState({serverVersion: serverVersion || ''}); setTimeout(function() { return callback(err, res); }, delay); - }; + }.bind(ValidationStore); } const mockValidatorDoc = { From a22f660d72f175ff587a1e112b9e2c5660d0f605 Mon Sep 17 00:00:00 2001 From: KeyboardTsundoku Date: Mon, 7 Nov 2016 16:42:27 +1100 Subject: [PATCH 5/9] COMPASS-226 semvar is struggling with chai tests --- src/internal-packages/validation/lib/stores/index.js | 4 ++-- test/validation.store.test.js | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/internal-packages/validation/lib/stores/index.js b/src/internal-packages/validation/lib/stores/index.js index 6bfdf288117..19674d129f2 100644 --- a/src/internal-packages/validation/lib/stores/index.js +++ b/src/internal-packages/validation/lib/stores/index.js @@ -12,7 +12,7 @@ const NamespaceStore = require('hadron-reflux-store').NamespaceStore; const debug = require('debug')('mongodb-compass:stores:validation'); -const OLD_SERVER_VERSION = '3.1.9'; +// const OLD_SERVER_VERSION = '3.1.9'; /** * Validation store. */ @@ -226,7 +226,7 @@ const ValidationStore = Reflux.createStore({ _fetchFromServer(callback) { const ns = toNS(NamespaceStore.ns); - const serverVersion = app.instance === null ? OLD_SERVER_VERSION : app.instance.build.version; + const serverVersion = app.instance.build.version; // app.instance === null ? OLD_SERVER_VERSION : app.instance.build.version; this.setState({serverVersion: serverVersion}); app.dataService.listCollections(ns.database, {name: ns.collection}, function(err, res) { if (err) { diff --git a/test/validation.store.test.js b/test/validation.store.test.js index 1ce30c26c02..90cfb9a31c0 100644 --- a/test/validation.store.test.js +++ b/test/validation.store.test.js @@ -48,6 +48,15 @@ describe('ValidationStore', function() { unsubscribe = function() {}; }); + /* // TODO write tests for checking server version + it('checks a pre 3.4 server version for decimal128 hidden', function(done) { + mockFetchFromServer(null, mockValidatorDoc, 1, '3.1.9'); + + unsubscribe = ValidationStore.listen((state) => { + expect(); + done(); + }); + });*/ it('goes into {fetchState: "fetching"} when starting to fetch from server', function(done) { mockFetchFromServer(null, mockValidatorDoc); From b0bb90f25f659c664d6464325ac4a32bf821bb11 Mon Sep 17 00:00:00 2001 From: KeyboardTsundoku Date: Tue, 8 Nov 2016 12:41:41 +1100 Subject: [PATCH 6/9] COMPASS-226 slightly cleaner implementation --- .../components/common/bson-type-selector.jsx | 5 +---- .../lib/components/rule-categories/type.jsx | 2 +- .../validation/lib/stores/index.js | 6 ++++-- test/validation.store.test.js | 21 +++++++++---------- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx index 9ef78cc6725..27a6273b30d 100644 --- a/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx +++ b/src/internal-packages/validation/lib/components/common/bson-type-selector.jsx @@ -3,7 +3,7 @@ const _ = require('lodash'); const OptionSelector = require('./option-selector'); const semver = require('semver'); -// const debug = require('debug')('mongodb-compass:validation'); +// const debug = require('debug')('mongodb-compass:bson-type-selector'); const BSON_TYPES = [ {name: 'Double', number: 1, alias: 'double'}, @@ -29,12 +29,10 @@ const BSON_TYPES = [ {name: 'Max key', number: 127, alias: 'maxKey'} ]; - class BSONTypeSelector extends React.Component { constructor(props) { super(props); - // try catch block in case semver typeerrors while remove decimal128 // if server is < 3.4.x let canRemoveDecimal = false; @@ -96,7 +94,6 @@ class BSONTypeSelector extends React.Component { */ render() { const selectedTypeName = _.get(this.state.type, 'alias', ''); - // string compare server version if it's under 3.4, set falsey const typeOptions = _.zipObject(_.map(BSON_TYPES, (type) => { return [type.alias, type.name]; })); diff --git a/src/internal-packages/validation/lib/components/rule-categories/type.jsx b/src/internal-packages/validation/lib/components/rule-categories/type.jsx index 5db62296457..b797afc9282 100644 --- a/src/internal-packages/validation/lib/components/rule-categories/type.jsx +++ b/src/internal-packages/validation/lib/components/rule-categories/type.jsx @@ -80,7 +80,7 @@ class RuleCategoryType extends React.Component { const typeNumber = this.props.parameters.type; return ( - + ); } } diff --git a/src/internal-packages/validation/lib/stores/index.js b/src/internal-packages/validation/lib/stores/index.js index 19674d129f2..9197c3e133b 100644 --- a/src/internal-packages/validation/lib/stores/index.js +++ b/src/internal-packages/validation/lib/stores/index.js @@ -226,8 +226,10 @@ const ValidationStore = Reflux.createStore({ _fetchFromServer(callback) { const ns = toNS(NamespaceStore.ns); - const serverVersion = app.instance.build.version; // app.instance === null ? OLD_SERVER_VERSION : app.instance.build.version; - this.setState({serverVersion: serverVersion}); + if (this.state.serverVersion === '') { + const serverVersion = app.instance.build.version; // app.instance === null ? OLD_SERVER_VERSION : app.instance.build.version; + this.setState({serverVersion: serverVersion}); + } app.dataService.listCollections(ns.database, {name: ns.collection}, function(err, res) { if (err) { return callback(err); diff --git a/test/validation.store.test.js b/test/validation.store.test.js index 90cfb9a31c0..b5dd1cd4178 100644 --- a/test/validation.store.test.js +++ b/test/validation.store.test.js @@ -10,11 +10,14 @@ function mockFetchFromServer(err, res, delay, serverVersion) { delay = 0; } ValidationStore._fetchFromServer = function(callback) { - this.setState({serverVersion: serverVersion || ''}); setTimeout(function() { return callback(err, res); }, delay); - }.bind(ValidationStore); + }; + // the above fetchFromServer makes a call for app.instance.build.version + // which will be undefined at the time of this test so setting serverVersion + // manually here, which would otherwise be overwritten + ValidationStore.setState({serverVersion: serverVersion}); } const mockValidatorDoc = { @@ -48,15 +51,11 @@ describe('ValidationStore', function() { unsubscribe = function() {}; }); - /* // TODO write tests for checking server version - it('checks a pre 3.4 server version for decimal128 hidden', function(done) { - mockFetchFromServer(null, mockValidatorDoc, 1, '3.1.9'); - - unsubscribe = ValidationStore.listen((state) => { - expect(); - done(); - }); - });*/ + it('check a pre 3.4 server version', function(done) { + mockFetchFromServer(null, mockValidatorDoc, 0, '3.1.9'); + expect(ValidationStore.state.serverVersion).to.be.equal('3.1.9'); + done(); + }); it('goes into {fetchState: "fetching"} when starting to fetch from server', function(done) { mockFetchFromServer(null, mockValidatorDoc); From c26215728eed812ce15aab590748a8addd6371ad Mon Sep 17 00:00:00 2001 From: KeyboardTsundoku Date: Tue, 8 Nov 2016 16:39:44 +1100 Subject: [PATCH 7/9] COMPASS-226 removed hanging .isRequired in props that add warnings in tests --- src/internal-packages/app/lib/components/sortable-table.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal-packages/app/lib/components/sortable-table.jsx b/src/internal-packages/app/lib/components/sortable-table.jsx index 6845bd686bc..347670c0a69 100644 --- a/src/internal-packages/app/lib/components/sortable-table.jsx +++ b/src/internal-packages/app/lib/components/sortable-table.jsx @@ -127,7 +127,7 @@ SortableTable.propTypes = { * specify column names (required) * @type {Array} of column names (strings). */ - columns: React.PropTypes.arrayOf(React.PropTypes.string).isRequired, + columns: React.PropTypes.arrayOf(React.PropTypes.string), /** * specify data for table rows. Can be an array of objects (keys must * match column names exactly), or an array of arrays. Columns not found in From dd4ade895eb6c89bfe126be815a8e025c74bfc09 Mon Sep 17 00:00:00 2001 From: Peter Schmidt Date: Tue, 8 Nov 2016 17:22:55 +1100 Subject: [PATCH 8/9] Revert unnecessary SortableTable change See https://github.com/10gen/compass/commit/e71d6655e98fdc9d0f339cb945106e56d6f546d4 --- src/internal-packages/app/lib/components/sortable-table.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal-packages/app/lib/components/sortable-table.jsx b/src/internal-packages/app/lib/components/sortable-table.jsx index 347670c0a69..6845bd686bc 100644 --- a/src/internal-packages/app/lib/components/sortable-table.jsx +++ b/src/internal-packages/app/lib/components/sortable-table.jsx @@ -127,7 +127,7 @@ SortableTable.propTypes = { * specify column names (required) * @type {Array} of column names (strings). */ - columns: React.PropTypes.arrayOf(React.PropTypes.string), + columns: React.PropTypes.arrayOf(React.PropTypes.string).isRequired, /** * specify data for table rows. Can be an array of objects (keys must * match column names exactly), or an array of arrays. Columns not found in From 1f2e21f634ded8da71287ff083cf279e8ebe18a4 Mon Sep 17 00:00:00 2001 From: Peter Schmidt Date: Tue, 8 Nov 2016 17:26:05 +1100 Subject: [PATCH 9/9] Clean up comments --- src/internal-packages/validation/lib/stores/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/internal-packages/validation/lib/stores/index.js b/src/internal-packages/validation/lib/stores/index.js index 9197c3e133b..3d5ce1eb4c4 100644 --- a/src/internal-packages/validation/lib/stores/index.js +++ b/src/internal-packages/validation/lib/stores/index.js @@ -12,7 +12,6 @@ const NamespaceStore = require('hadron-reflux-store').NamespaceStore; const debug = require('debug')('mongodb-compass:stores:validation'); -// const OLD_SERVER_VERSION = '3.1.9'; /** * Validation store. */ @@ -227,7 +226,7 @@ const ValidationStore = Reflux.createStore({ const ns = toNS(NamespaceStore.ns); if (this.state.serverVersion === '') { - const serverVersion = app.instance.build.version; // app.instance === null ? OLD_SERVER_VERSION : app.instance.build.version; + const serverVersion = app.instance.build.version; this.setState({serverVersion: serverVersion}); } app.dataService.listCollections(ns.database, {name: ns.collection}, function(err, res) {