Skip to content

Commit 0728d0b

Browse files
Satyapzrq
authored andcommitted
COMPASS-226 hiding decimal128 option if server < 3.4 (#567)
* COMPASS-226 added string comparison to server version to determine decimal hiding * COMPASS-226 commented out debug statement * COMPASS-226 testing for travis issues * COMPASS-226 put server version info in validation store * COMPASS-226 semvar is struggling with chai tests * COMPASS-226 slightly cleaner implementation * COMPASS-226 removed hanging .isRequired in props that add warnings in tests * Revert unnecessary SortableTable change See e71d665 * Clean up comments
1 parent a910ed3 commit 0728d0b

File tree

7 files changed

+47
-18
lines changed

7 files changed

+47
-18
lines changed

src/internal-packages/validation/lib/components/common/bson-type-selector.jsx

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
const React = require('react');
22
const _ = require('lodash');
33
const OptionSelector = require('./option-selector');
4+
const semver = require('semver');
45

5-
// const debug = require('debug')('mongodb-compass:validation');
6+
// const debug = require('debug')('mongodb-compass:bson-type-selector');
67

78
const BSON_TYPES = [
89
{name: 'Double', number: 1, alias: 'double'},
@@ -28,11 +29,23 @@ const BSON_TYPES = [
2829
{name: 'Max key', number: 127, alias: 'maxKey'}
2930
];
3031

31-
3232
class BSONTypeSelector extends React.Component {
3333

3434
constructor(props) {
3535
super(props);
36+
// try catch block in case semver typeerrors while remove decimal128
37+
// if server is < 3.4.x
38+
let canRemoveDecimal = false;
39+
try {
40+
canRemoveDecimal = semver.gt('3.4.0-rc0', this.props.serverVersion);
41+
} catch (e) {
42+
canRemoveDecimal = true;
43+
}
44+
45+
if (canRemoveDecimal) {
46+
_.remove(BSON_TYPES, (type) => type.number === 19);
47+
}
48+
3649
this.state = {
3750
type: null
3851
};
@@ -81,13 +94,7 @@ class BSONTypeSelector extends React.Component {
8194
*/
8295
render() {
8396
const selectedTypeName = _.get(this.state.type, 'alias', '');
84-
// TODO: make recentServer true if server is 3.4 <
85-
const recentServer = true;
86-
// remove the decimal version if not recentServer
87-
const typeOptions = _.zipObject(_.map(_.filter(BSON_TYPES, (t) => {
88-
// filter out decimal if server < 3.4
89-
return !(t.alias === 'decimal128' && !recentServer);
90-
}), (type) => {
97+
const typeOptions = _.zipObject(_.map(BSON_TYPES, (type) => {
9198
return [type.alias, type.name];
9299
}));
93100

@@ -107,7 +114,8 @@ BSONTypeSelector.propTypes = {
107114
typeNumber: React.PropTypes.number,
108115
typeAlias: React.PropTypes.string,
109116
typeName: React.PropTypes.string,
110-
onTypeClicked: React.PropTypes.func.isRequired
117+
onTypeClicked: React.PropTypes.func,
118+
serverVersion: React.PropTypes.string
111119
};
112120

113121
BSONTypeSelector.displayName = 'BSONTypeSelector';

src/internal-packages/validation/lib/components/rule-builder.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class RuleBuilder extends React.Component {
9191

9292
renderRules() {
9393
return _.map(this.props.validationRules, (rule) => {
94-
return <Rule ref={rule.id} key={rule.id} {...rule} />;
94+
return <Rule ref={rule.id} key={rule.id} serverVersion={this.props.serverVersion} {...rule} />;
9595
});
9696
}
9797
/**
@@ -174,7 +174,8 @@ RuleBuilder.propTypes = {
174174
editState: React.PropTypes.oneOf(['unmodified', 'modified', 'updating', 'error', 'success']).isRequired,
175175
validationAction: React.PropTypes.oneOf(['warn', 'error']).isRequired,
176176
validationLevel: React.PropTypes.oneOf(['off', 'moderate', 'strict']).isRequired,
177-
validationRules: React.PropTypes.array.isRequired
177+
validationRules: React.PropTypes.array.isRequired,
178+
serverVersion: React.PropTypes.string
178179
};
179180

180181
RuleBuilder.displayName = 'RuleBuilder';

src/internal-packages/validation/lib/components/rule-categories/type.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,15 @@ class RuleCategoryType extends React.Component {
8080
const typeNumber = this.props.parameters.type;
8181

8282
return (
83-
<BSONTypeSelector typeNumber={typeNumber} onTypeClicked={this.onTypeClicked.bind(this)} />
83+
<BSONTypeSelector typeNumber={typeNumber} serverVersion={this.props.serverVersion} onTypeClicked={this.onTypeClicked.bind(this)} />
8484
);
8585
}
8686
}
8787

8888
RuleCategoryType.propTypes = {
8989
id: React.PropTypes.string.isRequired,
90-
parameters: React.PropTypes.object.isRequired
90+
parameters: React.PropTypes.object.isRequired,
91+
serverVersion: React.PropTypes.string
9192
};
9293

9394
RuleCategoryType.displayName = 'RuleCategoryType';

src/internal-packages/validation/lib/components/rule.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class Rule extends React.Component {
5959
<Parameters
6060
ref="Parameters"
6161
id={this.props.id}
62+
serverVersion={this.props.serverVersion}
6263
parameters={this.props.parameters}
6364
/> : null;
6465

@@ -106,7 +107,8 @@ Rule.propTypes = {
106107
field: React.PropTypes.string.isRequired,
107108
category: React.PropTypes.string.isRequired,
108109
parameters: React.PropTypes.object.isRequired,
109-
nullable: React.PropTypes.bool.isRequired
110+
nullable: React.PropTypes.bool.isRequired,
111+
serverVersion: React.PropTypes.string
110112
};
111113

112114
Rule.displayName = 'Rule';

src/internal-packages/validation/lib/components/validation.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class Validation extends React.Component {
4646
validationAction={this.props.validationAction}
4747
validationLevel={this.props.validationLevel}
4848
editState={this.props.editState}
49+
serverVersion={this.props.serverVersion}
4950
/>
5051
</div>
5152
) : (
@@ -86,7 +87,8 @@ Validation.propTypes = {
8687
validationAction: React.PropTypes.oneOf(['warn', 'error']).isRequired,
8788
validatorDoc: React.PropTypes.object.isRequired,
8889
validationLevel: React.PropTypes.oneOf(['off', 'moderate', 'strict']).isRequired,
89-
validationRules: React.PropTypes.array.isRequired
90+
validationRules: React.PropTypes.array.isRequired,
91+
serverVersion: React.PropTypes.string
9092
};
9193

9294
Validation.defaultProps = {

src/internal-packages/validation/lib/stores/index.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ const ValidationStore = Reflux.createStore({
5454
validationAction: 'warn', // one of `warn`, `error`
5555
fetchState: 'initial', // one of `initial`, `fetching`, `success`, `error`
5656
editState: 'unmodified', // one of `unmodified`, `modified`, `updating`, `success`, `error`
57-
isExpressibleByRules: true // boolean
57+
isExpressibleByRules: true, // boolean
58+
serverVersion: ''
5859
};
5960
},
6061

@@ -223,6 +224,11 @@ const ValidationStore = Reflux.createStore({
223224
*/
224225
_fetchFromServer(callback) {
225226
const ns = toNS(NamespaceStore.ns);
227+
228+
if (this.state.serverVersion === '') {
229+
const serverVersion = app.instance.build.version;
230+
this.setState({serverVersion: serverVersion});
231+
}
226232
app.dataService.listCollections(ns.database, {name: ns.collection}, function(err, res) {
227233
if (err) {
228234
return callback(err);

test/validation.store.test.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const ValidationStore = require('../src/internal-packages/validation/lib/stores'
55
const sinon = require('sinon');
66
const _ = require('lodash');
77

8-
function mockFetchFromServer(err, res, delay) {
8+
function mockFetchFromServer(err, res, delay, serverVersion) {
99
if (delay === undefined) {
1010
delay = 0;
1111
}
@@ -14,6 +14,10 @@ function mockFetchFromServer(err, res, delay) {
1414
return callback(err, res);
1515
}, delay);
1616
};
17+
// the above fetchFromServer makes a call for app.instance.build.version
18+
// which will be undefined at the time of this test so setting serverVersion
19+
// manually here, which would otherwise be overwritten
20+
ValidationStore.setState({serverVersion: serverVersion});
1721
}
1822

1923
const mockValidatorDoc = {
@@ -47,6 +51,11 @@ describe('ValidationStore', function() {
4751
unsubscribe = function() {};
4852
});
4953

54+
it('check a pre 3.4 server version', function(done) {
55+
mockFetchFromServer(null, mockValidatorDoc, 0, '3.1.9');
56+
expect(ValidationStore.state.serverVersion).to.be.equal('3.1.9');
57+
done();
58+
});
5059

5160
it('goes into {fetchState: "fetching"} when starting to fetch from server', function(done) {
5261
mockFetchFromServer(null, mockValidatorDoc);

0 commit comments

Comments
 (0)