changeset b4859872c774 in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=b4859872c774
description:
Unify PYSON string format between all clients
issue9723
review328481002
diffstat:
CHANGELOG | 2 +
src/pyson.js | 21 +++++----
src/sao.js | 9 ++++
tests/sao.js | 119 +++++++++++++++++++++++++++++-----------------------------
4 files changed, 81 insertions(+), 70 deletions(-)
diffs (302 lines):
diff -r e687305a3645 -r b4859872c774 CHANGELOG
--- a/CHANGELOG Wed Nov 11 20:34:10 2020 +0100
+++ b/CHANGELOG Sun Nov 15 18:50:47 2020 +0100
@@ -1,3 +1,5 @@
+* Unify PYSON string format
+
Version 5.8.0 - 2020-11-02
* Bug fixes (see mercurial logs for details)
* Format timedelta in CSV export
diff -r e687305a3645 -r b4859872c774 src/pyson.js
--- a/src/pyson.js Wed Nov 11 20:34:10 2020 +0100
+++ b/src/pyson.js Sun Nov 15 18:50:47 2020 +0100
@@ -4,7 +4,10 @@
'use strict';
Sao.PYSON = {};
- Sao.PYSON.eval = {};
+ Sao.PYSON.eval = {
+ True: true,
+ False: false,
+ };
Sao.PYSON.toString = function(value) {
if (value instanceof Sao.PYSON.PYSON) {
return value.toString();
@@ -263,13 +266,11 @@
Sao.PYSON.eval.And = function(statements) {
- return new Sao.PYSON.And(statements);
+ return Sao.PYSON.And.new_(statements);
};
Sao.PYSON.And = Sao.class_(Sao.PYSON.PYSON, {
- init: function(statements) {
- if (statements === undefined) {
- statements = [];
- }
+ init: function() {
+ var statements = jQuery.extend([], arguments);
Sao.PYSON.And._super.init.call(this);
for (var i = 0, len = statements.length; i < len; i++) {
var statement = statements[i];
@@ -297,7 +298,7 @@
return ['boolean'];
},
__string_params__: function() {
- return [this._statements];
+ return this._statements;
}
});
@@ -310,12 +311,12 @@
return result;
};
Sao.PYSON.And.init_from_object = function(obj) {
- return new Sao.PYSON.And(obj.s);
+ return Sao.PYSON.And.new_(obj.s);
};
Sao.PYSON.eval.Or = function(statements) {
- return new Sao.PYSON.Or(statements);
+ return Sao.PYSON.Or.new_(statements);
};
Sao.PYSON.Or = Sao.class_(Sao.PYSON.And, {
pyson: function() {
@@ -334,7 +335,7 @@
return result;
};
Sao.PYSON.Or.init_from_object= function(obj) {
- return new Sao.PYSON.Or(obj.s);
+ return new Sao.PYSON.Or.new_(obj.s);
};
Sao.PYSON.eval.Equal = function(statement1, statement2) {
diff -r e687305a3645 -r b4859872c774 src/sao.js
--- a/src/sao.js Wed Nov 11 20:34:10 2020 +0100
+++ b/src/sao.js Sun Nov 15 18:50:47 2020 +0100
@@ -163,6 +163,15 @@
Object.getOwnPropertyDescriptor(props, name));
}
}
+
+ // Method to create new instance with a list of arguments
+ function F(args) {
+ return ClassConstructor.apply(this, args);
+ }
+ F.prototype = ClassConstructor.prototype;
+ ClassConstructor.new_ = function(args) {
+ return new F(args);
+ };
return ClassConstructor;
};
diff -r e687305a3645 -r b4859872c774 tests/sao.js
--- a/tests/sao.js Wed Nov 11 20:34:10 2020 +0100
+++ b/tests/sao.js Sun Nov 15 18:50:47 2020 +0100
@@ -189,139 +189,133 @@
});
QUnit.test('PYSON And', function() {
- var value = new Sao.PYSON.And([true, false]).pyson();
- QUnit.strictEqual(value.__class__, 'And', 'And([true,
false]).pyson()');
+ var value = new Sao.PYSON.And(true, false).pyson();
+ QUnit.strictEqual(value.__class__, 'And', 'And(true, false).pyson()');
QUnit.ok(Sao.common.compare(value.s, [true, false]),
'And([true, false]).pyson()');
QUnit.throws(function() {
- new Sao.PYSON.And([true]);
- }, 'must have at least 2 statements', 'And([true])');
- QUnit.throws(function() {
- new Sao.PYSON.And([]);
- }, 'must have at least 2 statements', 'And([])');
+ new Sao.PYSON.And(true);
+ }, 'must have at least 2 statements', 'And(true)');
QUnit.throws(function() {
new Sao.PYSON.And();
}, 'must have at least 2 statements', 'And()');
- QUnit.ok(Sao.common.compare(new Sao.PYSON.And([true, false]).types(),
- ['boolean']), 'And([true, false]).types()');
+ QUnit.ok(Sao.common.compare(new Sao.PYSON.And(true, false).types(),
+ ['boolean']), 'And(true, false).types()');
var eval_;
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([true, true]));
+ new Sao.PYSON.And(true, true));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(And([true, true]))');
+ 'decode(And(true, true))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([true, true, true]));
+ new Sao.PYSON.And(true, true, true));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(And([true, true, true]))');
+ 'decode(And(true, true, true))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([true, false]));
+ new Sao.PYSON.And(true, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(And([true, false]))');
+ 'decode(And(true, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([false, true]));
+ new Sao.PYSON.And(false, true));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(And([false, true]))');
+ 'decode(And(false, true))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([false, false]));
+ new Sao.PYSON.And(false, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(And([false, false]))');
+ 'decode(And(false, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([false, false, false]));
+ new Sao.PYSON.And(false, false, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(And([false, false, false]))');
+ 'decode(And(false, false, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([true, false, false]));
+ new Sao.PYSON.And(true, false, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(And([true, false, false]))');
+ 'decode(And(true, false, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([false, true, false]));
+ new Sao.PYSON.And(false, true, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(And([false, true, false]))');
+ 'decode(And(false, true, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.And([false, false, true]));
+ new Sao.PYSON.And(false, false, true));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(And([false, false, true]))');
- QUnit.strictEqual(new Sao.PYSON.And([false, true, true]).toString(),
- "And([false, true, true])");
+ 'decode(And(false, false, true))');
+ QUnit.strictEqual(new Sao.PYSON.And(false, true, true).toString(),
+ "And(false, true, true)");
});
QUnit.test('PYSON Or', function() {
- var value = new Sao.PYSON.Or([true, false]).pyson();
- QUnit.strictEqual(value.__class__, 'Or', 'Or([true, false]).pyson()');
+ var value = new Sao.PYSON.Or(true, false).pyson();
+ QUnit.strictEqual(value.__class__, 'Or', 'Or(true, false).pyson()');
QUnit.ok(Sao.common.compare(value.s, [true, false]),
- 'Or([true, false]).pyson()');
+ 'Or(true, false).pyson()');
QUnit.throws(function() {
- new Sao.PYSON.Or([true]);
- }, 'must have at least 2 statements', 'Or([true])');
- QUnit.throws(function() {
- new Sao.PYSON.Or([]);
- }, 'must have at least 2 statements', 'Or([])');
+ new Sao.PYSON.Or(true);
+ }, 'must have at least 2 statements', 'Or(true)');
QUnit.throws(function() {
new Sao.PYSON.Or();
- }, 'must have at least 2 statements', 'Or([])');
+ }, 'must have at least 2 statements', 'Or()');
- QUnit.ok(Sao.common.compare(new Sao.PYSON.Or([true, false]).types(),
- ['boolean']), 'Or([true, false]).types()');
+ QUnit.ok(Sao.common.compare(new Sao.PYSON.Or(true, false).types(),
+ ['boolean']), 'Or(true, false).types()');
var eval_;
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([true, true]));
+ new Sao.PYSON.Or(true, true));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(Or([true, true]))');
+ 'decode(Or(true, true))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([true, true, true]));
+ new Sao.PYSON.Or(true, true, true));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(Or([true, true, true]))');
+ 'decode(Or(true, true, true))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([true, false]));
+ new Sao.PYSON.Or(true, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(Or([true, false]))');
+ 'decode(Or(true, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([false, true]));
+ new Sao.PYSON.Or(false, true));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(Or([false, true]))');
+ 'decode(Or(false, true))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([false, false]));
+ new Sao.PYSON.Or(false, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(Or([false, false]))');
+ 'decode(Or(false, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([false, false, false]));
+ new Sao.PYSON.Or(false, false, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
- 'decode(Or([false, false, false]))');
+ 'decode(Or(false, false, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([true, false, false]));
+ new Sao.PYSON.Or(true, false, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(Or([true, false, false]))');
+ 'decode(Or(true, false, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([false, true, false]));
+ new Sao.PYSON.Or(false, true, false));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(Or([false, true, false]))');
+ 'decode(Or(false, true, false))');
eval_ = new Sao.PYSON.Encoder().encode(
- new Sao.PYSON.Or([false, false, true]));
+ new Sao.PYSON.Or(false, false, true));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
- 'decode(Or([false, false, true]))');
- QUnit.strictEqual(new Sao.PYSON.Or([false, true, true]).toString(),
- "Or([false, true, true])");
+ 'decode(Or(false, false, true))');
+ QUnit.strictEqual(new Sao.PYSON.Or(false, true, true).toString(),
+ "Or(false, true, true)");
});
QUnit.test('PYSON Equal', function() {
@@ -1233,6 +1227,11 @@
});
});
+ QUnit.test('PYSON eval', function() {
+ QUnit.strictEqual(eval_pyson('True'), true, "eval_pyson('True')");
+ QUnit.strictEqual(eval_pyson('False'), false, "eval_pyson('False')");
+ });
+
QUnit.test('DomainParser.group_operator', function() {
var parser = new Sao.common.DomainParser();
QUnit.ok(Sao.common.compare(parser.group_operator(['a', '>', '=']),