update windows build to Python 3.7
This commit is contained in:
parent
73105fa71e
commit
ddc59ab92d
5761 changed files with 750298 additions and 213405 deletions
|
|
@ -1,5 +1,5 @@
|
|||
# testing/__init__.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,5 +1,5 @@
|
|||
# testing/assertions.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/assertsql.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/config.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/engines.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/entities.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/exclusions.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/fixtures.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/mock.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/pickleable.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,5 +1,5 @@
|
|||
# plugin/noseplugin.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# plugin/plugin_base.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ def pytest_sessionstart(session):
|
|||
plugin_base.post_begin()
|
||||
|
||||
if has_xdist:
|
||||
_follower_count = itertools.count(1)
|
||||
import uuid
|
||||
|
||||
def pytest_configure_node(node):
|
||||
# the master for each node fills slaveinput dictionary
|
||||
|
|
@ -63,7 +63,7 @@ if has_xdist:
|
|||
|
||||
plugin_base.memoize_important_follower_config(node.slaveinput)
|
||||
|
||||
node.slaveinput["follower_ident"] = "test_%s" % next(_follower_count)
|
||||
node.slaveinput["follower_ident"] = "test_%s" % uuid.uuid4().hex[0:12]
|
||||
from sqlalchemy.testing import provision
|
||||
provision.create_follower_db(node.slaveinput["follower_ident"])
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/profiling.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
@ -75,6 +75,11 @@ class ProfileStatsFile(object):
|
|||
platform_tokens.append("pypy")
|
||||
if win32:
|
||||
platform_tokens.append("win")
|
||||
platform_tokens.append(
|
||||
"nativeunicode"
|
||||
if config.db.dialect.convert_unicode
|
||||
else "dbapiunicode"
|
||||
)
|
||||
_has_cext = config.requirements._has_cextensions()
|
||||
platform_tokens.append(_has_cext and "cextensions" or "nocextensions")
|
||||
return "_".join(platform_tokens)
|
||||
|
|
|
|||
|
|
@ -1,8 +1,12 @@
|
|||
from sqlalchemy.engine import url as sa_url
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy import exc
|
||||
from sqlalchemy.util import compat
|
||||
from . import config, engines
|
||||
|
||||
import time
|
||||
import logging
|
||||
import os
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
FOLLOWER_IDENT = None
|
||||
|
||||
|
|
@ -52,6 +56,7 @@ def setup_config(db_url, options, file_config, follower_ident):
|
|||
db_opts = {}
|
||||
_update_db_opts(db_url, db_opts)
|
||||
eng = engines.testing_engine(db_url, db_opts)
|
||||
_post_configure_engine(db_url, eng, follower_ident)
|
||||
eng.connect().close()
|
||||
cfg = config.Config.register(eng, db_opts, options, file_config)
|
||||
if follower_ident:
|
||||
|
|
@ -105,6 +110,11 @@ def _configure_follower(cfg, ident):
|
|||
pass
|
||||
|
||||
|
||||
@register.init
|
||||
def _post_configure_engine(url, engine, follower_ident):
|
||||
pass
|
||||
|
||||
|
||||
@register.init
|
||||
def _follower_url_from_main(url, ident):
|
||||
url = sa_url.make_url(url)
|
||||
|
|
@ -126,6 +136,23 @@ def _sqlite_follower_url_from_main(url, ident):
|
|||
return sa_url.make_url("sqlite:///%s.db" % ident)
|
||||
|
||||
|
||||
@_post_configure_engine.for_db("sqlite")
|
||||
def _sqlite_post_configure_engine(url, engine, follower_ident):
|
||||
from sqlalchemy import event
|
||||
|
||||
@event.listens_for(engine, "connect")
|
||||
def connect(dbapi_connection, connection_record):
|
||||
# use file DBs in all cases, memory acts kind of strangely
|
||||
# as an attached
|
||||
if not follower_ident:
|
||||
dbapi_connection.execute(
|
||||
'ATTACH DATABASE "test_schema.db" AS test_schema')
|
||||
else:
|
||||
dbapi_connection.execute(
|
||||
'ATTACH DATABASE "%s_test_schema.db" AS test_schema'
|
||||
% follower_ident)
|
||||
|
||||
|
||||
@_create_db.for_db("postgresql")
|
||||
def _pg_create_db(cfg, eng, ident):
|
||||
with eng.connect().execution_options(
|
||||
|
|
@ -135,7 +162,18 @@ def _pg_create_db(cfg, eng, ident):
|
|||
except Exception:
|
||||
pass
|
||||
currentdb = conn.scalar("select current_database()")
|
||||
conn.execute("CREATE DATABASE %s TEMPLATE %s" % (ident, currentdb))
|
||||
for attempt in range(3):
|
||||
try:
|
||||
conn.execute(
|
||||
"CREATE DATABASE %s TEMPLATE %s" % (ident, currentdb))
|
||||
except exc.OperationalError as err:
|
||||
if attempt != 2 and "accessed by other users" in str(err):
|
||||
time.sleep(.2)
|
||||
continue
|
||||
else:
|
||||
raise
|
||||
else:
|
||||
break
|
||||
|
||||
|
||||
@_create_db.for_db("mysql")
|
||||
|
|
@ -176,8 +214,10 @@ def _pg_drop_db(cfg, eng, ident):
|
|||
|
||||
@_drop_db.for_db("sqlite")
|
||||
def _sqlite_drop_db(cfg, eng, ident):
|
||||
pass
|
||||
#os.remove("%s.db" % ident)
|
||||
if ident:
|
||||
os.remove("%s_test_schema.db" % ident)
|
||||
else:
|
||||
os.remove("%s.db" % ident)
|
||||
|
||||
|
||||
@_drop_db.for_db("mysql")
|
||||
|
|
@ -197,5 +237,81 @@ def _mysql_drop_db(cfg, eng, ident):
|
|||
pass
|
||||
|
||||
|
||||
@_create_db.for_db("oracle")
|
||||
def _oracle_create_db(cfg, eng, ident):
|
||||
# NOTE: make sure you've run "ALTER DATABASE default tablespace users" or
|
||||
# similar, so that the default tablespace is not "system"; reflection will
|
||||
# fail otherwise
|
||||
with eng.connect() as conn:
|
||||
conn.execute("create user %s identified by xe" % ident)
|
||||
conn.execute("create user %s_ts1 identified by xe" % ident)
|
||||
conn.execute("create user %s_ts2 identified by xe" % ident)
|
||||
conn.execute("grant dba to %s" % (ident, ))
|
||||
conn.execute("grant unlimited tablespace to %s" % ident)
|
||||
conn.execute("grant unlimited tablespace to %s_ts1" % ident)
|
||||
conn.execute("grant unlimited tablespace to %s_ts2" % ident)
|
||||
|
||||
@_configure_follower.for_db("oracle")
|
||||
def _oracle_configure_follower(config, ident):
|
||||
config.test_schema = "%s_ts1" % ident
|
||||
config.test_schema_2 = "%s_ts2" % ident
|
||||
|
||||
|
||||
def _ora_drop_ignore(conn, dbname):
|
||||
try:
|
||||
conn.execute("drop user %s cascade" % dbname)
|
||||
log.info("Reaped db: %s" % dbname)
|
||||
return True
|
||||
except exc.DatabaseError as err:
|
||||
log.warn("couldn't drop db: %s" % err)
|
||||
return False
|
||||
|
||||
|
||||
@_drop_db.for_db("oracle")
|
||||
def _oracle_drop_db(cfg, eng, ident):
|
||||
with eng.connect() as conn:
|
||||
# cx_Oracle seems to occasionally leak open connections when a large
|
||||
# suite it run, even if we confirm we have zero references to
|
||||
# connection objects.
|
||||
# while there is a "kill session" command in Oracle,
|
||||
# it unfortunately does not release the connection sufficiently.
|
||||
_ora_drop_ignore(conn, ident)
|
||||
_ora_drop_ignore(conn, "%s_ts1" % ident)
|
||||
_ora_drop_ignore(conn, "%s_ts2" % ident)
|
||||
|
||||
|
||||
def reap_oracle_dbs(eng):
|
||||
log.info("Reaping Oracle dbs...")
|
||||
with eng.connect() as conn:
|
||||
to_reap = conn.execute(
|
||||
"select u.username from all_users u where username "
|
||||
"like 'TEST_%' and not exists (select username "
|
||||
"from v$session where username=u.username)")
|
||||
all_names = set([username.lower() for (username, ) in to_reap])
|
||||
to_drop = set()
|
||||
for name in all_names:
|
||||
if name.endswith("_ts1") or name.endswith("_ts2"):
|
||||
continue
|
||||
else:
|
||||
to_drop.add(name)
|
||||
if "%s_ts1" % name in all_names:
|
||||
to_drop.add("%s_ts1" % name)
|
||||
if "%s_ts2" % name in all_names:
|
||||
to_drop.add("%s_ts2" % name)
|
||||
|
||||
dropped = total = 0
|
||||
for total, username in enumerate(to_drop, 1):
|
||||
if _ora_drop_ignore(conn, username):
|
||||
dropped += 1
|
||||
log.info(
|
||||
"Dropped %d out of %d stale databases detected", dropped, total)
|
||||
|
||||
|
||||
@_follower_url_from_main.for_db("oracle")
|
||||
def _oracle_follower_url_from_main(url, ident):
|
||||
url = sa_url.make_url(url)
|
||||
url.username = ident
|
||||
url.password = 'xe'
|
||||
return url
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/requirements.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env python
|
||||
# testing/runner.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/schema.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -39,6 +39,15 @@ class ComponentReflectionTest(fixtures.TablesTest):
|
|||
|
||||
__backend__ = True
|
||||
|
||||
@classmethod
|
||||
def setup_bind(cls):
|
||||
if config.requirements.independent_connections.enabled:
|
||||
from sqlalchemy import pool
|
||||
return engines.testing_engine(
|
||||
options=dict(poolclass=pool.StaticPool))
|
||||
else:
|
||||
return config.db
|
||||
|
||||
@classmethod
|
||||
def define_tables(cls, metadata):
|
||||
cls.define_reflected_tables(metadata, None)
|
||||
|
|
@ -202,7 +211,7 @@ class ComponentReflectionTest(fixtures.TablesTest):
|
|||
|
||||
@testing.requires.temp_table_names
|
||||
def test_get_temp_table_names(self):
|
||||
insp = inspect(testing.db)
|
||||
insp = inspect(self.bind)
|
||||
temp_table_names = insp.get_temp_table_names()
|
||||
eq_(sorted(temp_table_names), ['user_tmp'])
|
||||
|
||||
|
|
@ -210,7 +219,7 @@ class ComponentReflectionTest(fixtures.TablesTest):
|
|||
@testing.requires.temp_table_names
|
||||
@testing.requires.temporary_views
|
||||
def test_get_temp_view_names(self):
|
||||
insp = inspect(self.metadata.bind)
|
||||
insp = inspect(self.bind)
|
||||
temp_table_names = insp.get_temp_view_names()
|
||||
eq_(sorted(temp_table_names), ['user_tmp_v'])
|
||||
|
||||
|
|
@ -348,7 +357,7 @@ class ComponentReflectionTest(fixtures.TablesTest):
|
|||
|
||||
@testing.requires.temp_table_reflection
|
||||
def test_get_temp_table_columns(self):
|
||||
meta = MetaData(testing.db)
|
||||
meta = MetaData(self.bind)
|
||||
user_tmp = self.tables.user_tmp
|
||||
insp = inspect(meta.bind)
|
||||
cols = insp.get_columns('user_tmp')
|
||||
|
|
@ -361,7 +370,7 @@ class ComponentReflectionTest(fixtures.TablesTest):
|
|||
@testing.requires.view_column_reflection
|
||||
@testing.requires.temporary_views
|
||||
def test_get_temp_view_columns(self):
|
||||
insp = inspect(self.metadata.bind)
|
||||
insp = inspect(self.bind)
|
||||
cols = insp.get_columns('user_tmp_v')
|
||||
eq_(
|
||||
[col['name'] for col in cols],
|
||||
|
|
@ -503,7 +512,7 @@ class ComponentReflectionTest(fixtures.TablesTest):
|
|||
@testing.requires.temp_table_reflection
|
||||
@testing.requires.unique_constraint_reflection
|
||||
def test_get_temp_table_unique_constraints(self):
|
||||
insp = inspect(self.metadata.bind)
|
||||
insp = inspect(self.bind)
|
||||
reflected = insp.get_unique_constraints('user_tmp')
|
||||
for refl in reflected:
|
||||
# Different dialects handle duplicate index and constraints
|
||||
|
|
@ -513,7 +522,7 @@ class ComponentReflectionTest(fixtures.TablesTest):
|
|||
|
||||
@testing.requires.temp_table_reflection
|
||||
def test_get_temp_table_indexes(self):
|
||||
insp = inspect(self.metadata.bind)
|
||||
insp = inspect(self.bind)
|
||||
indexes = insp.get_indexes('user_tmp')
|
||||
for ind in indexes:
|
||||
ind.pop('dialect_options', None)
|
||||
|
|
|
|||
|
|
@ -86,11 +86,11 @@ class HasSequenceTest(fixtures.TestBase):
|
|||
|
||||
@testing.requires.schemas
|
||||
def test_has_sequence_schema(self):
|
||||
s1 = Sequence('user_id_seq', schema="test_schema")
|
||||
s1 = Sequence('user_id_seq', schema=config.test_schema)
|
||||
testing.db.execute(schema.CreateSequence(s1))
|
||||
try:
|
||||
eq_(testing.db.dialect.has_sequence(
|
||||
testing.db, 'user_id_seq', schema="test_schema"), True)
|
||||
testing.db, 'user_id_seq', schema=config.test_schema), True)
|
||||
finally:
|
||||
testing.db.execute(schema.DropSequence(s1))
|
||||
|
||||
|
|
@ -101,7 +101,7 @@ class HasSequenceTest(fixtures.TestBase):
|
|||
@testing.requires.schemas
|
||||
def test_has_sequence_schemas_neg(self):
|
||||
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq',
|
||||
schema="test_schema"),
|
||||
schema=config.test_schema),
|
||||
False)
|
||||
|
||||
@testing.requires.schemas
|
||||
|
|
@ -110,14 +110,14 @@ class HasSequenceTest(fixtures.TestBase):
|
|||
testing.db.execute(schema.CreateSequence(s1))
|
||||
try:
|
||||
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq',
|
||||
schema="test_schema"),
|
||||
schema=config.test_schema),
|
||||
False)
|
||||
finally:
|
||||
testing.db.execute(schema.DropSequence(s1))
|
||||
|
||||
@testing.requires.schemas
|
||||
def test_has_sequence_remote_not_in_default(self):
|
||||
s1 = Sequence('user_id_seq', schema="test_schema")
|
||||
s1 = Sequence('user_id_seq', schema=config.test_schema)
|
||||
testing.db.execute(schema.CreateSequence(s1))
|
||||
try:
|
||||
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq'),
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/util.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
@ -248,7 +248,7 @@ def drop_all_tables(engine, inspector, schema=None, include_names=None):
|
|||
if include_names is not None and tname not in include_names:
|
||||
continue
|
||||
conn.execute(DropTable(
|
||||
Table(tname, MetaData())
|
||||
Table(tname, MetaData(), schema=schema)
|
||||
))
|
||||
elif fkcs:
|
||||
if not engine.dialect.supports_alter:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# testing/warnings.py
|
||||
# Copyright (C) 2005-2015 the SQLAlchemy authors and contributors
|
||||
# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
|
||||
# <see AUTHORS file>
|
||||
#
|
||||
# This module is part of SQLAlchemy and is released under
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue