diff --git a/CHANGELOG.md b/CHANGELOG.md index f6e083879..e81f9ab80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,27 @@ +# PonyORM release 0.7.14 (2020-11-23) + +## Features + +* Add Python 3.9 support +* Allow to use kwargs in select: Entity.select(**kwargs) and obj.collection.select(**kwargs), a feature that was announced but actually missed from 0.7.7 +* Add support for volatile collection attributes that don't throw "Phantom object appeared/disappeared" exceptions + +## Bugfixes + +* Fix negative timedelta conversions +* Pony should reconnect to PostgreSQL when receiving 57P01 error (AdminShutdown) +* Allow mixing compatible types (like int and float) in coalesce() arguments +* Support of subqueries in coalesce() arguments +* Fix using aggregated subqueries in ORDER BY section +* Fix queries with expressions like `(x, y) in ((a, b), (c, d))` +* #451: KeyError for seeds with unique attributes in SessionCache.update_simple_index() + + # PonyORM release 0.7.13 (2020-03-03) This release contains no new features or bugfixes. The only reason for this release is to test our CI/CD process. + # PonyORM release 0.7.12 (2020-02-04) ## Features @@ -15,7 +35,7 @@ This release contains no new features or bugfixes. The only reason for this rele * Fix string getitem translation for slices and negative indexes * PostgreSQL DISTINCT bug fixed for queries with ORDER BY clause * Fix date difference syntax in PostgreSQL -* Fix casting json to dobule in PostgreSQL +* Fix casting json to double in PostgreSQL * Fix count by several columns in PostgreSQL * Fix PostgreSQL MIN and MAX expressions on boolean columns * Fix determination of interactive mode in PyCharm @@ -105,7 +125,7 @@ This release contains no new features or bugfixes. The only reason for this rele * #385: test fails with python3.6 * #386: release unlocked lock error in SQLite * #390: TypeError: writable buffers are not hashable -* #398: add auto coversion of numpy numeric types +* #398: add auto conversion of numpy numeric types * #404: GAE local run detection * Fix Flask compatibility: add support of LocalProxy object * db_session(sql_debug=True) should log SQL commands also during db_session.__exit__() diff --git a/pony/__init__.py b/pony/__init__.py index ac2d859ae..db2bdc226 100644 --- a/pony/__init__.py +++ b/pony/__init__.py @@ -1,52 +1,52 @@ -from __future__ import absolute_import, print_function - -import os, sys -from os.path import dirname - -__version__ = '0.7.14-dev' - -def detect_mode(): - try: import google.appengine - except ImportError: pass - else: - if os.getenv('SERVER_SOFTWARE', '').startswith('Development'): - return 'GAE-LOCAL' - return 'GAE-SERVER' - - try: from mod_wsgi import version - except: pass - else: return 'MOD_WSGI' - - main = sys.modules['__main__'] - - if not hasattr(main, '__file__'): # console - return 'INTERACTIVE' - - if os.getenv('IPYTHONENABLE', '') == 'True': - return 'INTERACTIVE' - - if getattr(main, 'INTERACTIVE_MODE_AVAILABLE', False): # pycharm console - return 'INTERACTIVE' - - if 'flup.server.fcgi' in sys.modules: return 'FCGI-FLUP' - if 'uwsgi' in sys.modules: return 'UWSGI' - if 'flask' in sys.modules: return 'FLASK' - if 'cherrypy' in sys.modules: return 'CHERRYPY' - if 'bottle' in sys.modules: return 'BOTTLE' - return 'UNKNOWN' - -MODE = detect_mode() - -MAIN_FILE = None -if MODE == 'MOD_WSGI': - for module_name, module in sys.modules.items(): - if module_name.startswith('_mod_wsgi_'): - MAIN_FILE = module.__file__ - break -elif MODE != 'INTERACTIVE': - MAIN_FILE = sys.modules['__main__'].__file__ - -if MAIN_FILE is not None: MAIN_DIR = dirname(MAIN_FILE) -else: MAIN_DIR = None - -PONY_DIR = dirname(__file__) +from __future__ import absolute_import, print_function + +import os, sys +from os.path import dirname + +__version__ = '0.7.14' + +def detect_mode(): + try: import google.appengine + except ImportError: pass + else: + if os.getenv('SERVER_SOFTWARE', '').startswith('Development'): + return 'GAE-LOCAL' + return 'GAE-SERVER' + + try: from mod_wsgi import version + except: pass + else: return 'MOD_WSGI' + + main = sys.modules['__main__'] + + if not hasattr(main, '__file__'): # console + return 'INTERACTIVE' + + if os.getenv('IPYTHONENABLE', '') == 'True': + return 'INTERACTIVE' + + if getattr(main, 'INTERACTIVE_MODE_AVAILABLE', False): # pycharm console + return 'INTERACTIVE' + + if 'flup.server.fcgi' in sys.modules: return 'FCGI-FLUP' + if 'uwsgi' in sys.modules: return 'UWSGI' + if 'flask' in sys.modules: return 'FLASK' + if 'cherrypy' in sys.modules: return 'CHERRYPY' + if 'bottle' in sys.modules: return 'BOTTLE' + return 'UNKNOWN' + +MODE = detect_mode() + +MAIN_FILE = None +if MODE == 'MOD_WSGI': + for module_name, module in sys.modules.items(): + if module_name.startswith('_mod_wsgi_'): + MAIN_FILE = module.__file__ + break +elif MODE != 'INTERACTIVE': + MAIN_FILE = sys.modules['__main__'].__file__ + +if MAIN_FILE is not None: MAIN_DIR = dirname(MAIN_FILE) +else: MAIN_DIR = None + +PONY_DIR = dirname(__file__)