- "macos-latest"
python-version:
- "2.7"
- - "3.5"
- "3.6"
- "3.7"
- "3.8"
pip install -f dist --no-index sqlalchemy
- name: Check c extensions
- # on windows in python 2.7 and 3.5 the cextension fail to build.
+ # on windows in python 2.7 the cextension fail to build.
# for python 2.7 visual studio 9 is missing
- # for python 3.5 the linker has an error "cannot run 'rc.exe'"
- if: matrix.os != 'windows-latest' || ( matrix.python-version != '2.7' && matrix.python-version != '3.5' )
+ if: matrix.os != 'windows-latest' || matrix.python-version != '2.7'
run: |
python -c 'from sqlalchemy import cprocessors, cresultproxy, cutils'
# the versions are <python tag>-<abi tag> as specified in PEP 425.
- cp27-cp27m
- cp27-cp27mu
- - cp35-cp35m
- cp36-cp36m
- cp37-cp37m
- cp38-cp38
- "ubuntu-latest"
python-version:
# the versions are <python tag>-<abi tag> as specified in PEP 425.
- - cp35-cp35m
- cp36-cp36m
- cp37-cp37m
- cp38-cp38
- "macos-latest"
python-version:
- "2.7"
- - "3.5"
- "3.6"
- "3.7"
- "3.8"
pytest-args: "-k 'not test_autocommit_on and not test_turn_autocommit_off_via_default_iso_level and not test_autocommit_isolation_level'"
exclude:
- # c-extensions fail to build on windows for python 3.5 and 2.7
+ # c-extensions fail to build on windows for python 2.7
- os: "windows-latest"
python-version: "2.7"
build-type: "cext"
- - os: "windows-latest"
- python-version: "3.5"
- build-type: "cext"
# linux and osx do not have x86 python
- os: "ubuntu-latest"
architecture: x86
strategy:
matrix:
python-version:
- - cp35-cp35m
- cp36-cp36m
- cp37-cp37m
- cp38-cp38
--- /dev/null
+.. change::
+ :tags: change
+ :tickets: 5634
+
+ Dropped support for python 3.5 that has reached EOL.
+ SQLAlchemy 1.4 series requires python 2.7 or 3.6+.
SQLAlchemy has been tested against the following platforms:
* cPython 2.7
-* cPython 3.5 and higher
+* cPython 3.6 and higher
* `PyPy <http://pypy.org/>`_ 2.1 or greater
.. versionchanged:: 1.2
Python 2.7 is now the minimum Python version supported.
.. versionchanged:: 1.4
- Within the Python 3 series, 3.5 is now the minimum Python 3 version supported.
+ Within the Python 3 series, 3.6 is now the minimum Python 3 version supported.
Supported Installation Methods
-------------------------------
from .ranges import TSTZRANGE
from ...util import compat
-if compat.py36:
+if compat.py3k:
from . import asyncpg # noqa
base.dialect = dialect = psycopg2.dialect
from ..util import has_refcount_gc
from ..util import inspect_getfullargspec
from ..util import py2k
-from ..util import py36
if not has_refcount_gc:
yield pickle_.loads, lambda d: pickle_.dumps(d, protocol)
-if py2k or not py36:
+if py2k:
def random_choices(population, k=1):
pop = list(population)
from .compat import pickle # noqa
from .compat import print_ # noqa
from .compat import py2k # noqa
-from .compat import py36 # noqa
from .compat import py37 # noqa
from .compat import py3k # noqa
from .compat import pypy # noqa
py38 = sys.version_info >= (3, 8)
py37 = sys.version_info >= (3, 7)
-py36 = sys.version_info >= (3, 6)
py3k = sys.version_info >= (3, 0)
py2k = sys.version_info < (3, 0)
pypy = platform.python_implementation() == "PyPy"
[tool.black]
line-length = 79
-target-version = ['py27', 'py35']
+target-version = ['py27', 'py36']
Programming Language :: Python :: 2
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
- Programming Language :: Python :: 3.5
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
[options]
packages = find:
-python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
+python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
package_dir =
=lib
install_requires =
return super_, sub_, twin1, twin2, unique1, unique2
def _assert_unorderable_types(self, callable_):
- if util.py36:
+ if util.py3k:
assert_raises_message(
TypeError, "not supported between instances of", callable_
)
- elif util.py3k:
- assert_raises_message(TypeError, "unorderable types", callable_)
else:
assert_raises_message(
TypeError, "cannot compare sets using cmp()", callable_
),
)
def test_tzname(self, td, expected):
- if expected == "UTC" and util.py3k and not util.py36:
- expected += "+00:00"
eq_(timezone(td).tzname(None), expected)
def test_utcoffset(self):
a.data = "bar"
b.data = "foo"
if sa.util.py3k:
- if sa.util.py36:
- message = (
- r"Could not sort objects by primary key; primary key "
- r"values must be sortable in Python \(was: '<' not "
- r"supported between instances of 'MyNotSortableEnum'"
- r" and 'MyNotSortableEnum'\)"
- )
- else:
- message = (
- r"Could not sort objects by primary key; primary key "
- r"values must be sortable in Python \(was: unorderable "
- r"types: MyNotSortableEnum\(\) < MyNotSortableEnum\(\)\)"
- )
+ message = (
+ r"Could not sort objects by primary key; primary key "
+ r"values must be sortable in Python \(was: '<' not "
+ r"supported between instances of 'MyNotSortableEnum'"
+ r" and 'MyNotSortableEnum'\)"
+ )
assert_raises_message(
sa.exc.InvalidRequestError,