diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 7d0c016..d9581ca 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,8 +1,8 @@ dev: - DB service little bit refactored. added methods: - - dump_db: wrapper around ``db.dump`` server method. automaticaly performs base64 decoding - - restore_db: wrapper around ``db.restore`` server methods. automaticaly base64 encode file before sending + - dump_db: wrapper around ``db.dump`` server method. + - restore_db: wrapper around ``db.restore`` server methods. 0.6: - *Backward incompatible*: Changed session file format. diff --git a/examples/Examples & HTML tests.ipynb b/examples/Examples & HTML tests.ipynb index 74abf59..5b7a511 100644 --- a/examples/Examples & HTML tests.ipynb +++ b/examples/Examples & HTML tests.ipynb @@ -1029,7 +1029,7 @@ "}\n", "\n", "# Display as table.\n", - "# Note that prefetch method is used to fetch some set of fields via one RPC call.\n", + "# Note that prefetch method is used to fetch some set of fields with less RPC call.\n", "# on big datasets it may speed up performance signifiantly.\n", "# Each RecordList instance have related cache, which reduce need of reading data on each field get.\n", "so_list.prefetch('id', 'name', 'partner_id', 'partner_id.email', 'state')\n", diff --git a/openerp_proxy/core.py b/openerp_proxy/core.py index 9aea12f..176b50b 100644 --- a/openerp_proxy/core.py +++ b/openerp_proxy/core.py @@ -183,7 +183,7 @@ def user(self): def server_version(self): """ Server version - :rtype: str + (Already parsed with pkg_resources.parse_version) """ return self.services.db.server_version() diff --git a/openerp_proxy/service/db.py b/openerp_proxy/service/db.py index 0b8e8ee..d096280 100644 --- a/openerp_proxy/service/db.py +++ b/openerp_proxy/service/db.py @@ -1,9 +1,8 @@ import six import time -import base64 from pkg_resources import parse_version -from openerp_proxy.service.service import ServiceBase +from ..service.service import ServiceBase __all__ = ('DBService',) @@ -85,45 +84,38 @@ def dump_db(self, password, db, **kwargs): :param str password: super admin password :param str|Client db: name of database or *Client* instance with *client.dbname is not None* name secified - :param str fpath: path to file to save dbdump in (default: None) :param str format: (only odoo 9.0) (default: zip) :raise: `ValueError` (unsupported value of *db* argument) :return: bytestring with laready base64 decoded data :rtype: bytes """ - fpath = kwargs.get('fpath', None) - # format argument available only for odoo version 9.0 if self.server_version() >= parse_version('9.0'): args = [kwargs.get('format', 'zip')] else: args = [] - dump_data = self.dump(password, to_dbname(db), *args) - dump_data = base64.b64decode(dump_data.encode()) - if fpath: - with open(fpath, 'wb') as f: - f.write(dump_data) + dump_data = self.dump(password, to_dbname(db), *args).encode() return dump_data - def restore_db(self, password, dbname, fpath, **kwargs): + def restore_db(self, password, dbname, data, **kwargs): """ Restore database :param str password: super admin password :param str dbname: name of database - :param str fpath: path to file that contains dbdump + :param bytes data: restore data (base64 encoded string) :param bool copy: (only odoo 8.0)if set to True, then new dbuid will be generated. (default: False) :return: True :rtype: bool """ - with open(fpath, 'rb') as f: - if self.server_version() >= parse_version('8.0') and 'copy' in kwargs: - args = [kwargs['copy']] - else: - args = [] - data = base64.b64encode(f.read()).decode() - return self.restore(password, dbname, data, *args) + assert isinstance(data, bytes), "data must be instance of bytes" + if self.server_version() >= parse_version('8.0') and 'copy' in kwargs: + args = [kwargs['copy']] + else: + args = [] + + return self.restore(password, dbname, data.decode(), *args) def server_version(self): """ Returns server version. diff --git a/openerp_proxy/tests/__init__.py b/openerp_proxy/tests/__init__.py index 6d91fb3..054b51e 100644 --- a/openerp_proxy/tests/__init__.py +++ b/openerp_proxy/tests/__init__.py @@ -27,6 +27,7 @@ def setUp(self): import openerp_proxy.ext.all self.test_db_service = os.environ.get('TEST_DB_SERVICE', False) + self.recreate_db = os.environ.get('RECREATE_DB', False) if six.PY3: def assertItemsEqual(self, *args, **kwargs): diff --git a/openerp_proxy/tests/ext/__init__.py b/openerp_proxy/tests/ext/__init__.py index cc17931..9ea2314 100644 --- a/openerp_proxy/tests/ext/__init__.py +++ b/openerp_proxy/tests/ext/__init__.py @@ -3,6 +3,8 @@ #import os #from openerp_proxy.tests.test_sugar import * ##from openerp_proxy.tests import BaseTestCase +#from .. import BaseTestCase +#from ... import Client ##@unittest.skipUnless(os.environ.get('TEST_WITH_EXTENSIONS', False), 'requires tests enabled') diff --git a/openerp_proxy/tests/ext/test_sugar.py b/openerp_proxy/tests/ext/test_sugar.py index 716152d..ba8e0d3 100644 --- a/openerp_proxy/tests/ext/test_sugar.py +++ b/openerp_proxy/tests/ext/test_sugar.py @@ -6,11 +6,11 @@ except ImportError: import mock -from openerp_proxy.tests import BaseTestCase -from openerp_proxy.core import Client -from openerp_proxy.orm.record import (Record, - RecordList) -from openerp_proxy.orm.object import Object +from .. import BaseTestCase +from ... import Client +from ...orm import (Record, + RecordList, + Object) @unittest.skipUnless(os.environ.get('TEST_WITH_EXTENSIONS', False), 'requires extensions enabled') diff --git a/openerp_proxy/tests/ext/test_workflow.py b/openerp_proxy/tests/ext/test_workflow.py index f345c3b..514d442 100644 --- a/openerp_proxy/tests/ext/test_workflow.py +++ b/openerp_proxy/tests/ext/test_workflow.py @@ -6,10 +6,10 @@ except ImportError: import mock -from openerp_proxy.tests import BaseTestCase -from openerp_proxy.core import Client -from openerp_proxy.orm.record import (Record, - RecordList) +from ...tests import BaseTestCase +from ... import Client +from ...orm import (Record, + RecordList) @unittest.skipUnless(os.environ.get('TEST_WITH_EXTENSIONS', False), 'requires extensions enabled') diff --git a/openerp_proxy/tests/test_client.py b/openerp_proxy/tests/test_client.py index e6874b7..ba906df 100644 --- a/openerp_proxy/tests/test_client.py +++ b/openerp_proxy/tests/test_client.py @@ -1,11 +1,11 @@ from pkg_resources import parse_version from . import BaseTestCase -from openerp_proxy.core import Client -from openerp_proxy.orm.object import Object -from openerp_proxy.orm.record import Record -from openerp_proxy.service.service import ServiceManager -from openerp_proxy.plugin import Plugin +from ..core import Client +from ..orm.object import Object +from ..orm.record import Record +from ..service.service import ServiceManager +from ..plugin import Plugin class Test_10_Client(BaseTestCase): diff --git a/openerp_proxy/tests/test_connection.py b/openerp_proxy/tests/test_connection.py index cef40d6..ae39a05 100644 --- a/openerp_proxy/tests/test_connection.py +++ b/openerp_proxy/tests/test_connection.py @@ -1,7 +1,7 @@ from . import BaseTestCase -from openerp_proxy.core import Client -from openerp_proxy.exceptions import LoginException -from openerp_proxy.connection import get_connector_names +from ..core import Client +from ..exceptions import LoginException +from ..connection import get_connector_names class Test_00_Connection(BaseTestCase): @@ -27,7 +27,11 @@ def test_01_create_db(self): client = self.client if self.env.dbname in client.services.db.list_db(): self.assertIn(self.env.dbname, client.services.db) - return self.skipTest("Database already created") + + if self.recreate_db: + client.services.db.drop_db(self.env.super_password, self.env.dbname) + else: + return self.skipTest("Database already created") self.assertNotIn(self.env.dbname, client.services.db) diff --git a/openerp_proxy/tests/test_db.py b/openerp_proxy/tests/test_db.py index 6c48296..c8556db 100644 --- a/openerp_proxy/tests/test_db.py +++ b/openerp_proxy/tests/test_db.py @@ -1,5 +1,5 @@ from . import BaseTestCase -from openerp_proxy.core import Client +from ..core import Client import os @@ -16,19 +16,13 @@ def setUp(self): self.client = Client(self.env.host, protocol=self.env.protocol, port=self.env.port) def test_00_dump_drop_restore(self): - fpath = 'tmp-db-dump.backup' - # create database if it was not created yet if self.env.dbname not in self.client.services.db.list_db(): self.client.services.db.create_db(self.env.super_password, self.env.dbname, demo=True, admin_password=self.env.password) # dump db - dump_data = self.client.services.db.dump_db(self.env.super_password, self.env.dbname, fpath=fpath) - self.assertTrue(os.path.exists(fpath)) - - # test that rturned data and data written to file are the same - with open(fpath, 'rb') as f: - self.assertEqual(f.read(), dump_data) + dump_data = self.client.services.db.dump_db(self.env.super_password, self.env.dbname) + self.assertIsInstance(dump_data, bytes) # drop it self.client.services.db.drop_db(self.env.super_password, self.env.dbname) @@ -36,7 +30,7 @@ def test_00_dump_drop_restore(self): # and try to restore it #time.sleep(1) - self.client.services.db.restore_db(self.env.super_password, self.env.dbname, fpath) + self.client.services.db.restore_db(self.env.super_password, self.env.dbname, dump_data) self.assertIn(self.env.dbname, self.client.services.db) # check if objects were restored @@ -44,5 +38,3 @@ def test_00_dump_drop_restore(self): cl = self.client.login(self.env.dbname, self.env.user, self.env.password) self.assertIsNotNone(cl.uid) self.assertIsNotNone(cl.user) - - os.unlink(fpath) diff --git a/openerp_proxy/tests/test_orm.py b/openerp_proxy/tests/test_orm.py index 563ecfa..3783c32 100644 --- a/openerp_proxy/tests/test_orm.py +++ b/openerp_proxy/tests/test_orm.py @@ -1,11 +1,11 @@ from . import BaseTestCase -from openerp_proxy.core import Client -from openerp_proxy.orm.record import (Record, - RecordList, - get_record_list) -from openerp_proxy.orm.cache import (empty_cache, - ObjectCache) -from openerp_proxy.exceptions import ConnectorError +from ..core import Client +from ..orm.record import (Record, + RecordList, + get_record_list) +from ..orm.cache import (empty_cache, + ObjectCache) +from ..exceptions import ConnectorError try: import unittest.mock as mock diff --git a/openerp_proxy/tests/test_plugins.py b/openerp_proxy/tests/test_plugins.py index af2d59a..c44f244 100644 --- a/openerp_proxy/tests/test_plugins.py +++ b/openerp_proxy/tests/test_plugins.py @@ -1,8 +1,6 @@ from . import BaseTestCase -from openerp_proxy.core import Client -from openerp_proxy.orm.record import Record -from openerp_proxy.orm.record import RecordList -from openerp_proxy.exceptions import ConnectorError +from .. import Client +from ..orm import Record import unittest @@ -11,9 +9,6 @@ except ImportError: import mock -import numbers -import collections - class Test_25_Plugin_ModuleUtils(BaseTestCase): diff --git a/openerp_proxy/tests/test_session.py b/openerp_proxy/tests/test_session.py index 9ad7ff6..e5d6442 100644 --- a/openerp_proxy/tests/test_session.py +++ b/openerp_proxy/tests/test_session.py @@ -1,6 +1,6 @@ from . import BaseTestCase -from openerp_proxy.core import Client -from openerp_proxy.session import Session +from .. import (Client, + Session) try: import unittest.mock as mock diff --git a/run_tests.bash b/run_tests.bash index f26eb01..490119d 100755 --- a/run_tests.bash +++ b/run_tests.bash @@ -15,7 +15,7 @@ SCRIPTPATH=`dirname "$SCRIPT"` # directory that contains this script usage=" Usage: - run_tests.bash [--py-version v1] [--py-version v2] [--with-extensions] [--with-db] [--test-module ] + run_tests.bash [--py-version v1] [--py-version v2] [--with-extensions] [--with-db] [--recreate-db] [--test-module ] " @@ -39,6 +39,9 @@ do --with-db) export TEST_DB_SERVICE=1; ;; + --recreate-db) + export RECREATE_DB=1; + ;; --test-module) TEST_MODULE="$2"; shift;