changeset eb238bf04203 in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=eb238bf04203
description:
Support PYSON comparison of date and datetime
issue4879
review270061002
diffstat:
CHANGELOG | 1 +
src/pyson.js | 29 ++++++++++--
tests/sao.js | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
3 files changed, 150 insertions(+), 12 deletions(-)
diffs (248 lines):
diff -r 713e94987da2 -r eb238bf04203 CHANGELOG
--- a/CHANGELOG Sat Aug 29 18:29:15 2020 +0200
+++ b/CHANGELOG Sat Sep 05 22:59:38 2020 +0200
@@ -1,3 +1,4 @@
+* Support PYSON comparison of date and datetime
* Customize bootstrap default style
* Set field's name as input's name attribute
* Position copied records based on order
diff -r 713e94987da2 -r eb238bf04203 src/pyson.js
--- a/src/pyson.js Sat Aug 29 18:29:15 2020 +0200
+++ b/src/pyson.js Sat Sep 05 22:59:38 2020 +0200
@@ -389,12 +389,16 @@
for (var i = 0; i < 2; i++) {
var statement = statements[i];
if (statement instanceof Sao.PYSON.PYSON) {
- if (jQuery(statement.types()).not(['number']).length) {
- throw 'statement must be an integer or a float';
+ if ( (!(statement instanceof Sao.PYSON.DateTime ||
+ statement instanceof Sao.PYSON.Date)) &&
+ (jQuery(statement.types()).not(['number']).length) ) {
+ throw 'statement must be an integer, float, ' +
+ 'date or datetime';
}
} else {
if (!~['number', 'object'].indexOf(typeof statement)) {
- throw 'statement must be an integer or a float';
+ throw 'statement must be an integer, float, ' +
+ 'date or datetime';
}
}
}
@@ -431,12 +435,24 @@
Sao.PYSON.Greater._convert = function(value) {
value = jQuery.extend({}, value);
- value.s1 = Number(value.s1);
- value.s2 = Number(value.s2);
+ var values = [value.s1, value.s2];
+ for (var i=0; i < 2; i++) {
+ if (values[i] instanceof moment) {
+ values[i] = values[i].unix();
+ }
+ else {
+ values[i] = Number(values[i]);
+ }
+ }
+ value.s1 = values[0];
+ value.s2 = values[1];
return value;
};
Sao.PYSON.Greater.eval_ = function(value, context) {
+ if (value.s1 == null || value.s2 == null) {
+ return false;
+ }
value = Sao.PYSON.Greater._convert(value);
if (value.e) {
return value.s1 >= value.s2;
@@ -462,6 +478,9 @@
Sao.PYSON.Less._convert = Sao.PYSON.Greater._convert;
Sao.PYSON.Less.eval_ = function(value, context) {
+ if (value.s1 == null || value.s2 == null) {
+ return false;
+ }
value = Sao.PYSON.Less._convert(value);
if (value.e) {
return value.s1 <= value.s2;
diff -r 713e94987da2 -r eb238bf04203 tests/sao.js
--- a/tests/sao.js Sat Aug 29 18:29:15 2020 +0200
+++ b/tests/sao.js Sat Sep 05 22:59:38 2020 +0200
@@ -407,13 +407,19 @@
QUnit.throws(function() {
new Sao.PYSON.Greater('test', 0);
- }, 'statement must be an integer or a float');
+ }, 'statement must be an integer, float, date or datetime');
QUnit.throws(function() {
new Sao.PYSON.Greater(1, 'test');
- }, 'statement must be an integer or a float');
+ }, 'statement must be an integer, float, date or datetime');
QUnit.throws(function() {
new Sao.PYSON.Greater(new Sao.PYSON.Eval('foo'), 0);
- }, 'statement must be an integer of float');
+ }, 'statement must be an integer, float, date or datetime');
+ QUnit.throws(function() {
+ new Sao.PYSON.Greater(Sao.PYSON.DateTime(), 'test');
+ }, 'statement must be an integer, float, date or datetime');
+ QUnit.throws(function() {
+ new Sao.PYSON.Greater('test', Date());
+ }, 'statement must be an integer, float, date or datetime');
QUnit.ok(Sao.common.compare(new Sao.PYSON.Greater(1, 0).types(),
['boolean']), 'Greater(1, 0).types()');
@@ -451,11 +457,64 @@
'decode(Greater(null, 1))');
eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(1, null));
- QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
'decode(Greater(1, null))');
QUnit.strictEqual(new Sao.PYSON.Greater(1, 0).toString(),
"Greater(1, 0, false)");
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ Sao.Date(2020, 0, 2)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
+ 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' +
+ 'Date(2020, 0, 2)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ Sao.Date(2020, 0, 1)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' +
+ 'Date(2020, 0, 1)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ Sao.Date(2020, 0, 1), true));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' +
+ 'Date(2020, 0, 1), true))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
+ 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' +
+ 'PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0, 0)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
+ new Sao.PYSON.Date(2020, 1, 1),
+ Sao.Date(2020, 0, 1)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
+ 'decode(Greater(PYSON.Date(2020, 1, 1), Date(2020, 0, 1)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
+ new Sao.PYSON.Date(2020, 1, 1),
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
+ 'decode(Greater(PYSON.Date(2020, 1, 1), ' +
+ 'PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1),
+ new Sao.PYSON.Date(2020, 1, 1), true));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1), ' +
+ 'PYSON.Date(2020, 1, 1), true))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))');
+
eval_ = new Sao.PYSON.Encoder().encode(
new Sao.PYSON.Greater(new Sao.PYSON.Eval('i', 0), 0));
QUnit.strictEqual(new Sao.PYSON.Decoder({i: 1}).decode(eval_), true,
@@ -471,10 +530,22 @@
QUnit.throws(function() {
new Sao.PYSON.Less('test', 0);
- }, 'statement must be an integer or a float');
+ }, 'statement must be an integer, float, date or datetime');
+ QUnit.throws(function() {
+ new Sao.PYSON.Less(1, 'test');
+ }, 'statement must be an integer, float, date or datetime');
QUnit.throws(function() {
new Sao.PYSON.Less(1, 'test');
- }, 'statement must be an integer or a float');
+ }, 'statement must be an integer, float, date or datetime');
+ QUnit.throws(function() {
+ new Sao.PYSON.Less(new Sao.PYSON.Eval('foo'), 0);
+ }, 'statement must be an integer, float, date or datetime');
+ QUnit.throws(function() {
+ new Sao.PYSON.Less(Sao.PYSON.DateTime(), 'test');
+ }, 'statement must be an integer, float, date or datetime');
+ QUnit.throws(function() {
+ new Sao.PYSON.Less('test', Date());
+ }, 'statement must be an integer, float, date or datetime');
QUnit.ok(Sao.common.compare(new Sao.PYSON.Less(1, 0).types(),
['boolean']), 'Less(1, 0).types()');
@@ -508,7 +579,7 @@
'decode(Less(1, 1, true))');
eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(null, 1));
- QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
'decode(Less(null, 1))');
eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(1, null));
@@ -516,6 +587,53 @@
'decode(Less(1, null))');
QUnit.strictEqual(new Sao.PYSON.Less(0, 1).toString(),
"Less(0, 1, false)");
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ Sao.Date(2020, 0, 1)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
+ 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' +
+ 'Date(2020, 0, 1)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ Sao.Date(2020, 0, 2), true));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' +
+ 'Date(2020, 0, 2), true))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
+ 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' +
+ 'PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(
+ new Sao.PYSON.Date(2020, 1, 1),
+ Sao.Date(2020, 0, 2)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ 'decode(Less(PYSON.Date(2020, 1, 1), Date(2020, 0, 2)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(
+ new Sao.PYSON.Date(2020, 1, 1),
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1)));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ 'decode(Less(PYSON.Date(2020, 1, 1), ' +
+ 'PYSON.DateTime(2020, 1, 1, 0, 0, 1)))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ new Sao.PYSON.Date(2020, 0, 1), true));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
+ 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' +
+ 'PYSON.Date(2020, 1, 1), true))');
+
+ eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(
+ new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000));
+ QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
+ 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))');
+
});
QUnit.test('PYSON If', function() {