Improve unittests to run trytond from tests

Use sqlite as default backend
Add skiptest attribute to data tag
Add option to test_tryton to run tests from all modules
This commit is contained in:
Cédric Krier
2010-03-04 14:02:27 +01:00
parent 02e5da4e22
commit 20741b613d
24 changed files with 3760 additions and 3351 deletions
+4
View File
@@ -1,3 +1,7 @@
* Improve unittests to run trytond from tests
Use sqlite as default backend
Add skiptest attribute to data tag
Add option to test_tryton to run tests from all modules
* Add MySQL backend
* Refactoring by validation with pylint
* Modify ondelete attribute of Many2One according to required attribute value
+1 -1
View File
@@ -30,7 +30,7 @@
# Configure the database type
# allowed values are postgresql, sqlite, mysql
db_type = postgresql
#db_type = postgresql
# Configure the database connection
## Note: Only databases owned by db_user will be displayed in the connection dialog
+6 -1
View File
@@ -179,7 +179,12 @@ class Database(DatabaseInterface):
@staticmethod
def list(cursor):
res = []
for db_file in os.listdir(CONFIG['data_path']) + [':memory:']:
listdir = [':memory:']
try:
listdir += os.listdir(CONFIG['data_path'])
except OSError:
pass
for db_file in listdir:
if db_file.endswith('.sqlite') or db_file == ':memory:':
if db_file == ':memory:':
db_name = ':memory:'
+2 -2
View File
@@ -119,14 +119,14 @@ class ConfigManager(object):
init = {}
if opt.init:
for i in opt.init.split(','):
if i != 'tests':
if i != 'test':
init[i] = 1
self.options['init'] = init
update = {}
if opt.update:
for i in opt.update.split(','):
if i != 'tests':
if i != 'test':
update[i] = 1
self.options['update'] = update
+1 -1
View File
@@ -77,7 +77,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.module.module</field>
<field name="view_type">form</field>
<field name="domain">[('name', '!=', 'tests')]</field>
<field name="domain">[('name', '!=', 'test')]</field>
</record>
<record model="ir.action.act_window.view"
id="act_module_form_view1">
+7 -7
View File
@@ -133,7 +133,7 @@ def create_graph(module_list, force=None):
for module in module_list:
tryton_file = OPJ(MODULES_PATH, module, '__tryton__.py')
mod_path = OPJ(MODULES_PATH, module)
if module in ('ir', 'workflow', 'res', 'webdav', 'tests'):
if module in ('ir', 'workflow', 'res', 'webdav', 'test'):
root_path = os.path.dirname(os.path.dirname(__file__))
tryton_file = OPJ(root_path, module, '__tryton__.py')
mod_path = OPJ(root_path, module)
@@ -171,7 +171,7 @@ def create_graph(module_list, force=None):
for kind in ('init', 'update'):
if (package in CONFIG[kind]) \
or (('all' in CONFIG[kind]) \
and (package != 'tests')) \
and (package != 'test')) \
or (kind in force):
setattr(node, kind, True)
else:
@@ -314,7 +314,7 @@ def get_module_list():
module_list.add('workflow')
module_list.add('res')
module_list.add('webdav')
module_list.add('tests')
module_list.add('test')
return list(module_list)
def register_classes(reload_p=False):
@@ -328,11 +328,11 @@ def register_classes(reload_p=False):
import trytond.workflow
import trytond.res
import trytond.webdav
import trytond.tests
import trytond.test
else:
for module in ('trytond.model', 'trytond.report', 'trytond.wizard',
'trytond.ir', 'trytond.workflow', 'trytond.res',
'trytond.webdav', 'trytond.tests'):
'trytond.webdav', 'trytond.test'):
for i in sys.modules.keys():
if i.startswith(module) \
and i != module:
@@ -345,7 +345,7 @@ def register_classes(reload_p=False):
module = package.name
logger.info('%s:registering classes' % module)
if module in ('ir', 'workflow', 'res', 'webdav', 'tests'):
if module in ('ir', 'workflow', 'res', 'webdav', 'test'):
MODULES.append(module)
continue
@@ -396,7 +396,7 @@ def load_modules(database_name, pool, update=False, lang=None):
if update:
if 'all' in CONFIG['init']:
cursor.execute("SELECT name FROM ir_module_module " \
"WHERE name != \'tests\'")
"WHERE name != \'test\'")
else:
cursor.execute("SELECT name FROM ir_module_module " \
"WHERE state IN ('installed', 'to install', " \
+1
View File
@@ -16,6 +16,7 @@ class Pool(object):
_locks = {}
_pool = {}
_pools = {}
test = False
def __new__(cls, database_name):
cls._lock.acquire()
+7
View File
@@ -0,0 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from test import *
from model import *
from mptt import *
from import_data import *
@@ -6,7 +6,7 @@ from trytond.model import ModelSQL, fields
class ImportDataBoolean(ModelSQL):
"Import Data Boolean"
_name = 'tests.import_data.boolean'
_name = 'test.import_data.boolean'
_description = __doc__
boolean = fields.Boolean('Boolean')
@@ -15,7 +15,7 @@ ImportDataBoolean()
class ImportDataInteger(ModelSQL):
"Import Data Integer"
_name = 'tests.import_data.integer'
_name = 'test.import_data.integer'
_description = __doc__
integer = fields.Integer('Integer')
@@ -24,7 +24,7 @@ ImportDataInteger()
class ImportDataFloat(ModelSQL):
"Import Data Float"
_name = 'tests.import_data.float'
_name = 'test.import_data.float'
_description = __doc__
float = fields.Float('Float')
@@ -33,7 +33,7 @@ ImportDataFloat()
class ImportDataNumeric(ModelSQL):
"Import Data Numeric"
_name = 'tests.import_data.numeric'
_name = 'test.import_data.numeric'
_description = __doc__
numeric = fields.Numeric('Numeric')
@@ -42,7 +42,7 @@ ImportDataNumeric()
class ImportDataChar(ModelSQL):
"Import Data Char"
_name = 'tests.import_data.char'
_name = 'test.import_data.char'
_description = __doc__
char = fields.Char('Char')
@@ -51,7 +51,7 @@ ImportDataChar()
class ImportDataText(ModelSQL):
"Import Data Text"
_name = 'tests.import_data.text'
_name = 'test.import_data.text'
_description = __doc__
text = fields.Text('Text')
@@ -60,7 +60,7 @@ ImportDataText()
class ImportDataSha(ModelSQL):
"Import Data Sha"
_name = 'tests.import_data.sha'
_name = 'test.import_data.sha'
_description = __doc__
sha = fields.Sha('Sha')
@@ -69,7 +69,7 @@ ImportDataSha()
class ImportDataDate(ModelSQL):
"Import Data Date"
_name = 'tests.import_data.date'
_name = 'test.import_data.date'
_description = __doc__
date = fields.Date('Date')
@@ -78,7 +78,7 @@ ImportDataDate()
class ImportDataDateTime(ModelSQL):
"Import Data DateTime"
_name = 'tests.import_data.datetime'
_name = 'test.import_data.datetime'
_description = __doc__
datetime = fields.DateTime('DateTime')
@@ -87,7 +87,7 @@ ImportDataDateTime()
class ImportDataSelection(ModelSQL):
"Import Data Selection"
_name = 'tests.import_data.selection'
_name = 'test.import_data.selection'
_description = __doc__
selection = fields.Selection([
('select1', 'Select 1'),
@@ -100,7 +100,7 @@ ImportDataSelection()
class ImportDataMany2OneTarget(ModelSQL):
"Import Data Many2One Target"
_name = 'tests.import_data.many2one.target'
_name = 'test.import_data.many2one.target'
_description = __doc__
name = fields.Char('Name')
@@ -109,9 +109,9 @@ ImportDataMany2OneTarget()
class ImportDataMany2One(ModelSQL):
"Import Data Many2One"
_name = 'tests.import_data.many2one'
_name = 'test.import_data.many2one'
_description = __doc__
many2one = fields.Many2One('tests.import_data.many2one.target',
many2one = fields.Many2One('test.import_data.many2one.target',
'Many2One')
ImportDataMany2One()
@@ -119,7 +119,7 @@ ImportDataMany2One()
class ImportDataMany2ManyTarget(ModelSQL):
"Import Data Many2Many Target"
_name = 'tests.import_data.many2many.target'
_name = 'test.import_data.many2many.target'
_description = __doc__
name = fields.Char('Name')
@@ -128,9 +128,9 @@ ImportDataMany2ManyTarget()
class ImportDataMany2Many(ModelSQL):
"Import Data Many2Many"
_name = 'tests.import_data.many2many'
_name = 'test.import_data.many2many'
_description = __doc__
many2many = fields.Many2Many('tests.import_data.many2many.relation',
many2many = fields.Many2Many('test.import_data.many2many.relation',
'many2many', 'target', 'Many2Many')
ImportDataMany2Many()
@@ -138,19 +138,19 @@ ImportDataMany2Many()
class ImportDataMany2ManyRelation(ModelSQL):
"Import Data Many2Many Relation"
_name = 'tests.import_data.many2many.relation'
many2many = fields.Many2One('tests.import_data.many2many', 'Many2One')
target = fields.Many2One('tests.import_data.many2many.target', 'Target')
_name = 'test.import_data.many2many.relation'
many2many = fields.Many2One('test.import_data.many2many', 'Many2One')
target = fields.Many2One('test.import_data.many2many.target', 'Target')
ImportDataMany2ManyRelation()
class ImportDataOne2Many(ModelSQL):
"Import Data One2Many"
_name = 'tests.import_data.one2many'
_name = 'test.import_data.one2many'
_description = __doc__
name = fields.Char('Name')
one2many = fields.One2Many('tests.import_data.one2many.target', 'one2many',
one2many = fields.One2Many('test.import_data.one2many.target', 'one2many',
'One2Many')
ImportDataOne2Many()
@@ -158,17 +158,17 @@ ImportDataOne2Many()
class ImportDataOne2ManyTarget(ModelSQL):
"Import Data One2Many Target"
_name = 'tests.import_data.one2many.target'
_name = 'test.import_data.one2many.target'
_description = __doc__
name = fields.Char('Name')
one2many = fields.Many2One('tests.import_data.one2many', 'One2Many')
one2many = fields.Many2One('test.import_data.one2many', 'One2Many')
ImportDataOne2ManyTarget()
class ImportDataReferenceSelection(ModelSQL):
"Import Data Reference Selection"
_name = 'tests.import_data.reference.selection'
_name = 'test.import_data.reference.selection'
_description = __doc__
name = fields.Char('Name')
@@ -177,9 +177,9 @@ ImportDataReferenceSelection()
class ImportDataReference(ModelSQL):
"Import Data Reference"
_name = 'tests.import_data.reference'
_name = 'test.import_data.reference'
reference = fields.Reference('Reference', [
('tests.import_data.reference.selection', 'Test'),
('test.import_data.reference.selection', 'Test'),
])
ImportDataReference()
@@ -4,57 +4,57 @@ this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="tests.import_data.many2one.target"
<record model="test.import_data.many2one.target"
id="import_data_many2one_target_test">
<field name="name">Test</field>
</record>
<record model="tests.import_data.many2one.target"
<record model="test.import_data.many2one.target"
id="import_data_many2one_target_duplicate1">
<field name="name">Duplicate</field>
</record>
<record model="tests.import_data.many2one.target"
<record model="test.import_data.many2one.target"
id="import_data_many2one_target_duplicate2">
<field name="name">Duplicate</field>
</record>
<record model="tests.import_data.many2many.target"
<record model="test.import_data.many2many.target"
id="import_data_many2many_target_test1">
<field name="name">Test 1</field>
</record>
<record model="tests.import_data.many2many.target"
<record model="test.import_data.many2many.target"
id="import_data_many2many_target_test2">
<field name="name">Test 2</field>
</record>
<record model="tests.import_data.many2many.target"
<record model="test.import_data.many2many.target"
id="import_data_many2many_target_test_comma">
<field name="name">Test, comma</field>
</record>
<record model="tests.import_data.many2many.target"
<record model="test.import_data.many2many.target"
id="import_data_many2many_target_duplicate1">
<field name="name">Duplicate</field>
</record>
<record model="tests.import_data.many2many.target"
<record model="test.import_data.many2many.target"
id="import_data_many2many_target_duplicate2">
<field name="name">Duplicate</field>
</record>
<record model="tests.import_data.reference.selection"
<record model="test.import_data.reference.selection"
id="import_data_reference_selection_test">
<field name="name">Test</field>
</record>
<record model="tests.import_data.reference.selection"
<record model="test.import_data.reference.selection"
id="import_data_reference_selection_duplicate1">
<field name="name">Duplicate</field>
</record>
<record model="tests.import_data.reference.selection"
<record model="test.import_data.reference.selection"
id="import_data_reference_selection_duplicate2">
<field name="name">Duplicate</field>
</record>
@@ -5,7 +5,7 @@ from trytond.model import ModelSingleton, ModelSQL, fields
class Singleton(ModelSingleton, ModelSQL):
'Singleton'
_name = 'tests.singleton'
_name = 'test.singleton'
_description = __doc__
name = fields.Char('Name')
@@ -6,15 +6,15 @@ from trytond.model import ModelView, ModelSQL, fields
class MPTT(ModelSQL, ModelView):
'Modified Preorder Tree Traversal'
_name = 'tests.mptt'
_name = 'test.mptt'
_description = __doc__
name = fields.Char('Name', required=True)
sequence = fields.Integer('Sequence')
parent = fields.Many2One('tests.mptt', "Parent", select=1,
parent = fields.Many2One('test.mptt', "Parent", select=1,
left="left", right="right")
left = fields.Integer('Left', required=True, select=1)
right = fields.Integer('Right', required=True, select=1)
childs = fields.One2Many('tests.mptt', 'parent', 'Children')
childs = fields.One2Many('test.mptt', 'parent', 'Children')
active = fields.Boolean('Active')
def __init__(self):
+28 -28
View File
@@ -7,7 +7,7 @@ import datetime
class Boolean(ModelSQL):
'Boolean'
_name = 'tests.boolean'
_name = 'test.boolean'
_description = __doc__
boolean = fields.Boolean(string='Boolean', help='Test boolean',
required=False)
@@ -17,7 +17,7 @@ Boolean()
class BooleanDefault(ModelSQL):
'Boolean Default'
_name = 'tests.boolean_default'
_name = 'test.boolean_default'
_description = __doc__
boolean = fields.Boolean(string='Boolean', help='Test boolean',
required=False)
@@ -30,7 +30,7 @@ BooleanDefault()
class Integer(ModelSQL):
'Integer'
_name = 'tests.integer'
_name = 'test.integer'
_description = __doc__
integer = fields.Integer(string='Integer', help='Test integer',
required=False)
@@ -40,7 +40,7 @@ Integer()
class IntegerDefault(ModelSQL):
'Integer Default'
_name = 'tests.integer_default'
_name = 'test.integer_default'
_description = __doc__
integer = fields.Integer(string='Integer', help='Test integer',
required=False)
@@ -53,7 +53,7 @@ IntegerDefault()
class IntegerRequired(ModelSQL):
'Integer Required'
_name = 'tests.integer_required'
_name = 'test.integer_required'
_description = __doc__
integer = fields.Integer(string='Integer', help='Test integer',
required=True)
@@ -63,7 +63,7 @@ IntegerRequired()
class Float(ModelSQL):
'Float'
_name = 'tests.float'
_name = 'test.float'
_description = __doc__
float = fields.Float(string='Float', help='Test float',
required=False)
@@ -73,7 +73,7 @@ Float()
class FloatDefault(ModelSQL):
'Float Default'
_name = 'tests.float_default'
_name = 'test.float_default'
_description = __doc__
float = fields.Float(string='Float', help='Test float',
required=False)
@@ -86,7 +86,7 @@ FloatDefault()
class FloatRequired(ModelSQL):
'Float Required'
_name = 'tests.float_required'
_name = 'test.float_required'
_description = __doc__
float = fields.Float(string='Float', help='Test float',
required=True)
@@ -96,7 +96,7 @@ FloatRequired()
class Numeric(ModelSQL):
'Numeric'
_name = 'tests.numeric'
_name = 'test.numeric'
_description = __doc__
numeric = fields.Numeric(string='Numeric', help='Test numeric',
required=False)
@@ -106,7 +106,7 @@ Numeric()
class NumericDefault(ModelSQL):
'Numeric Default'
_name = 'tests.numeric_default'
_name = 'test.numeric_default'
_description = __doc__
numeric = fields.Numeric(string='Numeric', help='Test numeric',
required=False)
@@ -119,7 +119,7 @@ NumericDefault()
class NumericRequired(ModelSQL):
'Numeric Required'
_name = 'tests.numeric_required'
_name = 'test.numeric_required'
_description = __doc__
numeric = fields.Numeric(string='Numeric', help='Test numeric',
required=True)
@@ -129,7 +129,7 @@ NumericRequired()
class Char(ModelSQL):
'Char'
_name = 'tests.char'
_name = 'test.char'
_description = __doc__
char = fields.Char(string='Char', size=None, help='Test char',
required=False)
@@ -139,7 +139,7 @@ Char()
class CharDefault(ModelSQL):
'Char Default'
_name = 'tests.char_default'
_name = 'test.char_default'
_description = __doc__
char = fields.Char(string='Char', size=None, help='Test char',
required=False)
@@ -152,7 +152,7 @@ CharDefault()
class CharRequired(ModelSQL):
'Char Required'
_name = 'tests.char_required'
_name = 'test.char_required'
_description = __doc__
char = fields.Char(string='Char', size=None, help='Test char',
required=True)
@@ -162,7 +162,7 @@ CharRequired()
class CharSize(ModelSQL):
'Char Size'
_name = 'tests.char_size'
_name = 'test.char_size'
_description = __doc__
char = fields.Char(string='Char', size=5, help='Test char',
required=False)
@@ -172,7 +172,7 @@ CharSize()
class Text(ModelSQL):
'Text'
_name = 'tests.text'
_name = 'test.text'
_description = __doc__
text = fields.Text(string='Text', size=None, help='Test text',
required=False)
@@ -182,7 +182,7 @@ Text()
class TextDefault(ModelSQL):
'Text Default'
_name = 'tests.text_default'
_name = 'test.text_default'
_description = __doc__
text = fields.Text(string='Text', size=None, help='Test text',
required=False)
@@ -195,7 +195,7 @@ TextDefault()
class TextRequired(ModelSQL):
'Text Required'
_name = 'tests.text_required'
_name = 'test.text_required'
_description = __doc__
text = fields.Text(string='Text', size=None, help='Test text',
required=True)
@@ -205,7 +205,7 @@ TextRequired()
class TextSize(ModelSQL):
'Text Size'
_name = 'tests.text_size'
_name = 'test.text_size'
_description = __doc__
text = fields.Text(string='Text', size=5, help='Test text',
required=False)
@@ -215,7 +215,7 @@ TextSize()
class Sha(ModelSQL):
'Sha'
_name = 'tests.sha'
_name = 'test.sha'
_description = __doc__
sha = fields.Sha(string='Sha', help='Test sha',
required=False)
@@ -225,7 +225,7 @@ Sha()
class ShaDefault(ModelSQL):
'Sha Default'
_name = 'tests.sha_default'
_name = 'test.sha_default'
_description = __doc__
sha = fields.Sha(string='Sha', help='Test sha',
required=False)
@@ -238,7 +238,7 @@ ShaDefault()
class ShaRequired(ModelSQL):
'Sha Required'
_name = 'tests.sha_required'
_name = 'test.sha_required'
_description = __doc__
sha = fields.Sha(string='Sha', help='Test sha',
required=True)
@@ -248,7 +248,7 @@ ShaRequired()
class Date(ModelSQL):
'Date'
_name = 'tests.date'
_name = 'test.date'
_description = __doc__
date = fields.Date(string='Date', help='Test date',
required=False)
@@ -258,7 +258,7 @@ Date()
class DateDefault(ModelSQL):
'Date Default'
_name = 'tests.date_default'
_name = 'test.date_default'
_description = __doc__
date = fields.Date(string='Date', help='Test date',
required=False)
@@ -271,7 +271,7 @@ DateDefault()
class DateRequired(ModelSQL):
'Date Required'
_name = 'tests.date_required'
_name = 'test.date_required'
_description = __doc__
date = fields.Date(string='Date', help='Test date',
required=True)
@@ -281,7 +281,7 @@ DateRequired()
class DateTime(ModelSQL):
'DateTime'
_name = 'tests.datetime'
_name = 'test.datetime'
_description = __doc__
datetime = fields.DateTime(string='DateTime', help='Test datetime',
required=False)
@@ -291,7 +291,7 @@ DateTime()
class DateTimeDefault(ModelSQL):
'DateTime Default'
_name = 'tests.datetime_default'
_name = 'test.datetime_default'
_description = __doc__
datetime = fields.DateTime(string='DateTime', help='Test datetime',
required=False)
@@ -304,7 +304,7 @@ DateTimeDefault()
class DateTimeRequired(ModelSQL):
'DateTime Required'
_name = 'tests.datetime_required'
_name = 'test.datetime_required'
_description = __doc__
datetime = fields.DateTime(string='DateTime', help='Test datetime',
required=True)
-5
View File
@@ -1,7 +1,2 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from tests import *
from model import *
from mptt import *
from import_data import *
File diff suppressed because it is too large Load Diff
+415
View File
@@ -0,0 +1,415 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import logging
logging.basicConfig(level=logging.FATAL)
import unittest
from trytond.tests.test_tryton import POOL, DB, USER, CONTEXT, install_module
class ImportDataTestCase(unittest.TestCase):
'''
Test import_data.
'''
def setUp(self):
install_module('test')
self.boolean = POOL.get('test.import_data.boolean')
self.integer = POOL.get('test.import_data.integer')
self.float = POOL.get('test.import_data.float')
self.numeric = POOL.get('test.import_data.numeric')
self.char = POOL.get('test.import_data.char')
self.text = POOL.get('test.import_data.text')
self.sha = POOL.get('test.import_data.sha')
self.date = POOL.get('test.import_data.date')
self.datetime = POOL.get('test.import_data.datetime')
self.selection = POOL.get('test.import_data.selection')
self.many2one = POOL.get('test.import_data.many2one')
self.many2many = POOL.get('test.import_data.many2many')
self.one2many = POOL.get('test.import_data.one2many')
self.reference = POOL.get('test.import_data.reference')
def test0010boolean(self):
'''
Test boolean.
'''
cursor = DB.cursor()
self.assert_(self.boolean.import_data(cursor, USER, ['boolean'],
[['True']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.boolean.import_data(cursor, USER, ['boolean'],
[['1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.boolean.import_data(cursor, USER, ['boolean'],
[['False']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.boolean.import_data(cursor, USER, ['boolean'],
[['0']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.boolean.import_data(cursor, USER, ['boolean'],
[['']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.boolean.import_data(cursor, USER, ['boolean'],
[['True'], ['False']], CONTEXT) == (2, 0, 0, 0))
self.assert_(self.boolean.import_data(cursor, USER, ['boolean'],
[['foo']], CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0020integer(self):
'''
Test integer.
'''
cursor = DB.cursor()
self.assert_(self.integer.import_data(cursor, USER, ['integer'],
[['1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.integer.import_data(cursor, USER, ['integer'],
[['-1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.integer.import_data(cursor, USER, ['integer'],
[['']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.integer.import_data(cursor, USER, ['integer'],
[['1'], ['2']], CONTEXT) == (2, 0, 0, 0))
self.assert_(self.integer.import_data(cursor, USER, ['integer'],
[['1.1']], CONTEXT)[0] == -1)
self.assert_(self.integer.import_data(cursor, USER, ['integer'],
[['-1.1']], CONTEXT)[0] == -1)
self.assert_(self.integer.import_data(cursor, USER, ['integer'],
[['foo']], CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0030float(self):
'''
Test float.
'''
cursor = DB.cursor()
self.assert_(self.float.import_data(cursor, USER, ['float'], [['1.1']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.float.import_data(cursor, USER, ['float'],
[['-1.1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.float.import_data(cursor, USER, ['float'], [['1']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.float.import_data(cursor, USER, ['float'], [['']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.float.import_data(cursor, USER, ['float'], [['1.1'],
['2.2']], CONTEXT) == (2, 0, 0, 0))
self.assert_(self.float.import_data(cursor, USER, ['float'], [['foo']],
CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0040numeric(self):
'''
Test numeric.
'''
cursor = DB.cursor()
self.assert_(self.numeric.import_data(cursor, USER, ['numeric'],
[['1.1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.numeric.import_data(cursor, USER, ['numeric'],
[['-1.1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.numeric.import_data(cursor, USER, ['numeric'],
[['1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.numeric.import_data(cursor, USER, ['numeric'],
[['']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.numeric.import_data(cursor, USER, ['numeric'],
[['1.1'], ['2.2']], CONTEXT) == (2, 0, 0, 0))
self.assert_(self.numeric.import_data(cursor, USER, ['numeric'],
[['foo']], CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0050char(self):
'''
Test char.
'''
cursor = DB.cursor()
self.assert_(self.char.import_data(cursor, USER, ['char'], [['test']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.char.import_data(cursor, USER, ['char'], [['']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.char.import_data(cursor, USER, ['char'], [['test'],
['foo'], ['bar']], CONTEXT) == (3, 0, 0, 0))
cursor.rollback()
cursor.close()
def test0060text(self):
'''
Test text.
'''
cursor = DB.cursor()
self.assert_(self.text.import_data(cursor, USER, ['text'], [['test']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.text.import_data(cursor, USER, ['text'], [['']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.text.import_data(cursor, USER, ['text'], [['test'],
['foo'], ['bar']], CONTEXT) == (3, 0, 0, 0))
cursor.rollback()
cursor.close()
def test0070sha(self):
'''
Test sha.
'''
cursor = DB.cursor()
self.assert_(self.sha.import_data(cursor, USER, ['sha'], [['test']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.sha.import_data(cursor, USER, ['sha'], [['']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.sha.import_data(cursor, USER, ['sha'], [['test'],
['foo']], CONTEXT) == (2, 0, 0, 0))
cursor.rollback()
cursor.close()
def test0080date(self):
'''
Test date.
'''
cursor = DB.cursor()
self.assert_(self.date.import_data(cursor, USER, ['date'],
[['2010-01-01']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.date.import_data(cursor, USER, ['date'], [['']],
CONTEXT) == (1, 0, 0, 0))
self.assert_(self.date.import_data(cursor, USER, ['date'], [
['2010-01-01'], ['2010-02-01']], CONTEXT) == (2, 0, 0, 0))
self.assert_(self.date.import_data(cursor, USER, ['date'], [['foo']],
CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0090datetime(self):
'''
Test datetime.
'''
cursor = DB.cursor()
self.assert_(self.datetime.import_data(cursor, USER, ['datetime'],
[['2010-01-01 12:00:00']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.datetime.import_data(cursor, USER, ['datetime'],
[['']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.datetime.import_data(cursor, USER, ['datetime'],
[['2010-01-01 12:00:00'], ['2010-01-01 13:30:00']], CONTEXT) == (2,
0, 0, 0))
self.assert_(self.datetime.import_data(cursor, USER, ['datetime'],
[['foo']], CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0100selection(self):
'''
Test selection.
'''
cursor = DB.cursor()
self.assert_(self.selection.import_data(cursor, USER, ['selection'],
[['select1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.selection.import_data(cursor, USER, ['selection'],
[['']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.selection.import_data(cursor, USER, ['selection'],
[['select1'], ['select2']], CONTEXT) == (2, 0, 0, 0))
self.assert_(self.selection.import_data(cursor, USER, ['selection'],
[['foo']], CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0110many2one(self):
'''
Test many2one.
'''
cursor = DB.cursor()
self.assert_(self.many2one.import_data(cursor, USER, ['many2one'],
[['Test']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.many2one.import_data(cursor, USER, ['many2one:id'],
[['test.import_data_many2one_target_test']], CONTEXT) == (1, 0, 0,
0))
self.assert_(self.many2one.import_data(cursor, USER, ['many2one'],
[['']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.many2one.import_data(cursor, USER, ['many2one'],
[['Test'], ['Test']], CONTEXT) == (2, 0, 0, 0))
self.assert_(self.many2one.import_data(cursor, USER, ['many2one'],
[['foo']], CONTEXT)[0] == -1)
self.assert_(self.many2one.import_data(cursor, USER, ['many2one'],
[['Duplicate']], CONTEXT)[0] == -1)
self.assert_(self.many2one.import_data(cursor, USER, ['many2one:id'],
[['foo']], CONTEXT)[0] == -1)
self.assert_(self.many2one.import_data(cursor, USER, ['many2one:id'],
[['test.foo']], CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0120many2many(self):
'''
Test many2many.
'''
cursor = DB.cursor()
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['Test 1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.many2many.import_data(cursor, USER, ['many2many:id'],
[['test.import_data_many2many_target_test1']], CONTEXT) == (1, 0,
0, 0))
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['Test 1,Test 2']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.many2many.import_data(cursor, USER, ['many2many:id'],
[['test.import_data_many2many_target_test1,' \
'test.import_data_many2many_target_test2']], CONTEXT) ==
(1, 0, 0, 0))
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['Test\, comma']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['Test\, comma,Test 1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['Test 1'], ['Test 2']], CONTEXT) == (2, 0, 0, 0))
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['foo']], CONTEXT)[0] == -1)
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['Test 1,foo']], CONTEXT)[0] == -1)
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['Duplicate']], CONTEXT)[0] == -1)
self.assert_(self.many2many.import_data(cursor, USER, ['many2many'],
[['Test 1,Duplicate']], CONTEXT)[0] == -1)
cursor.rollback()
cursor.close()
def test0130one2many(self):
'''
Test one2many.
'''
cursor = DB.cursor()
self.assert_(self.one2many.import_data(cursor, USER, ['name',
'one2many/name'], [['Test', 'Test 1']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.one2many.import_data(cursor, USER, ['name',
'one2many/name'], [['Test', 'Test 1'], ['', 'Test 2']], CONTEXT) ==
(1, 0, 0, 0))
self.assert_(self.one2many.import_data(cursor, USER, ['name',
'one2many/name'], [['Test 1', 'Test 1'], ['', 'Test 2'], ['Test 2',
'Test 1']], CONTEXT) == (2, 0, 0, 0))
cursor.rollback()
cursor.close()
def test0140reference(self):
'''
Test reference.
'''
cursor = DB.cursor()
self.assert_(self.reference.import_data(cursor, USER, ['reference'],
[['test.import_data.reference.selection,Test']], CONTEXT) == (1, 0,
0, 0))
self.assert_(self.reference.import_data(cursor, USER, ['reference:id'],
[['test.import_data.reference.selection,'\
'test.import_data_reference_selection_test']], CONTEXT) ==
(1, 0, 0, 0))
self.assert_(self.reference.import_data(cursor, USER, ['reference'],
[['']], CONTEXT) == (1, 0, 0, 0))
self.assert_(self.reference.import_data(cursor, USER, ['reference'],
[['test.import_data.reference.selection,Test'],
['test.import_data.reference.selection,Test']], CONTEXT) == (2,
0, 0, 0))
self.assert_(self.reference.import_data(cursor, USER, ['reference'],
[['test.import_data.reference.selection,foo']], CONTEXT)[0] == -1)
self.assert_(self.reference.import_data(cursor, USER, ['reference'],
[['test.import_data.reference.selection,Duplicate']], CONTEXT)[0]
== -1)
self.assert_(self.reference.import_data(cursor, USER, ['reference:id'],
[['test.import_data.reference.selection,foo']], CONTEXT)[0] == -1)
self.assert_(self.reference.import_data(cursor, USER, ['reference:id'],
[['test.import_data.reference.selection,test.foo']], CONTEXT)[0] ==
-1)
cursor.rollback()
cursor.close()
def suite():
return unittest.TestLoader().loadTestsFromTestCase(ImportDataTestCase)
if __name__ == '__main__':
suite = suite()
unittest.TextTestRunner(verbosity=2).run(suite)
+155
View File
@@ -0,0 +1,155 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import logging
logging.basicConfig(level=logging.FATAL)
import unittest
from trytond.tests.test_tryton import POOL, DB, USER, CONTEXT, install_module
class ModelSingletonTestCase(unittest.TestCase):
'''
Test ModelSingleton
'''
def setUp(self):
install_module('test')
self.singleton = POOL.get('test.singleton')
def test0010read(self):
'''
Test read method.
'''
cursor = DB.cursor()
singleton = self.singleton.read(cursor, USER, 1, ['name'], CONTEXT)
self.assert_(singleton['name'] == 'test')
self.assert_(singleton['id'] == 1)
singleton = self.singleton.read(cursor, USER, [1], ['name'], CONTEXT)[0]
self.assert_(singleton['name'] == 'test')
self.assert_(singleton['id'] == 1)
cursor.rollback()
cursor.close()
def test0020create(self):
'''
Test create method.
'''
cursor = DB.cursor()
singleton_id = self.singleton.create(cursor, USER, {'name': 'bar'},
CONTEXT)
self.assert_(singleton_id)
singleton = self.singleton.read(cursor, USER, singleton_id, ['name'],
CONTEXT)
self.assert_(singleton['name'] == 'bar')
singleton2_id = self.singleton.create(cursor, USER, {'name': 'foo'},
CONTEXT)
self.assert_(singleton2_id == singleton_id)
singleton = self.singleton.read(cursor, USER, singleton_id, ['name'],
CONTEXT)
self.assert_(singleton['name'] == 'foo')
singleton_ids = self.singleton.search(cursor, USER, [], 0, None, None,
CONTEXT)
self.assert_(len(singleton_ids) == 1)
cursor.rollback()
cursor.close()
def test0030copy(self):
'''
Test copy method.
'''
cursor = DB.cursor()
singleton_id = self.singleton.search(cursor, USER, [], 0, None, None,
CONTEXT)[0]
singleton2_id = self.singleton.copy(cursor, USER, singleton_id, None,
CONTEXT)
self.assert_(singleton2_id == singleton_id)
singleton_ids = self.singleton.search(cursor, USER, [], 0, None, None,
CONTEXT)
self.assert_(len(singleton_ids) == 1)
singleton3_id = self.singleton.copy(cursor, USER, singleton_id,
{'name': 'bar'}, CONTEXT)
self.assert_(singleton3_id == singleton_id)
singleton_ids = self.singleton.search(cursor, USER, [], 0, None, None,
CONTEXT)
self.assert_(len(singleton_ids) == 1)
cursor.rollback()
cursor.close()
def test0040default_get(self):
'''
Test default_get method.
'''
cursor = DB.cursor()
default = self.singleton.default_get(cursor, USER, ['name'], CONTEXT)
self.assert_(default == {'name': 'test'})
default = self.singleton.default_get(cursor, USER, ['create_uid'],
CONTEXT)
self.assert_(len(default) == 2)
default = self.singleton.default_get(cursor, USER, ['create_uid'],
CONTEXT, False)
self.assert_(len(default) == 1)
self.singleton.create(cursor, USER, {'name': 'bar'}, CONTEXT)
default = self.singleton.default_get(cursor, USER, ['name'], CONTEXT)
self.assert_(default == {'name': 'bar'})
default = self.singleton.default_get(cursor, USER, ['create_uid'],
CONTEXT)
self.assert_(len(default) == 2)
default = self.singleton.default_get(cursor, USER, ['create_uid'],
CONTEXT, False)
self.assert_(len(default) == 1)
cursor.rollback()
cursor.close()
def test0050search(self):
'''
Test search method.
'''
cursor = DB.cursor()
singleton_ids = self.singleton.search(cursor, USER, [], 0, None, None,
CONTEXT)
self.assert_(singleton_ids == [1])
singleton_ids = self.singleton.search(cursor, USER, [], 0, 1, None,
CONTEXT)
self.assert_(singleton_ids == [1])
singleton_ids = self.singleton.search(cursor, USER, [], 0, None, None,
CONTEXT, True)
self.assert_(singleton_ids == 1)
cursor.rollback()
cursor.close()
def suite():
return unittest.TestLoader().loadTestsFromTestCase(ModelSingletonTestCase)
if __name__ == '__main__':
suite = suite()
unittest.TextTestRunner(verbosity=2).run(suite)
+224
View File
@@ -0,0 +1,224 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import logging
logging.basicConfig(level=logging.FATAL)
import unittest
from trytond.tests.test_tryton import POOL, DB, USER, CONTEXT, install_module
class MPTTTestCase(unittest.TestCase):
'''
Test Modified Preorder Tree Traversal.
'''
def setUp(self):
install_module('test')
self.mptt = POOL.get('test.mptt')
def CheckTree(self, cursor, parent_id=False, left=0, right=0):
child_ids = self.mptt.search(cursor, USER, [
('parent', '=', parent_id),
], 0, None, None, CONTEXT)
childs = self.mptt.read(cursor, USER, child_ids, ['left', 'right'],
CONTEXT)
childs.sort(lambda x, y: cmp(child_ids.index(x['id']),
child_ids.index(y['id'])))
for child in childs:
assert child['left'] > left, \
'Record (%d): left %d <= parent left %d' % \
(child['id'], child['left'], left)
assert child['left'] < child['right'], \
'Record (%d): left %d >= right %d' % \
(child['id'], child['left'], child['right'])
assert right == 0 or child['right'] < right, \
'Record (%d): right %d >= parent right %d' % \
(child['id'], child['right'], right)
self.CheckTree(cursor, child['id'], left=child['left'],
right=child['right'])
next_left = 0
for child in childs:
assert child['left'] > next_left, \
'Record (%d): left %d <= next left %d' % \
(child['id'], child['left'], next_left)
next_left = child['right']
childs.reverse()
previous_right = 0
for child in childs:
assert previous_right == 0 or child['right'] < previous_right, \
'Record (%d): right %d >= previous right %d' % \
(child['id'] , child['right'], previous_right)
previous_right = child['left']
def ReParent(self, cursor, parent_id=False):
record_ids = self.mptt.search(cursor, USER, [
('parent', '=', parent_id),
], 0, None, None, CONTEXT)
if not record_ids:
return
for record_id in record_ids:
for record2_id in record_ids:
if record_id != record2_id:
self.mptt.write(cursor, USER, record_id, {
'parent': record2_id,
}, CONTEXT)
self.mptt.write(cursor, USER, record_id, {
'parent': parent_id,
}, CONTEXT)
for record_id in record_ids:
self.ReParent(cursor, record_id)
def ReOrder(self, cursor, parent_id=False):
record_ids = self.mptt.search(cursor, USER, [
('parent', '=', parent_id),
], 0, None, None, CONTEXT)
if not record_ids:
return
i = len(record_ids)
for record_id in record_ids:
self.mptt.write(cursor, USER, record_id, {
'sequence': i,
}, CONTEXT)
i -= 1
i = 0
for record_id in record_ids:
self.mptt.write(cursor, USER, record_id, {
'sequence': i,
}, CONTEXT)
i += 1
for record_id in record_ids:
self.ReOrder(cursor, record_id)
record_ids = self.mptt.search(cursor, USER, [], 0, None, None, CONTEXT)
self.mptt.write(cursor, USER, record_ids, {
'sequence': 0,
}, CONTEXT)
def test0010create(self):
'''
Create tree.
'''
cursor = DB.cursor()
new_records = [False]
for j in range(3):
parent_records = new_records
new_records = []
k = 0
for parent_record in parent_records:
for i in range(3):
record_id = self.mptt.create(cursor, USER, {
'name': 'Test %d %d %d' % (j, k, i),
'parent': parent_record,
}, CONTEXT)
new_records.append(record_id)
k += 1
self.CheckTree(cursor)
cursor.commit()
cursor.close()
def test0020reorder(self):
'''
Re-order.
'''
cursor = DB.cursor()
self.ReOrder(cursor)
cursor.rollback()
cursor.close()
def test0030reparent(self):
'''
Re-parent.
'''
cursor = DB.cursor()
self.ReParent(cursor)
cursor.rollback()
cursor.close()
def test0040active(self):
cursor = DB.cursor()
record_ids = self.mptt.search(cursor, USER, [], 0, None, None, CONTEXT)
for record_id in record_ids:
if record_id % 2:
self.mptt.write(cursor, USER, record_id, {
'active': False
}, CONTEXT)
self.CheckTree(cursor)
self.ReParent(cursor)
self.CheckTree(cursor)
self.ReOrder(cursor)
self.CheckTree(cursor)
cursor.rollback()
cursor.close()
cursor = DB.cursor()
record_ids = self.mptt.search(cursor, USER, [], 0, None, None, CONTEXT)
self.mptt.write(cursor, USER, record_ids[:len(record_ids)/2], {
'active': False
}, CONTEXT)
self.CheckTree(cursor)
cursor.rollback()
cursor.close()
cursor = DB.cursor()
record_ids = self.mptt.search(cursor, USER, [], 0, None, None, CONTEXT)
self.mptt.write(cursor, USER, record_ids, {
'active': False
}, CONTEXT)
self.ReParent(cursor)
self.CheckTree(cursor)
self.ReOrder(cursor)
self.CheckTree(cursor)
cursor.rollback()
cursor.close()
def test0050delete(self):
'''
Delete.
'''
cursor = DB.cursor()
record_ids = self.mptt.search(cursor, USER, [], 0, None, None, CONTEXT)
for record_id in record_ids:
if record_id % 2:
self.mptt.delete(cursor, USER, record_id, CONTEXT)
self.CheckTree(cursor)
cursor.rollback()
cursor.close()
cursor = DB.cursor()
record_ids = self.mptt.search(cursor, USER, [], 0, None, None, CONTEXT)
self.mptt.delete(cursor, USER, record_ids[:len(record_ids)/2], CONTEXT)
self.CheckTree(cursor)
cursor.rollback()
cursor.close()
cursor = DB.cursor()
record_ids = self.mptt.search(cursor, USER, [], 0, None, None, CONTEXT)
self.mptt.delete(cursor, USER, record_ids, CONTEXT)
self.CheckTree(cursor)
cursor.rollback()
cursor.close()
def suite():
return unittest.TestLoader().loadTestsFromTestCase(MPTTTestCase)
if __name__ == '__main__':
suite = suite()
unittest.TextTestRunner(verbosity=2).run(suite)
+545
View File
@@ -0,0 +1,545 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import unittest
import datetime
from trytond import pyson
class PYSONTestCase(unittest.TestCase):
'''
Test PySON.
'''
def test0010Eval(self):
'''
Test pyson.Eval
'''
self.assert_(pyson.Eval('test').pyson() == {
'__class__': 'Eval',
'v': 'test',
'd': '',
})
self.assert_(pyson.Eval('test', 'foo').pyson() == {
'__class__': 'Eval',
'v': 'test',
'd': 'foo',
})
self.assert_(pyson.Eval('test', 'foo').types() == set([type('foo')]))
self.assert_(pyson.Eval('test', 1).types() == set([type(1)]))
eval = pyson.PYSONEncoder().encode(pyson.Eval('test', 0))
self.assert_(pyson.PYSONDecoder({'test': 1}).decode(eval) == 1)
self.assert_(pyson.PYSONDecoder().decode(eval) == 0)
def test0020Not(self):
'''
Test pyson.Not
'''
self.assert_(pyson.Not(True).pyson() == {
'__class__': 'Not',
'v': True,
})
self.assertRaises(AssertionError, pyson.Not, 'foo')
self.assert_(pyson.Not(True).types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.Not(True))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Not(False))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
def test0030Bool(self):
'''
Test pyson.Bool
'''
self.assert_(pyson.Bool('test').pyson() == {
'__class__': 'Bool',
'v': 'test',
})
self.assert_(pyson.Bool('test').types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.Bool(True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Bool(False))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Bool('test'))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Bool(''))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Bool(1))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Bool(0))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Bool(['test']))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Bool([]))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Bool({'foo': 'bar'}))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Bool({}))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
def test0040And(self):
'''
Test pyson.And
'''
self.assert_(pyson.And(True, False).pyson() == {
'__class__': 'And',
's': (True, False),
})
self.assertRaises(AssertionError, pyson.And, 'test', False)
self.assertRaises(AssertionError, pyson.And, True, 'test')
self.assertRaises(AssertionError, pyson.And, True, False, 'test')
self.assertRaises(AssertionError, pyson.And, True)
self.assertRaises(AssertionError, pyson.And)
self.assert_(pyson.And(True, False).types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.And(True, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.And(True, True, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.And(True, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.And(False, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.And(False, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.And(False, False, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.And(True, False, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.And(False, True, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.And(False, False, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
def test0050Or(self):
'''
Test pyson.Or
'''
self.assert_(pyson.Or(True, False).pyson() == {
'__class__': 'Or',
's': (True, False),
})
self.assertRaises(AssertionError, pyson.Or, 'test', False)
self.assertRaises(AssertionError, pyson.Or, True, 'test')
self.assertRaises(AssertionError, pyson.Or, True, False, 'test')
self.assertRaises(AssertionError, pyson.Or, True)
self.assertRaises(AssertionError, pyson.Or)
self.assert_(pyson.Or(True, False).types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.Or(True, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Or(True, True, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Or(True, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Or(False, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Or(False, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Or(False, False, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Or(True, False, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Or(False, True, False))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Or(False, False, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
def test0060Equal(self):
'''
Test pyson.Equal
'''
self.assert_(pyson.Equal('test', 'test').pyson() == {
'__class__': 'Equal',
's1': 'test',
's2': 'test',
})
self.assertRaises(AssertionError, pyson.Equal, 'test', True)
self.assert_(pyson.Equal('test', 'test').types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.Equal('test', 'test'))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Equal('foo', 'bar'))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
def test0070Greater(self):
'''
Test pyson.Greater
'''
self.assert_(pyson.Greater(1, 0).pyson() == {
'__class__': 'Greater',
's1': 1,
's2': 0,
'e': False,
})
self.assertRaises(AssertionError, pyson.Greater, 'test', 0)
self.assertRaises(AssertionError, pyson.Greater, 1, 'test')
self.assertRaises(AssertionError, pyson.Greater, 1, 0, 'test')
self.assert_(pyson.Greater(1, 0).types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 0))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Greater(0, 1))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 0, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Greater(0, 1, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 1))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 1, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
def test0080Less(self):
'''
Test pyson.Less
'''
self.assert_(pyson.Less(0, 1).pyson() == {
'__class__': 'Less',
's1': 0,
's2': 1,
'e': False,
})
self.assertRaises(AssertionError, pyson.Less, 'test', 1)
self.assertRaises(AssertionError, pyson.Less, 0, 'test')
self.assertRaises(AssertionError, pyson.Less, 0, 1, 'test')
self.assert_(pyson.Less(0, 1).types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.Less(0, 1))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Less(1, 0))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Less(0, 1, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.Less(1, 0, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Less(1, 1))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.Less(1, 1, True))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
def test0090If(self):
'''
Test pyson.If
'''
self.assert_(pyson.If(True, 'foo', 'bar').pyson() == {
'__class__': 'If',
'c': True,
't': 'foo',
'e': 'bar',
})
self.assertRaises(AssertionError, pyson.If, 'test', 'foo', 'bar')
self.assertRaises(AssertionError, pyson.If, True, 'foo', False)
self.assert_(pyson.If(True, 'foo', 'bar').types() == set([type('foo')]))
self.assert_(pyson.If(True, False, True).types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.If(True, 'foo', 'bar'))
self.assert_(pyson.PYSONDecoder().decode(eval) == 'foo')
eval = pyson.PYSONEncoder().encode(pyson.If(False, 'foo', 'bar'))
self.assert_(pyson.PYSONDecoder().decode(eval) == 'bar')
def test0100Get(self):
'''
Test pyson.Get
'''
self.assert_(pyson.Get({'foo': 'bar'}, 'foo', 'default').pyson() == {
'__class__': 'Get',
'v': {'foo': 'bar'},
'k': 'foo',
'd': 'default',
})
self.assertRaises(AssertionError, pyson.Get, 'test', 'foo', 'default')
self.assertRaises(AssertionError, pyson.Get, {}, 1, 'default')
self.assert_(pyson.Get({}, 'foo', 'default').types() == set([str]))
self.assert_(pyson.Get({}, 'foo', True).types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.Get(
{'foo': 'bar'}, 'foo', 'default'))
self.assert_(pyson.PYSONDecoder().decode(eval) == 'bar')
eval = pyson.PYSONEncoder().encode(pyson.Get(
{'foo': 'bar'}, 'test', 'default'))
self.assert_(pyson.PYSONDecoder().decode(eval) == 'default')
eval = pyson.PYSONEncoder().encode(pyson.Get(
{}, 'foo', 'default'))
self.assert_(pyson.PYSONDecoder().decode(eval) == 'default')
def test0110In(self):
'''
Test pyson.In
'''
self.assert_(pyson.In('foo', {'foo': 'bar'}).pyson() == {
'__class__': 'In',
'k': 'foo',
'v': {'foo': 'bar'},
})
self.assertRaises(AssertionError, pyson.In, object(), {})
self.assertRaises(AssertionError, pyson.In, 'test', 'foo')
self.assert_(pyson.In('foo', {}).types() == set([bool]))
eval = pyson.PYSONEncoder().encode(pyson.In('foo', {'foo': 'bar'}))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.In('1', {1: 'bar'}))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.In('test', {'foo': 'bar'}))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.In('1', {2: 'bar'}))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.In('test', {}))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.In('foo', ['foo']))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.In(1, [1]))
self.assert_(pyson.PYSONDecoder().decode(eval) == True)
eval = pyson.PYSONEncoder().encode(pyson.In('test', ['foo']))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.In(1, [2]))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
eval = pyson.PYSONEncoder().encode(pyson.In('test', []))
self.assert_(pyson.PYSONDecoder().decode(eval) == False)
def test0120Date(self):
'''
Test pyson.Date
'''
self.assert_(pyson.Date(2010, 1, 12, -1, 12, -7).pyson() == {
'__class__': 'Date',
'y': 2010,
'M': 1,
'd': 12,
'dy': -1,
'dM': 12,
'dd': -7
})
self.assertRaises(AssertionError, pyson.Date, 'test', 1, 12, -1, 12,
-7)
self.assertRaises(AssertionError, pyson.Date, 2010, 'test', 12, -1, 12,
-7)
self.assertRaises(AssertionError, pyson.Date, 2010, 1, 'test', -1, 12,
-7)
self.assertRaises(AssertionError, pyson.Date, 2010, 1, 12, 'test', 12,
-7)
self.assertRaises(AssertionError, pyson.Date, 2010, 1, 12, -1, 'test',
-7)
self.assertRaises(AssertionError, pyson.Date, 2010, 1, 12, -1, 12,
'test')
self.assert_(pyson.Date(2010, 1, 12, -1, 12, -7).types()
== set([datetime.date]))
eval = pyson.PYSONEncoder().encode(pyson.Date())
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.date.today())
eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.date(2010, 1, 12))
eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, -1))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.date(2009, 1, 12))
eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, 0, 12))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.date(2011, 1, 12))
eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, 0, 0, -7))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.date(2010, 1, 5))
eval = pyson.PYSONEncoder().encode(datetime.date(2010, 2, 22))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.date(2010, 2, 22))
def test0130DateTime(self):
'''
Test pyson.DateTime
'''
self.assert_(pyson.DateTime(2010, 1, 12, 10, 30, 20, 0,
-1, 12, -7, 2, 15, 30, 1).pyson() == {
'__class__': 'DateTime',
'y': 2010,
'M': 1,
'd': 12,
'h': 10,
'm': 30,
's': 20,
'ms': 0,
'dy': -1,
'dM': 12,
'dd': -7,
'dh': 2,
'dm': 15,
'ds': 30,
'dms': 1,
})
self.assertRaises(AssertionError, pyson.DateTime, 'test', 1, 12, 10,
30, 20, 0, -1, 12, -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 'test', 12, 10,
30, 20, 0, -1, 12, -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 'test', 10,
30, 20, 0, -1, 12, -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 'test',
30, 20, 0, -1, 12, -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10,
'test', 20, 0, -1, 12, -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
'test', 0, -1, 12, -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
20, 'test', -1, 12, -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
20, 0, 'test', 12, -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
20, 0, -1, 'test', -7, 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
20, 0, -1, 12, 'test', 2, 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
20, 0, -1, 12, -7, 'test', 15, 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
20, 0, -1, 12, -7, 2, 'test', 30, 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
20, 0, -1, 12, -7, 2, 15, 'test', 1)
self.assertRaises(AssertionError, pyson.DateTime, 2010, 1, 12, 10, 30,
20, 0, -1, 12, -7, 2, 15, 30, 'test')
self.assert_(pyson.DateTime(2010, 1, 12, 10, 30, 20, 0,
-1, 12, -7, 2, 15, 30, 1).types() == set([datetime.datetime]))
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
10, 30, 20, 0))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2010, 1, 12, 10, 30, 20, 0))
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
10, 30, 20, 0, -1))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2009, 1, 12, 10, 30, 20, 0))
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
10, 30, 20, 0, 0, 12))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2011, 1, 12, 10, 30, 20, 0))
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
10, 30, 20, 0, 0, 0, -7))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2010, 1, 5, 10, 30, 20, 0))
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
10, 30, 20, 0, 0, 0, 0, 12))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2010, 1, 12, 22, 30, 20, 0))
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
10, 30, 20, 0, 0, 0, 0, 0, -30))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2010, 1, 12, 10, 0, 20, 0))
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
10, 30, 20, 0, 0, 0, 0, 0, 0, 30))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2010, 1, 12, 10, 30, 50, 0))
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
10, 30, 20, 0, 0, 0, 0, 0, 0, 0, 200))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2010, 1, 12, 10, 30, 20, 200))
eval = pyson.PYSONEncoder().encode(datetime.datetime(
2010, 2, 22, 10, 30, 20, 200))
self.assert_(pyson.PYSONDecoder().decode(eval)
== datetime.datetime(2010, 2, 22, 10, 30, 20, 200))
def test0900Composite(self):
'''
Test Composite
'''
eval = pyson.PYSONEncoder().encode(['id', pyson.If(pyson.Not(
pyson.In('company', pyson.Eval('context', {}))), '=', '!='),
pyson.Get(pyson.Eval('context', {}), 'company', 0)])
self.assert_(pyson.PYSONDecoder({'context': {'company': 1}}
).decode(eval) == ['id', '!=', 1])
self.assert_(pyson.PYSONDecoder({'context': {}}
).decode(eval) == ['id', '=', 0])
def suite():
return unittest.TestLoader().loadTestsFromTestCase(PYSONTestCase)
if __name__ == '__main__':
suite = suite()
unittest.TextTestRunner(verbosity=2).run(suite)
+102
View File
@@ -0,0 +1,102 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import unittest
import datetime
from trytond.tools import reduce_ids, safe_eval, datetime_strftime
class ToolsTestCase(unittest.TestCase):
'''
Test tools.
'''
def test0000reduce_ids_empty(self):
'''
Test reduce_ids empty list.
'''
self.assert_(('(%s)', [False]) == reduce_ids('id', []))
def test0010reduce_ids_continue(self):
'''
Test reduce_ids continue list.
'''
self.assert_(('(((id >= %s) AND (id <= %s)))', [0, 9]) == \
reduce_ids('id', range(10)))
def test0020reduce_ids_one_hole(self):
'''
Test reduce_ids continue list with one hole.
'''
self.assert_(('(((id >= %s) AND (id <= %s)) OR ' \
'((id >= %s) AND (id <= %s)))', [0, 9, 20, 29]) == \
reduce_ids('id', range(10) + map(lambda x: x + 20, range(10))))
def test0030reduce_ids_short_continue(self):
'''
Test reduce_ids short continue list.
'''
self.assert_(('((id IN (%s,%s,%s,%s)))', [0, 1, 2, 3]) == \
reduce_ids('id', range(4)))
def test0040reduce_ids_complex(self):
'''
Test reduce_ids complex list.
'''
self.assert_(('(((id >= %s) AND (id <= %s)) OR ' \
'(id IN (%s,%s,%s,%s,%s)))', [0, 14, 25, 26, 27, 28, 29]) == \
reduce_ids('id', range(10) + map(lambda x: x + 25, range(5)) + \
map(lambda x: x + 5, range(10))))
def test0050reduce_ids_complex_small_continue(self):
'''
Test reduce_ids complex list with small continue.
'''
self.assert_(('(((id >= %s) AND (id <= %s)) OR (id IN (%s,%s,%s,%s)))',
[1, 12, 15, 18, 19, 21]) == \
reduce_ids('id', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15,
18, 19, 21]))
def test0060safe_eval_builtin(self):
'''
Attempt to access a unsafe builtin.
'''
self.assertRaises(Exception, safe_eval, "open('test.txt', 'w')")
def test0061safe_eval_getattr(self):
'''
Attempt to get arround direct attr access.
'''
self.assertRaises(Exception, safe_eval, "getattr(int, '__abs__')")
def test0062safe_eval_func_globals(self):
'''
Attempt to access global enviroment where fun was defined.
'''
self.assertRaises(Exception, safe_eval,
"def x(): pass; print x.func_globals")
def test0063safe_eval_lowlevel(self):
'''
Lowlevel tricks to access 'object'.
'''
self.assertRaises(Exception, safe_eval,
"().__class__.mro()[1].__subclasses__()")
def test0070datetime_strftime(self):
'''
Test datetime_strftime
'''
self.assert_(datetime_strftime(datetime.date(2005, 3, 2),
'%Y-%m-%d'), '2005-03-02')
self.assert_(datetime_strftime(datetime.date(1805, 3, 2),
'%Y-%m-%d'), '1805-03-02')
def suite():
return unittest.TestLoader().loadTestsFromTestCase(ToolsTestCase)
if __name__ == '__main__':
suite = suite()
unittest.TextTestRunner(verbosity=2).run(suite)
+159 -3262
View File
File diff suppressed because it is too large Load Diff
+8 -2
View File
@@ -404,6 +404,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
self.fs2db = Fs2bdAccessor(cursor, self.user, self.modeldata_obj, pool)
self.to_delete = self.populate_to_delete()
self.noupdate = None
self.skip_data = False
# Tag handlders are used to delegate the processing
self.taghandlerlist = {
@@ -453,6 +454,11 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
elif name == "data":
self.noupdate = bool(int(attributes.get("noupdate", '0')))
if self.pool.test and \
bool(int(attributes.get("skiptest", '0'))):
self.skip_data = True
else:
self.skip_data = False
elif name == "tryton":
pass
@@ -461,7 +467,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
logging.getLogger("convert").info( "Tag %s not supported" %
name)
return
else:
elif not self.skip_data:
self.taghandler.startElement(name, attributes)
def characters(self, data):
@@ -472,7 +478,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
# Closing tag found, if we are in a delegation the handler
# know what to do:
if self.taghandler:
if self.taghandler and not self.skip_data:
self.taghandler = self.taghandler.endElement(name)
def current_state(self):
+1 -1
View File
@@ -94,7 +94,7 @@ def file_open(name, mode="r", subdir='modules'):
or name.startswith('workflow' + os.sep) \
or name.startswith('res' + os.sep) \
or name.startswith('webdav' + os.sep) \
or name.startswith('tests' + os.sep)):
or name.startswith('test' + os.sep)):
name = os.path.join(root_path, name)
else:
name = os.path.join(root_path, subdir, name)