@@ -1,3 +1,4 @@
|
||||
* Support PYSON comparison of timedelta
|
||||
* Support encoding timedelta into PYSON TimeDelta
|
||||
|
||||
Version 6.8.0 - 2023-05-01
|
||||
|
||||
@@ -314,12 +314,14 @@ class Greater(PYSON):
|
||||
if isinstance(i, PYSON):
|
||||
assert i.types().issubset({
|
||||
int, float, type(None),
|
||||
datetime.datetime, datetime.date}), \
|
||||
datetime.datetime, datetime.date,
|
||||
datetime.timedelta}), \
|
||||
'statement must be an integer, float, date or datetime'
|
||||
else:
|
||||
assert isinstance(i, (
|
||||
int, float, type(None),
|
||||
datetime.datetime, datetime.date)), \
|
||||
datetime.datetime, datetime.date,
|
||||
datetime.timedelta)), \
|
||||
'statement must be an integer, float, date or datetime'
|
||||
if isinstance(equal, PYSON):
|
||||
if equal.types() != {bool}:
|
||||
@@ -358,6 +360,8 @@ class Greater(PYSON):
|
||||
elif isinstance(stmt, datetime.date):
|
||||
time = datetime.time(0, 0)
|
||||
stmt = datetime.datetime.combine(stmt, time).timestamp()
|
||||
elif isinstance(stmt, datetime.timedelta):
|
||||
stmt = stmt.total_seconds()
|
||||
dct[i] = float(stmt)
|
||||
return dct
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
* Support PYSON comparison of timedelta
|
||||
* Support encoding timedelta into PYSON TimeDelta
|
||||
* Eagerly read string value of multiselection fields
|
||||
* Use locale timezone for CSV in locale format
|
||||
|
||||
+7
-5
@@ -415,15 +415,16 @@
|
||||
var statement = statements[i];
|
||||
if (statement instanceof Sao.PYSON.PYSON) {
|
||||
if ( (!(statement instanceof Sao.PYSON.DateTime ||
|
||||
statement instanceof Sao.PYSON.Date)) &&
|
||||
statement instanceof Sao.PYSON.Date ||
|
||||
statement instanceof Sao.PYSON.TimeDelta)) &&
|
||||
(jQuery(statement.types()).not(['number']).length) ) {
|
||||
throw 'statement must be an integer, float, ' +
|
||||
'date or datetime';
|
||||
'date, datetime or timedelta';
|
||||
}
|
||||
} else {
|
||||
if (!~['number', 'object'].indexOf(typeof statement)) {
|
||||
throw 'statement must be an integer, float, ' +
|
||||
'date or datetime';
|
||||
'date, datetime or timedelta';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -461,8 +462,9 @@
|
||||
for (var i=0; i < 2; i++) {
|
||||
if (moment.isMoment(values[i])) {
|
||||
values[i] = values[i].valueOf();
|
||||
}
|
||||
else {
|
||||
} else if (moment.isDuration(values[i])) {
|
||||
values[i] = values[i].valueOf();
|
||||
} else {
|
||||
values[i] = Number(values[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -520,6 +520,24 @@
|
||||
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.TimeDelta(5, 2),
|
||||
new Sao.PYSON.TimeDelta(4, 2)));
|
||||
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
|
||||
'decode(Greater(PYSON.TimeDelta(5, 2), PYSON.TimeDelta(4, 2)))');
|
||||
|
||||
eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
|
||||
new Sao.PYSON.TimeDelta(4, 2),
|
||||
new Sao.PYSON.TimeDelta(5, 2)));
|
||||
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
|
||||
'decode(Greater(PYSON.TimeDelta(4, 2), PYSON.TimeDelta(5, 2)))');
|
||||
|
||||
eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
|
||||
new Sao.PYSON.TimeDelta(5, 2),
|
||||
Sao.TimeDelta(4, 2)));
|
||||
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
|
||||
'decode(Greater(PYSON.TimeDelta(5, 2), Sao.TimeDelta(4, 2)))');
|
||||
|
||||
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,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
* Support PYSON comparison of timedelta
|
||||
* Support encoding timedelta into PYSON TimeDelta
|
||||
* Transfer configuration, profiles and plugins from previous version
|
||||
* Eagerly read string value of multiselection fields
|
||||
|
||||
@@ -314,12 +314,14 @@ class Greater(PYSON):
|
||||
if isinstance(i, PYSON):
|
||||
assert i.types().issubset({
|
||||
int, float, type(None),
|
||||
datetime.datetime, datetime.date}), \
|
||||
datetime.datetime, datetime.date,
|
||||
datetime.timedelta}), \
|
||||
'statement must be an integer, float, date or datetime'
|
||||
else:
|
||||
assert isinstance(i, (
|
||||
int, float, type(None),
|
||||
datetime.datetime, datetime.date)), \
|
||||
datetime.datetime, datetime.date,
|
||||
datetime.timedelta)), \
|
||||
'statement must be an integer, float, date or datetime'
|
||||
if isinstance(equal, PYSON):
|
||||
if equal.types() != {bool}:
|
||||
@@ -358,6 +360,8 @@ class Greater(PYSON):
|
||||
elif isinstance(stmt, datetime.date):
|
||||
time = datetime.time(0, 0)
|
||||
stmt = datetime.datetime.combine(stmt, time).timestamp()
|
||||
elif isinstance(stmt, datetime.timedelta):
|
||||
stmt = stmt.total_seconds()
|
||||
dct[i] = float(stmt)
|
||||
return dct
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
* Support PYSON comparison of timedelta
|
||||
* Support encoding timedelta into PYSON TimeDelta
|
||||
* Allow date formating in sequences substitutions
|
||||
* Make ModelSQL based on table query read only by default
|
||||
|
||||
@@ -314,12 +314,14 @@ class Greater(PYSON):
|
||||
if isinstance(i, PYSON):
|
||||
assert i.types().issubset({
|
||||
int, float, type(None),
|
||||
datetime.datetime, datetime.date}), \
|
||||
datetime.datetime, datetime.date,
|
||||
datetime.timedelta}), \
|
||||
'statement must be an integer, float, date or datetime'
|
||||
else:
|
||||
assert isinstance(i, (
|
||||
int, float, type(None),
|
||||
datetime.datetime, datetime.date)), \
|
||||
datetime.datetime, datetime.date,
|
||||
datetime.timedelta)), \
|
||||
'statement must be an integer, float, date or datetime'
|
||||
if isinstance(equal, PYSON):
|
||||
if equal.types() != {bool}:
|
||||
@@ -358,6 +360,8 @@ class Greater(PYSON):
|
||||
elif isinstance(stmt, datetime.date):
|
||||
time = datetime.time(0, 0)
|
||||
stmt = datetime.datetime.combine(stmt, time).timestamp()
|
||||
elif isinstance(stmt, datetime.timedelta):
|
||||
stmt = stmt.total_seconds()
|
||||
dct[i] = float(stmt)
|
||||
return dct
|
||||
|
||||
|
||||
@@ -303,6 +303,21 @@ class PYSONTestCase(unittest.TestCase):
|
||||
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))
|
||||
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
||||
|
||||
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
||||
pyson.TimeDelta(5, 2),
|
||||
pyson.TimeDelta(4, 2)))
|
||||
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
||||
|
||||
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
||||
pyson.TimeDelta(4, 2),
|
||||
pyson.TimeDelta(5, 2)))
|
||||
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
||||
|
||||
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
||||
pyson.TimeDelta(5, 2),
|
||||
datetime.timedelta(4, 2)))
|
||||
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
||||
|
||||
eval = pyson.PYSONEncoder().encode(
|
||||
pyson.Greater(pyson.Eval('i', 0), 0))
|
||||
self.assertTrue(pyson.PYSONDecoder({'i': 1}).decode(eval))
|
||||
|
||||
Reference in New Issue
Block a user