aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2018-01-04 20:34:33 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2018-01-05 22:55:25 +0900
commite19f89f16248ed4bf28deaa9ab4b5204061df5eb (patch)
tree74ca100c101dba61f2086631cd0ee9c0fc8d3e27
parentfbdec04786e28bad45021bef4a74e7077e34282f (diff)
add property to settings
-rw-r--r--src/shared/settings/property-types.js6
-rw-r--r--src/shared/settings/validator.js17
-rw-r--r--src/shared/settings/values.js18
-rw-r--r--test/shared/settings/values.test.js29
4 files changed, 61 insertions, 9 deletions
diff --git a/src/shared/settings/property-types.js b/src/shared/settings/property-types.js
new file mode 100644
index 0000000..bcfa809
--- /dev/null
+++ b/src/shared/settings/property-types.js
@@ -0,0 +1,6 @@
+export default {
+ // TODO describe property types here
+ // mystr: 'string',
+ // mynum: 'number',
+ // mybool: 'boolean',
+};
diff --git a/src/shared/settings/validator.js b/src/shared/settings/validator.js
index 949ab29..6fadac7 100644
--- a/src/shared/settings/validator.js
+++ b/src/shared/settings/validator.js
@@ -1,6 +1,7 @@
import operations from 'shared/operations';
+import propertyTypes from './property-types';
-const VALID_TOP_KEYS = ['keymaps', 'search', 'blacklist'];
+const VALID_TOP_KEYS = ['keymaps', 'search', 'blacklist', 'properties'];
const VALID_OPERATION_VALUES = Object.keys(operations).map((key) => {
return operations[key];
});
@@ -48,6 +49,17 @@ const validateSearch = (search) => {
}
};
+const validateProperties = (properties) => {
+ for (let name of Object.keys(properties)) {
+ if (!propertyTypes[name]) {
+ throw new Error(`Unknown property name: "${name}"`);
+ }
+ if (typeof properties[name] !== propertyTypes[name]) {
+ throw new Error(`Invalid type for property: "${name}"`);
+ }
+ }
+};
+
const validate = (settings) => {
validateInvalidTopKeys(settings);
if (settings.keymaps) {
@@ -56,6 +68,9 @@ const validate = (settings) => {
if (settings.search) {
validateSearch(settings.search);
}
+ if (settings.properties) {
+ validateProperties(settings.properties);
+ }
};
export { validate };
diff --git a/src/shared/settings/values.js b/src/shared/settings/values.js
index 4e55fa0..5027ba5 100644
--- a/src/shared/settings/values.js
+++ b/src/shared/settings/values.js
@@ -44,9 +44,12 @@ const valueFromForm = (form) => {
}
}
- let blacklist = form.blacklist;
-
- return { keymaps, search, blacklist };
+ return {
+ keymaps,
+ search,
+ blacklist: form.blacklist,
+ properties: form.properties
+ };
};
const jsonFromValue = (value) => {
@@ -78,9 +81,12 @@ const formFromValue = (value, allowedOps) => {
}
}
- let blacklist = value.blacklist;
-
- return { keymaps, search, blacklist };
+ return {
+ keymaps,
+ search,
+ blacklist: value.blacklist,
+ properties: value.properties,
+ };
};
const jsonFromForm = (form) => {
diff --git a/test/shared/settings/values.test.js b/test/shared/settings/values.test.js
index 2632cd7..62cfb5f 100644
--- a/test/shared/settings/values.test.js
+++ b/test/shared/settings/values.test.js
@@ -7,13 +7,21 @@ describe("settings values", () => {
let json = `{
"keymaps": { "0": {"type": "scroll.home"}},
"search": { "default": "google", "engines": { "google": "https://google.com/search?q={}" }},
- "blacklist": [ "*.slack.com"]
+ "blacklist": [ "*.slack.com"],
+ "properties": {
+ "mystr": "value",
+ "mynum": 123,
+ "mybool": true
+ }
}`;
let value = values.valueFromJson(json);
expect(value.keymaps).to.deep.equal({ 0: {type: "scroll.home"}});
expect(value.search).to.deep.equal({ default: "google", engines: { google: "https://google.com/search?q={}"} });
expect(value.blacklist).to.deep.equal(["*.slack.com"]);
+ expect(value.properties).to.have.property('mystr', 'value');
+ expect(value.properties).to.have.property('mynum', 123);
+ expect(value.properties).to.have.property('mybool', true);
});
});
@@ -29,6 +37,11 @@ describe("settings values", () => {
engines: [['google', 'https://google.com/search?q={}']],
},
blacklist: ['*.slack.com'],
+ "properties": {
+ "mystr": "value",
+ "mynum": 123,
+ "mybool": true,
+ }
};
let value = values.valueFromForm(form);
@@ -37,6 +50,9 @@ describe("settings values", () => {
expect(JSON.stringify(value.search)).to.deep.equal(JSON.stringify({ default: "google", engines: { google: "https://google.com/search?q={}"} }));
expect(value.search).to.deep.equal({ default: "google", engines: { google: "https://google.com/search?q={}"} });
expect(value.blacklist).to.deep.equal(["*.slack.com"]);
+ expect(value.properties).to.have.property('mystr', 'value');
+ expect(value.properties).to.have.property('mynum', 123);
+ expect(value.properties).to.have.property('mybool', true);
});
it('convert from empty form', () => {
@@ -45,6 +61,7 @@ describe("settings values", () => {
expect(value).to.not.have.key('keymaps');
expect(value).to.not.have.key('search');
expect(value).to.not.have.key('blacklist');
+ expect(value).to.not.have.key('properties');
});
it('override keymaps', () => {
@@ -96,7 +113,12 @@ describe("settings values", () => {
0: { type: 'scroll.home' },
},
search: { default: 'google', engines: { google: 'https://google.com/search?q={}' }},
- blacklist: [ '*.slack.com']
+ blacklist: [ '*.slack.com'],
+ properties: {
+ "mystr": "value",
+ "mynum": 123,
+ "mybool": true,
+ }
};
let allowed = ['scroll.vertically?{"count":1}', 'scroll.home' ];
let form = values.formFromValue(value, allowed);
@@ -109,6 +131,9 @@ describe("settings values", () => {
expect(form.search).to.have.deep.property('engines', [['google', 'https://google.com/search?q={}']]);
expect(form.blacklist).to.have.lengthOf(1);
expect(form.blacklist).to.include('*.slack.com');
+ expect(form.properties).to.have.property('mystr', 'value');
+ expect(form.properties).to.have.property('mynum', 123);
+ expect(form.properties).to.have.property('mybool', true);
});
});
});