From 25896a018ff73d77e4f47e6d2c82a13ec792c6f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 28 Feb 2016 20:51:18 +0100 Subject: [PATCH] Add Python3 support issue3211 --- .drone.yml | 4 ++-- CHANGELOG | 1 + account.py | 6 ++++- invoice.odt | Bin 16137 -> 16064 bytes party.py | 2 +- setup.py | 21 +++++++++++++++--- tests/scenario_invoice.rst | 2 +- tests/scenario_invoice_alternate_currency.rst | 2 +- tests/scenario_invoice_supplier.rst | 2 +- tests/test_account_invoice.py | 10 ++++++--- tox.ini | 4 ++-- 11 files changed, 39 insertions(+), 15 deletions(-) diff --git a/.drone.yml b/.drone.yml index 9d7c769d8c..c4fd423e94 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,9 +1,9 @@ -image: python2.7 +image: python:all env: - POSTGRESQL_URI=postgresql://postgres@127.0.0.1:5432/ - MYSQL_URI=mysql://root@127.0.0.1:3306/ script: - pip install tox - - tox -e "py27-{sqlite,postgresql}" + - tox -e "{py27,py33,py34,py35}-{sqlite,postgresql}" --skip-missing-interpreters services: - postgres diff --git a/CHANGELOG b/CHANGELOG index b25366964e..f085a6733f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add Python3 support * Change payment term percentage into ratio Version 3.8.0 - 2015-11-02 diff --git a/account.py b/account.py index 954fe53deb..995e03c9d6 100644 --- a/account.py +++ b/account.py @@ -10,7 +10,6 @@ from trytond.transaction import Transaction __all__ = ['Configuration', 'ConfigurationTaxRounding', 'FiscalYear', 'Period', 'Move', 'Reconciliation'] -__metaclass__ = PoolMeta tax_roundings = [ ('document', 'Per Document'), @@ -19,6 +18,7 @@ tax_roundings = [ class Configuration: + __metaclass__ = PoolMeta __name__ = 'account.configuration' tax_rounding = fields.Function(fields.Selection(tax_roundings, 'Tax Rounding'), 'on_change_with_tax_rounding') @@ -68,6 +68,7 @@ class ConfigurationTaxRounding(ModelSQL, ModelView, MatchMixin): class FiscalYear: + __metaclass__ = PoolMeta __name__ = 'account.fiscalyear' out_invoice_sequence = fields.Many2One('ir.sequence.strict', 'Customer Invoice Sequence', required=True, @@ -182,6 +183,7 @@ class FiscalYear: class Period: + __metaclass__ = PoolMeta __name__ = 'account.period' out_invoice_sequence = fields.Many2One('ir.sequence.strict', 'Customer Invoice Sequence', @@ -303,6 +305,7 @@ class Period: class Move: + __metaclass__ = PoolMeta __name__ = 'account.move' @classmethod @@ -311,6 +314,7 @@ class Move: class Reconciliation: + __metaclass__ = PoolMeta __name__ = 'account.move.reconciliation' @classmethod diff --git a/invoice.odt b/invoice.odt index 308bf8853ce7476b1ed71e00220a536ff2fe5b5f..f24dce3c02723c6ec2430297f6f31f47ff650618 100644 GIT binary patch delta 4078 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 delta 4149 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 QLWODHoIeDv^5@L|1JBG~kN^Mx diff --git a/party.py b/party.py index 769f51406a..c9dba11a9b 100644 --- a/party.py +++ b/party.py @@ -4,10 +4,10 @@ from trytond.model import ModelView, ModelSQL, fields from trytond.pool import Pool, PoolMeta __all__ = ['Address', 'Party'] -__metaclass__ = PoolMeta class Address: + __metaclass__ = PoolMeta __name__ = 'party.address' invoice = fields.Boolean('Invoice') diff --git a/setup.py b/setup.py index 9b445f97d2..6d122b830b 100644 --- a/setup.py +++ b/setup.py @@ -5,11 +5,17 @@ from setuptools import setup import re import os -import ConfigParser +import io +try: + from configparser import ConfigParser +except ImportError: + from ConfigParser import ConfigParser def read(fname): - return open(os.path.join(os.path.dirname(__file__), fname)).read() + return io.open( + os.path.join(os.path.dirname(__file__), fname), + 'r', encoding='utf-8').read() def get_require_version(name): @@ -21,7 +27,7 @@ def get_require_version(name): major_version, minor_version + 1) return require -config = ConfigParser.ConfigParser() +config = ConfigParser() config.readfp(open('tryton.cfg')) info = dict(config.items('tryton')) for key in ('depends', 'extras_depend', 'xml'): @@ -95,6 +101,9 @@ setup(name=name, 'Natural Language :: Spanish', 'Operating System :: OS Independent', 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Office/Business', @@ -111,4 +120,10 @@ setup(name=name, test_suite='tests', test_loader='trytond.test_loader:Loader', tests_require=tests_require, + use_2to3=True, + convert_2to3_doctests=[ + 'tests/scenario_invoice.rst', + 'tests/scenario_invoice_alternate_currency.rst', + 'tests/scenario_invoice_supplier.rst', + ], ) diff --git a/tests/scenario_invoice.rst b/tests/scenario_invoice.rst index 0f905192e3..5aef8c90a9 100644 --- a/tests/scenario_invoice.rst +++ b/tests/scenario_invoice.rst @@ -12,7 +12,7 @@ Imports:: ... get_company >>> from trytond.modules.account.tests.tools import create_fiscalyear, \ ... create_chart, get_accounts, create_tax, set_tax_code - >>> from.trytond.modules.account_invoice.tests.tools import \ + >>> from trytond.modules.account_invoice.tests.tools import \ ... set_fiscalyear_invoice_sequences >>> today = datetime.date.today() diff --git a/tests/scenario_invoice_alternate_currency.rst b/tests/scenario_invoice_alternate_currency.rst index 62fc0ce819..b0b7e6c4bf 100644 --- a/tests/scenario_invoice_alternate_currency.rst +++ b/tests/scenario_invoice_alternate_currency.rst @@ -14,7 +14,7 @@ Imports:: ... get_company >>> from trytond.modules.account.tests.tools import create_fiscalyear, \ ... create_chart, get_accounts, create_tax, set_tax_code - >>> from.trytond.modules.account_invoice.tests.tools import \ + >>> from trytond.modules.account_invoice.tests.tools import \ ... set_fiscalyear_invoice_sequences >>> today = datetime.date.today() diff --git a/tests/scenario_invoice_supplier.rst b/tests/scenario_invoice_supplier.rst index cb1e565215..0c53eae0df 100644 --- a/tests/scenario_invoice_supplier.rst +++ b/tests/scenario_invoice_supplier.rst @@ -12,7 +12,7 @@ Imports:: ... get_company >>> from trytond.modules.account.tests.tools import create_fiscalyear, \ ... create_chart, get_accounts, create_tax, set_tax_code - >>> from.trytond.modules.account_invoice.tests.tools import \ + >>> from trytond.modules.account_invoice.tests.tools import \ ... set_fiscalyear_invoice_sequences >>> today = datetime.date.today() diff --git a/tests/test_account_invoice.py b/tests/test_account_invoice.py index 9cc8661804..e478039eed 100644 --- a/tests/test_account_invoice.py +++ b/tests/test_account_invoice.py @@ -7,6 +7,7 @@ from decimal import Decimal import trytond.tests.test_tryton from trytond.tests.test_tryton import ModuleTestCase, with_transaction from trytond.tests.test_tryton import doctest_setup, doctest_teardown +from trytond.tests.test_tryton import doctest_checker from trytond.pool import Pool from trytond.modules.currency.tests import create_currency @@ -87,9 +88,9 @@ class AccountInvoiceTestCase(ModuleTestCase): date=datetime.date(2011, 10, 1)) self.assertEqual(terms, [ (datetime.date(2011, 10, 31), Decimal('396.84')), - (datetime.date(2011, 11, 01), Decimal('396.84')), - (datetime.date(2011, 12, 01), Decimal('396.84')), - (datetime.date(2012, 01, 14), Decimal('396.83')), + (datetime.date(2011, 11, 1), Decimal('396.84')), + (datetime.date(2011, 12, 1), Decimal('396.84')), + (datetime.date(2012, 1, 14), Decimal('396.83')), ]) @@ -99,12 +100,15 @@ def suite(): AccountInvoiceTestCase)) suite.addTests(doctest.DocFileSuite('scenario_invoice.rst', setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8', + checker=doctest_checker, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)) suite.addTests(doctest.DocFileSuite('scenario_invoice_supplier.rst', setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8', + checker=doctest_checker, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)) suite.addTests(doctest.DocFileSuite( 'scenario_invoice_alternate_currency.rst', setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8', + checker=doctest_checker, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)) return suite diff --git a/tox.ini b/tox.ini index e9d2876444..e2a064851d 100644 --- a/tox.ini +++ b/tox.ini @@ -1,10 +1,10 @@ [tox] -envlist = py27-{sqlite,postgresql,mysql},pypy-{sqlite,postgresql} +envlist = {py27,py33,py34,py35}-{sqlite,postgresql,mysql},pypy-{sqlite,postgresql} [testenv] commands = {envpython} setup.py test deps = - py27-postgresql: psycopg2 >= 2.0 + {py27,py33,py34,py35}-postgresql: psycopg2 >= 2.0 pypy-postgresql: psycopg2cffi >= 2.5 mysql: MySQL-python setenv =