Skip to content

Commit b5dd9b5

Browse files
committed
Add a new SchemaBuilder types.
1 parent 8304904 commit b5dd9b5

4 files changed

Lines changed: 52 additions & 12 deletions

File tree

builders.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,14 @@ SchemaBuilderEntity.prototype.$parse = function(name, value, required, custom) {
330330
return result;
331331
}
332332

333-
if (type === 'object')
333+
if (type === 'object') {
334+
if (value instanceof Array) {
335+
result.type = 8; // enum
336+
result.subtype = typeof(value[0]);
337+
} else
338+
result.type = 9; // keyvalue
334339
return result;
340+
}
335341

336342
if (value[0] === '[') {
337343
value = value.substring(1, value.length - 1);
@@ -1135,6 +1141,11 @@ SchemaBuilderEntity.prototype.default = function() {
11351141
item[property] = tmp.default();
11361142
}
11371143
break;
1144+
// enum + keyvalue
1145+
case 8:
1146+
case 9:
1147+
item[property] = undefined;
1148+
break;
11381149
}
11391150
}
11401151

@@ -1323,6 +1334,20 @@ SchemaBuilderEntity.prototype.prepare = function(model, dependencies) {
13231334
item[property] = self.$onprepare(property, model[property], undefined, model);
13241335
break;
13251336

1337+
// enum
1338+
case 8:
1339+
tmp = self.$onprepare(property, model[property], undefined, model);
1340+
if (type.subtype === 'number' && typeof(tmp) === 'string')
1341+
tmp = tmp.parseFloat(null);
1342+
item[property] = tmp != null && type.raw.indexOf(tmp) !== -1 ? tmp : undefined;
1343+
break;
1344+
1345+
// keyvalue
1346+
case 9:
1347+
tmp = self.$onprepare(property, model[property], undefined, model);
1348+
item[property] = tmp != null ? type.raw[tmp] : undefined;
1349+
break;
1350+
13261351
// schema
13271352
case 7:
13281353

changes.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
- added: support for `/workflows` file (more in documentation)
44
- added: `ShcemaBuilderEntity.$exec(name, callback)` (more in documentation)
5+
- added: `SchemaBuilder` supports new types `enum` and `keyvalue`
56
- added: `controller.$exec(name, [options], [callback])` (more in documentation)
67
- added: a new argument `description` to each SchemaBuilder `set` + `add` method e.g. `.setSave()`, `.addWorkflow()`, etc..
78
- added: `SchemaBuilder.meta` contains all registered handlers with their descriptions

test/test-builders.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,25 @@ function test_Schema() {
431431
assert.ok(response.counter === 4, 'Problem with hooks');
432432
});
433433
});
434+
435+
NEWSCHEMA('EnumKeyValue').make(function(schema) {
436+
schema.define('enum_int', [1, 2, 0.3, 4], true);
437+
schema.define('enum_string', ['Peter', 'Širka'], true);
438+
schema.define('keyvalue', { 'peter': 1, 'lucia': 2 }, true);
439+
440+
schema.make({ enum_int: '0.3', 'keyvalue': 'lucia', enum_string: 'Širka' }, function(err, response) {
441+
assert.ok(response.enum_int === 0.3, 'Schema enums (int)');
442+
assert.ok(response.enum_string === 'Širka', 'Schema enums (int)');
443+
assert.ok(response.keyvalue === 2, 'Schema keyvalue');
444+
});
445+
446+
schema.make({ enum_int: '5', 'keyvalue': 'luciaa', enum_string: 'Širkaa' }, function(err) {
447+
assert.ok(err.items[0].path === 'EnumKeyValue.enum_int', 'Schema enums (int) 2');
448+
assert.ok(err.items[1].path === 'EnumKeyValue.enum_string', 'Schema enums (string) 2');
449+
assert.ok(err.items[2].path === 'EnumKeyValue.keyvalue', 'Schema keyvalue 2');
450+
});
451+
452+
});
434453
}
435454

436455
function test_ErrorBuilder() {

utils.js

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1716,12 +1716,14 @@ function validate_builder_default(name, value, entity) {
17161716

17171717
var type = typeof(value);
17181718

1719+
// Enum + KeyValue (8+9)
1720+
if (entity.type > 7)
1721+
return value !== undefined;
1722+
17191723
switch (entity.subtype) {
17201724
case 'uid':
17211725
var number = parseInt(value.substring(10, value.length - 4), 10);
1722-
if (isNaN(number))
1723-
return false;
1724-
return value[value.length - 1] === (number % 2 ? '1' : '0');
1726+
return isNaN(number) ? false : value[value.length - 1] === (number % 2 ? '1' : '0');
17251727
case 'zip':
17261728
return value.isZIP();
17271729
case 'email':
@@ -1737,7 +1739,7 @@ function validate_builder_default(name, value, entity) {
17371739
if (type === 'number')
17381740
return value > 0;
17391741

1740-
if (type === 'string')
1742+
if (type === 'string' || value instanceof Array)
17411743
return value.length > 0;
17421744

17431745
if (type === 'boolean')
@@ -1746,9 +1748,6 @@ function validate_builder_default(name, value, entity) {
17461748
if (value == null)
17471749
return false;
17481750

1749-
if (value instanceof Array)
1750-
return value.length > 0;
1751-
17521751
if (value instanceof Date)
17531752
return value.toString()[0] !== 'I'; // Invalid Date
17541753

@@ -4239,10 +4238,6 @@ Array.prototype.remove = function(cb, value) {
42394238
return arr;
42404239
};
42414240

4242-
Array.prototype.random = function() {
4243-
return this[exports.random(this.length - 1)];
4244-
};
4245-
42464241
Array.prototype.wait = Array.prototype.waitFor = function(onItem, callback, thread) {
42474242

42484243
var self = this;

0 commit comments

Comments
 (0)