Skip to content
This repository was archived by the owner on Dec 12, 2021. It is now read-only.

Commit 6f6d776

Browse files
author
Tim van der Horst
committed
Allow custom prettify function to be defined via global options
Additionally, `prettiy` can be further overridden in validator options for `numericality` and `equality` validators.
1 parent f42d0ac commit 6f6d776

File tree

5 files changed

+117
-11
lines changed

5 files changed

+117
-11
lines changed

specs/validate-helpers-spec.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,15 @@ describe("validate", function() {
154154
expect(validate.stringifyValue("barfoo")).toEqual("foobar");
155155
expect(validate.prettify).toHaveBeenCalledWith("barfoo");
156156
});
157+
158+
it("calls custom prettify from options", function() {
159+
var options = {prettify: function() {}};
160+
spyOn(options, "prettify").and.returnValue("foobar");
161+
spyOn(validate, "prettify").and.returnValue("baz");
162+
expect(validate.stringifyValue("barfoo", options)).toEqual("foobar");
163+
expect(options.prettify).toHaveBeenCalledWith("barfoo");
164+
expect(validate.prettify).not.toHaveBeenCalled();
165+
});
157166
});
158167

159168
describe('prettify', function() {
@@ -433,6 +442,19 @@ describe("validate", function() {
433442
}]);
434443
});
435444

445+
it("calls custom prettify from options", function() {
446+
var errors = [{
447+
attribute: "foo",
448+
error: "can't be blank"
449+
}]
450+
, options = {prettify: function() {}};
451+
spyOn(options, "prettify").and.returnValue("foobar");
452+
spyOn(validate, "prettify").and.returnValue("baz");
453+
expect(convertErrorMessages(errors, options)[0].error).toEqual("Foobar can't be blank");
454+
expect(options.prettify).toHaveBeenCalledWith("foo");
455+
expect(validate.prettify).not.toHaveBeenCalled();
456+
});
457+
436458
it("doesn't modify the input", function() {
437459
var errors = [{
438460
attribute: "foo",

specs/validate-spec.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,62 @@ describe("validate", function() {
243243
{}
244244
);
245245
});
246+
247+
it("calls custom prettify in global options", function() {
248+
var constraints = {foo: {presence: true}}
249+
, options = {format: "flat", prettify: function() {}};
250+
spyOn(options, "prettify").and.returnValue("foobar");
251+
spyOn(validate, "prettify").and.returnValue("baz");
252+
expect(validate({}, constraints, options)).toEqual(["Foobar can't be blank"]);
253+
expect(options.prettify).toHaveBeenCalledWith("foo");
254+
expect(validate.prettify).not.toHaveBeenCalled();
255+
});
256+
257+
it("calls custom prettify in global options inside numericality validator", function() {
258+
var constraints = {foo: {numericality: {greaterThan: 0}}}
259+
, options = {format: "flat", prettify: function() {}};
260+
spyOn(options, "prettify").and.returnValue("foobar");
261+
spyOn(validate, "prettify").and.returnValue("baz");
262+
expect(validate({foo: 0}, constraints, options)).toEqual(["Foobar must be foobar 0"]);
263+
var args = options.prettify.calls.allArgs();
264+
expect(args).toContain(["foo"]);
265+
expect(args).toContain(["greaterThan"]);
266+
expect(validate.prettify).not.toHaveBeenCalled();
267+
});
268+
269+
it("calls custom prettify in global options inside equality validator", function() {
270+
var constraints = {bar: {equality: {attribute: "foo"}}}
271+
, options = {format: "flat", prettify: function() {}};
272+
spyOn(options, "prettify").and.returnValue("foobar");
273+
spyOn(validate, "prettify").and.returnValue("baz");
274+
expect(validate({foo: 'a', bar: 'b'}, constraints, options)).toEqual(["Foobar is not equal to foobar"]);
275+
expect(options.prettify.calls.allArgs()).toContain(["bar"]);
276+
expect(validate.prettify).not.toHaveBeenCalled();
277+
});
278+
279+
it("calls custom prettify in numericality options", function() {
280+
var constraints = {foo: {numericality: {greaterThan: 0, prettify: function() {}}}}
281+
, options = {format: "flat", prettify: function() {}};
282+
spyOn(options, "prettify").and.returnValue("foobar");
283+
spyOn(constraints.foo.numericality, "prettify").and.returnValue("grooter than");
284+
spyOn(validate, "prettify").and.returnValue("baz");
285+
expect(validate({foo: 0}, constraints, options)).toEqual(["Foobar must be grooter than 0"]);
286+
expect(options.prettify).toHaveBeenCalledWith("foo");
287+
expect(constraints.foo.numericality.prettify).toHaveBeenCalledWith("greaterThan");
288+
expect(validate.prettify).not.toHaveBeenCalled();
289+
});
290+
291+
it("calls custom prettify in equality options", function() {
292+
var constraints = {bar: {equality: {attribute: "foo", prettify: function() {}}}}
293+
, options = {format: "flat", prettify: function() {}};
294+
spyOn(options, "prettify").and.returnValue("foobar");
295+
spyOn(constraints.bar.equality, "prettify").and.returnValue("qux");
296+
spyOn(validate, "prettify").and.returnValue("baz");
297+
expect(validate({foo: 'a', bar: 'b'}, constraints, options)).toEqual(["Foobar is not equal to qux"]);
298+
expect(options.prettify.calls.allArgs()).toContain(["bar"]);
299+
expect(constraints.bar.equality.prettify).toHaveBeenCalledWith("foo");
300+
expect(validate.prettify).not.toHaveBeenCalled();
301+
});
246302
});
247303

248304
describe("format", function() {

specs/validators/equality-spec.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,13 @@ describe('validators.equality', function() {
101101
, value = "foo";
102102
expect(equality(value, options)).toBe(message);
103103
});
104+
105+
it("calls custom prettify from options", function() {
106+
var options = {attribute: "fooBar", prettify: function() {}};
107+
spyOn(options, "prettify").and.returnValue("qux");
108+
spyOn(validate, "prettify").and.returnValue("baz");
109+
expect(equality("foo", options, "foo", {foo: "foo"})).toEqual("is not equal to qux");
110+
expect(options.prettify).toHaveBeenCalledWith("fooBar");
111+
expect(validate.prettify).not.toHaveBeenCalled();
112+
});
104113
});

specs/validators/numericality-spec.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,4 +382,13 @@ describe("validators.numericality", function() {
382382

383383
expect(numericality("foo", {message: "some error"})).toEqual("some error");
384384
});
385+
386+
it("calls custom prettify from options", function() {
387+
var options = {greaterThan: 0, prettify: function() {}};
388+
spyOn(options, "prettify").and.returnValue("grooter than");
389+
spyOn(validate, "prettify").and.returnValue("greeter than");
390+
expect(numericality(0, options)).toEqual(["must be grooter than 0"]);
391+
expect(options.prettify).toHaveBeenCalledWith("greaterThan");
392+
expect(validate.prettify).not.toHaveBeenCalled();
393+
});
385394
});

validate.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -411,8 +411,9 @@
411411
.toLowerCase();
412412
},
413413

414-
stringifyValue: function(value) {
415-
return v.prettify(value);
414+
stringifyValue: function(value, options) {
415+
var prettify = options && options.prettify || v.prettify;
416+
return prettify(value);
416417
},
417418

418419
isString: function(value) {
@@ -624,7 +625,8 @@
624625
convertErrorMessages: function(errors, options) {
625626
options = options || {};
626627

627-
var ret = [];
628+
var ret = []
629+
, prettify = options.prettify || v.prettify;
628630
errors.forEach(function(errorInfo) {
629631
var error = v.result(errorInfo.error,
630632
errorInfo.value,
@@ -641,10 +643,12 @@
641643
if (error[0] === '^') {
642644
error = error.slice(1);
643645
} else if (options.fullMessages !== false) {
644-
error = v.capitalize(v.prettify(errorInfo.attribute)) + " " + error;
646+
error = v.capitalize(prettify(errorInfo.attribute)) + " " + error;
645647
}
646648
error = error.replace(/\\\^/g, "^");
647-
error = v.format(error, {value: v.stringifyValue(errorInfo.value)});
649+
error = v.format(error, {
650+
value: v.stringifyValue(errorInfo.value, options)
651+
});
648652
ret.push(v.extend({}, errorInfo, {error: error}));
649653
});
650654
return ret;
@@ -812,7 +816,7 @@
812816
return options.message || errors;
813817
}
814818
},
815-
numericality: function(value, options) {
819+
numericality: function(value, options, attribute, attributes, globalOptions) {
816820
// Empty values are fine
817821
if (v.isEmpty(value)) {
818822
return;
@@ -830,7 +834,10 @@
830834
lessThan: function(v, c) { return v < c; },
831835
lessThanOrEqualTo: function(v, c) { return v <= c; },
832836
divisibleBy: function(v, c) { return v % c === 0; }
833-
};
837+
}
838+
, prettify = options.prettify ||
839+
(globalOptions && globalOptions.prettify) ||
840+
v.prettify;
834841

835842
// Strict will check that it is a valid looking number
836843
if (v.isString(value) && options.strict) {
@@ -887,7 +894,7 @@
887894

888895
errors.push(v.format(msg, {
889896
count: count,
890-
type: v.prettify(name)
897+
type: prettify(name)
891898
}));
892899
}
893900
}
@@ -1048,7 +1055,7 @@
10481055
}, {
10491056
PATTERN: /^[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/i
10501057
}),
1051-
equality: function(value, options, attribute, attributes) {
1058+
equality: function(value, options, attribute, attributes, globalOptions) {
10521059
if (v.isEmpty(value)) {
10531060
return;
10541061
}
@@ -1068,10 +1075,13 @@
10681075
var otherValue = v.getDeepObjectValue(attributes, options.attribute)
10691076
, comparator = options.comparator || function(v1, v2) {
10701077
return v1 === v2;
1071-
};
1078+
}
1079+
, prettify = options.prettify ||
1080+
(globalOptions && globalOptions.prettify) ||
1081+
v.prettify;
10721082

10731083
if (!comparator(value, otherValue, options, attribute, attributes)) {
1074-
return v.format(message, {attribute: v.prettify(options.attribute)});
1084+
return v.format(message, {attribute: prettify(options.attribute)});
10751085
}
10761086
},
10771087

0 commit comments

Comments
 (0)