From 7ea26c42198a42db3afdba065276799dcb652a08 Mon Sep 17 00:00:00 2001 From: "niklas.fruehauf" Date: Mon, 8 Aug 2022 14:32:40 +0200 Subject: [PATCH 1/4] fix: prevent multiple session closings --- pony/orm/core.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pony/orm/core.py b/pony/orm/core.py index af566422b..4b386271e 100644 --- a/pony/orm/core.py +++ b/pony/orm/core.py @@ -424,7 +424,7 @@ def rollback(): class DBSessionContextManager(object): __slots__ = 'retry', 'retry_exceptions', 'allowed_exceptions', \ 'immediate', 'ddl', 'serializable', 'strict', 'optimistic', \ - 'sql_debug', 'show_values' + 'sql_debug', 'show_values', '_closed' def __init__(db_session, retry=0, immediate=False, ddl=False, serializable=False, strict=False, optimistic=True, retry_exceptions=(TransactionError,), allowed_exceptions=(), sql_debug=None, show_values=None): if retry != 0: @@ -448,6 +448,7 @@ def __init__(db_session, retry=0, immediate=False, ddl=False, serializable=False db_session.allowed_exceptions = allowed_exceptions db_session.sql_debug = sql_debug db_session.show_values = show_values + db_session._closed = None def __call__(db_session, *args, **kwargs): if not args and not kwargs: return db_session if len(args) > 1: throw(TypeError, @@ -464,6 +465,7 @@ def __enter__(db_session): "@db_session can accept 'retry' parameter only when used as decorator and not as context manager") db_session._enter() def _enter(db_session): + if local.db_session is None: assert not local.db_context_counter local.db_session = db_session @@ -472,10 +474,14 @@ def _enter(db_session): elif db_session.serializable and not local.db_session.serializable: throw(TransactionError, 'Cannot start serializable transaction inside non-serializable transaction') local.db_context_counter += 1 + db_session._closed = False if db_session.sql_debug is not None: local.push_debug_state(db_session.sql_debug, db_session.show_values) def __exit__(db_session, exc_type=None, exc=None, tb=None): + if db_session._closed: return local.db_context_counter -= 1 + assert local.db_context_counter >= 0 + db_session._closed = True try: if not local.db_context_counter: assert local.db_session is db_session From edcab08918d03a8503f3b7e152b9d90d7d5af88a Mon Sep 17 00:00:00 2001 From: "niklas.fruehauf" Date: Mon, 29 Aug 2022 17:08:34 +0200 Subject: [PATCH 2/4] fix: allow latest python --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 72d776e95..03dca0fe9 100644 --- a/setup.py +++ b/setup.py @@ -111,7 +111,6 @@ def test_suite(): s = "Sorry, but %s %s requires Python of one of the following versions: 2.7, 3.3-3.8." \ " You have version %s" print(s % (name, version, sys.version.split(' ', 1)[0])) - sys.exit(1) REQUIRES = ['docopt'] From 76a85b4090da1cf152ad63d7d03199f8782e071d Mon Sep 17 00:00:00 2001 From: Alexander Kozlovsky Date: Mon, 23 Nov 2020 09:18:23 +0100 Subject: [PATCH 3/4] Fix decompiler & tests for Python 3.9 --- pony/orm/decompiling.py | 24 +++++++++++++++++++ pony/orm/tests/test_declarative_exceptions.py | 9 ++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/pony/orm/decompiling.py b/pony/orm/decompiling.py index 068714754..aa3480afa 100644 --- a/pony/orm/decompiling.py +++ b/pony/orm/decompiling.py @@ -327,6 +327,9 @@ def COMPARE_OP(decompiler, op): oper1 = decompiler.stack.pop() return ast.Compare(oper1, [(op, oper2)]) + def CONTAINS_OP(decompiler, invert): + return decompiler.COMPARE_OP('not in' if invert else 'in') + def DUP_TOP(decompiler): return decompiler.stack[-1] @@ -353,6 +356,9 @@ def JUMP_IF_FALSE(decompiler, endpos): JUMP_IF_FALSE_OR_POP = JUMP_IF_FALSE + def JUMP_IF_NOT_EXC_MATCH(decompiler, endpos): + raise NotImplementedError + def JUMP_IF_TRUE(decompiler, endpos): return decompiler.conditional_jump(endpos, True) @@ -436,10 +442,28 @@ def JUMP_FORWARD(decompiler, endpos): if decompiler.targets.get(endpos) is then: decompiler.targets[endpos] = if_exp return if_exp + def IS_OP(decompiler, invert): + return decompiler.COMPARE_OP('is not' if invert else 'is') + def LIST_APPEND(decompiler, offset=None): throw(InvalidQuery('Use generator expression (... for ... in ...) ' 'instead of list comprehension [... for ... in ...] inside query')) + def LIST_EXTEND(decompiler, offset): + if offset != 1: + raise NotImplementedError(offset) + items = decompiler.stack.pop() + if not isinstance(items, ast.Const): + raise NotImplementedError(type(items)) + if not isinstance(items.value, tuple): + raise NotImplementedError(type(items.value)) + lst = decompiler.stack.pop() + if not isinstance(lst, ast.List): + raise NotImplementedError(type(lst)) + values = tuple(ast.Const(v) for v in items.value) + lst.nodes = lst.nodes + values + return lst + def LOAD_ATTR(decompiler, attr_name): return ast.Getattr(decompiler.stack.pop(), attr_name) diff --git a/pony/orm/tests/test_declarative_exceptions.py b/pony/orm/tests/test_declarative_exceptions.py index b4fa44631..933d4b9d9 100644 --- a/pony/orm/tests/test_declarative_exceptions.py +++ b/pony/orm/tests/test_declarative_exceptions.py @@ -153,9 +153,12 @@ def test29(self): @raises_exception(NotImplementedError, "date(s.id, 1, 1)") def test30(self): select(s for s in Student if s.dob < date(s.id, 1, 1)) - @raises_exception(ExprEvalError, "`max()` raises TypeError: max() expects at least one argument" if PYPY else - "`max()` raises TypeError: max expected 1 arguments, got 0" if sys.version_info[:2] < (3, 8) else - "`max()` raises TypeError: max expected 1 argument, got 0") + @raises_exception( + ExprEvalError, + "`max()` raises TypeError: max() expects at least one argument" if PYPY else + "`max()` raises TypeError: max expected 1 arguments, got 0" if sys.version_info[:2] < (3, 8) else + "`max()` raises TypeError: max expected 1 argument, got 0" if sys.version_info[:2] < (3, 9) else + "`max()` raises TypeError: max expected at least 1 argument, got 0") def test31(self): select(s for s in Student if s.id < max()) @raises_exception(TypeError, "Incomparable types 'Student' and 'Course' in expression: s in s.courses") From c11d116d8b01c2d472ac82691f88f862fdbe863a Mon Sep 17 00:00:00 2001 From: "niklas.fruehauf" Date: Wed, 21 Sep 2022 14:46:50 +0200 Subject: [PATCH 4/4] fix: python 3.9 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 03dca0fe9..7a58b76fa 100644 --- a/setup.py +++ b/setup.py @@ -107,7 +107,7 @@ def test_suite(): if __name__ == "__main__": pv = sys.version_info[:2] - if pv not in ((2, 7), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8)): + if pv not in ((2, 7), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9)): s = "Sorry, but %s %s requires Python of one of the following versions: 2.7, 3.3-3.8." \ " You have version %s" print(s % (name, version, sys.version.split(' ', 1)[0]))