Avoid installing tests to site-packages

For library end users, there is no need to install tests alongside the
package itself. This keeps the tests available for development without
adding extra packages to user's site-packages directory. Reduces the
size of the installed package. Avoids accidental execution of test code
by an installed package.
This commit is contained in:
Jon Dufresne 2017-12-03 18:47:19 -08:00
parent c86e682153
commit 389f6c08d9
19 changed files with 56 additions and 38 deletions

View File

@ -238,6 +238,7 @@ build_script:
- "%PYTHON%\\python.exe setup.py build_ext --have-ssl --pg-config %PGTOP%\\bin\\pg_config.exe -l libpgcommon -l libpgport -L %OPENSSLTOP%\\lib -I %OPENSSLTOP%\\include" - "%PYTHON%\\python.exe setup.py build_ext --have-ssl --pg-config %PGTOP%\\bin\\pg_config.exe -l libpgcommon -l libpgport -L %OPENSSLTOP%\\lib -I %OPENSSLTOP%\\include"
- "%PYTHON%\\python.exe setup.py build" - "%PYTHON%\\python.exe setup.py build"
- "%PYTHON%\\python.exe setup.py install" - "%PYTHON%\\python.exe setup.py install"
- RD /S /Q psycopg2.egg-info
#after_build: #after_build:
@ -251,4 +252,4 @@ test_script:
- "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.__version__)\"" - "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.__version__)\""
- "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.__libpq_version__)\"" - "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.__libpq_version__)\""
- "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.extensions.libpq_version())\"" - "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.extensions.libpq_version())\""
- "%PYTHON%\\python.exe -c \"from psycopg2 import tests; tests.unittest.main(defaultTest='tests.test_suite')\" --verbose" - "%PYTHON%\\python.exe -c \"import tests; tests.unittest.main(defaultTest='tests.test_suite')\" --verbose"

View File

@ -12,6 +12,7 @@ python:
install: install:
- python setup.py install - python setup.py install
- rm -rf psycopg2.egg-info
- sudo scripts/travis_prepare.sh - sudo scripts/travis_prepare.sh
script: script:

View File

@ -29,8 +29,7 @@ SOURCE := $(SOURCE_C) $(SOURCE_PY) $(SOURCE_TESTS) $(SOURCE_DOC)
PACKAGE := $(BUILD_DIR)/psycopg2 PACKAGE := $(BUILD_DIR)/psycopg2
PLATLIB := $(PACKAGE)/_psycopg.so PLATLIB := $(PACKAGE)/_psycopg.so
PURELIB := $(patsubst lib/%,$(PACKAGE)/%,$(SOURCE_PY)) \ PURELIB := $(patsubst lib/%,$(PACKAGE)/%,$(SOURCE_PY))
$(patsubst tests/%,$(PACKAGE)/tests/%,$(SOURCE_TESTS))
BUILD_OPT := --build-lib=$(BUILD_DIR) BUILD_OPT := --build-lib=$(BUILD_DIR)
BUILD_EXT_OPT := --build-lib=$(BUILD_DIR) BUILD_EXT_OPT := --build-lib=$(BUILD_DIR)
@ -66,7 +65,7 @@ env:
$(MAKE) -C doc $@ $(MAKE) -C doc $@
check: check:
PYTHONPATH=$(BUILD_DIR):$(PYTHONPATH) $(PYTHON) -c "from psycopg2 import tests; tests.unittest.main(defaultTest='tests.test_suite')" --verbose PYTHONPATH=$(BUILD_DIR):$(PYTHONPATH) $(PYTHON) -c "import tests; tests.unittest.main(defaultTest='tests.test_suite')" --verbose
testdb: testdb:
@echo "* Creating $(TESTDB)" @echo "* Creating $(TESTDB)"

3
NEWS
View File

@ -9,6 +9,9 @@ Other changes:
- Dropped support for Python 2.6, 3.2, 3.3. - Dropped support for Python 2.6, 3.2, 3.3.
- Dropped `psycopg1` module. - Dropped `psycopg1` module.
- Dropped deprecated ``register_tstz_w_secs()`` (was previously a no-op). - Dropped deprecated ``register_tstz_w_secs()`` (was previously a no-op).
- The ``psycopg2.test`` package is no longer installed by ``python setup.py
install``. The test source files now are compatible with Python 2 and 3
without using 2to3.
What's new in psycopg 2.7.4 What's new in psycopg 2.7.4

View File

@ -267,11 +267,11 @@ Running the test suite
---------------------- ----------------------
Once `!psycopg2` is installed you can run the test suite to verify it is Once `!psycopg2` is installed you can run the test suite to verify it is
working correctly. You can run: working correctly. From the source directory, you can run:
.. code-block:: console .. code-block:: console
$ python -c "from psycopg2 import tests; tests.unittest.main(defaultTest='tests.test_suite')" --verbose $ python -c "import tests; tests.unittest.main(defaultTest='tests.test_suite')" --verbose
The tests run against a database called ``psycopg2_test`` on UNIX socket and The tests run against a database called ``psycopg2_test`` on UNIX socket and
the standard port. You can configure a different database to run the test by the standard port. You can configure a different database to run the test by

View File

@ -30,8 +30,8 @@ from collections import defaultdict
def main(): def main():
opt = parse_args() opt = parse_args()
import psycopg2.tests import tests
test = psycopg2.tests test = tests
if opt.suite: if opt.suite:
test = getattr(test, opt.suite) test = getattr(test, opt.suite)

View File

@ -34,13 +34,13 @@ run_test () {
export PSYCOPG2_TEST_REPL_DSN= export PSYCOPG2_TEST_REPL_DSN=
unset PSYCOPG2_TEST_GREEN unset PSYCOPG2_TEST_GREEN
python -c \ python -c \
"from psycopg2 import tests; tests.unittest.main(defaultTest='tests.test_suite')" \ "import tests; tests.unittest.main(defaultTest='tests.test_suite')" \
$VERBOSE $VERBOSE
printf "\n\nRunning tests against PostgreSQL $VERSION (green mode)\n\n" printf "\n\nRunning tests against PostgreSQL $VERSION (green mode)\n\n"
export PSYCOPG2_TEST_GREEN=1 export PSYCOPG2_TEST_GREEN=1
python -c \ python -c \
"from psycopg2 import tests; tests.unittest.main(defaultTest='tests.test_suite')" \ "import tests; tests.unittest.main(defaultTest='tests.test_suite')" \
$VERBOSE $VERBOSE
} }

View File

@ -624,8 +624,8 @@ setup(name="psycopg2",
long_description="\n".join(readme.split("\n")[2:]).lstrip(), long_description="\n".join(readme.split("\n")[2:]).lstrip(),
classifiers=[x for x in classifiers.split("\n") if x], classifiers=[x for x in classifiers.split("\n") if x],
data_files=data_files, data_files=data_files,
package_dir={'psycopg2': 'lib', 'psycopg2.tests': 'tests'}, package_dir={'psycopg2': 'lib'},
packages=['psycopg2', 'psycopg2.tests'], packages=['psycopg2'],
cmdclass={ cmdclass={
'build_ext': psycopg_build_ext, 'build_ext': psycopg_build_ext,
'build_py': build_py, }, 'build_py': build_py, },

View File

@ -30,9 +30,8 @@ import psycopg2
from psycopg2 import extensions as ext from psycopg2 import extensions as ext
import time import time
import StringIO
from .testutils import ConnectingTestCase from .testutils import ConnectingTestCase, StringIO
class PollableStub(object): class PollableStub(object):
@ -241,7 +240,7 @@ class AsyncTests(ConnectingTestCase):
# copy should fail # copy should fail
self.assertRaises(psycopg2.ProgrammingError, self.assertRaises(psycopg2.ProgrammingError,
cur.copy_from, cur.copy_from,
StringIO.StringIO("1\n3\n5\n\\.\n"), "table1") StringIO("1\n3\n5\n\\.\n"), "table1")
def test_lobject_while_async(self): def test_lobject_while_async(self):
# large objects should be prohibited # large objects should be prohibited

View File

@ -26,9 +26,8 @@ import sys
import string import string
import unittest import unittest
from .testutils import (ConnectingTestCase, decorate_all_tests, from .testutils import (ConnectingTestCase, decorate_all_tests,
skip_before_postgres, slow) skip_before_postgres, slow, StringIO)
from cStringIO import StringIO from itertools import cycle
from itertools import cycle, izip
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
import psycopg2 import psycopg2

View File

@ -29,7 +29,7 @@ import psycopg2.extensions
import unittest import unittest
from .testutils import (ConnectingTestCase, skip_before_postgres, from .testutils import (ConnectingTestCase, skip_before_postgres,
skip_if_no_getrefcount, slow, skip_if_no_superuser, skip_if_no_getrefcount, slow, skip_if_no_superuser,
skip_if_windows) skip_if_windows, unicode)
import psycopg2.extras import psycopg2.extras

View File

@ -23,7 +23,7 @@
# License for more details. # License for more details.
import unittest import unittest
from .testutils import ConnectingTestCase, slow from .testutils import ConnectingTestCase, slow, reload
try: try:
reload reload
@ -52,7 +52,7 @@ class ErrocodeTests(ConnectingTestCase):
except Exception as e: except Exception as e:
errs.append(e) errs.append(e)
for __ in xrange(MAX_CYCLES): for __ in range(MAX_CYCLES):
reload(errorcodes) reload(errorcodes)
(t1, t2) = (Thread(target=f), Thread(target=f)) (t1, t2) = (Thread(target=f), Thread(target=f))
(t1.start(), t2.start()) (t1.start(), t2.start())

View File

@ -390,7 +390,7 @@ class NamedTupleCursorTest(ConnectingTestCase):
recs.extend(curs.fetchmany(5)) recs.extend(curs.fetchmany(5))
recs.append(curs.fetchone()) recs.append(curs.fetchone())
recs.extend(curs.fetchall()) recs.extend(curs.fetchall())
self.assertEqual(range(10), [t.i for t in recs]) self.assertEqual(list(range(10)), [t.i for t in recs])
def test_named_fetchone(self): def test_named_fetchone(self):
curs = self.conn.cursor('tmp') curs = self.conn.cursor('tmp')

View File

@ -28,7 +28,7 @@ from subprocess import Popen
import unittest import unittest
from .testutils import (skip_before_postgres, from .testutils import (skip_before_postgres,
ConnectingTestCase, skip_copy_if_green, slow) ConnectingTestCase, skip_copy_if_green, slow, StringIO)
import psycopg2 import psycopg2
@ -217,7 +217,6 @@ class ExceptionsTestCase(ConnectingTestCase):
@skip_copy_if_green @skip_copy_if_green
def test_diagnostics_copy(self): def test_diagnostics_copy(self):
from StringIO import StringIO
f = StringIO() f = StringIO()
cur = self.conn.cursor() cur = self.conn.cursor()
try: try:

View File

@ -25,7 +25,7 @@
import sys import sys
from . import testutils from . import testutils
import unittest import unittest
from .testutils import ConnectingTestCase from .testutils import ConnectingTestCase, unichr
import psycopg2 import psycopg2
import psycopg2.extensions import psycopg2.extensions

View File

@ -23,10 +23,10 @@
# License for more details. # License for more details.
import datetime as dt import datetime as dt
from cStringIO import StringIO
import unittest import unittest
from .testutils import (ConnectingTestCase, from .testutils import (ConnectingTestCase,
skip_before_postgres, skip_before_python, skip_copy_if_green) skip_before_postgres, skip_before_python, skip_copy_if_green,
unicode, StringIO)
import psycopg2 import psycopg2
from psycopg2 import sql from psycopg2 import sql

View File

@ -28,7 +28,7 @@ import sys
from functools import wraps from functools import wraps
from . import testutils from . import testutils
import unittest import unittest
from .testutils import ConnectingTestCase, decorate_all_tests from .testutils import ConnectingTestCase, decorate_all_tests, long
import psycopg2 import psycopg2
@ -54,8 +54,8 @@ class TypesBasicTests(ConnectingTestCase):
def testNumber(self): def testNumber(self):
s = self.execute("SELECT %s AS foo", (1971,)) s = self.execute("SELECT %s AS foo", (1971,))
self.failUnless(s == 1971, "wrong integer quoting: " + str(s)) self.failUnless(s == 1971, "wrong integer quoting: " + str(s))
s = self.execute("SELECT %s AS foo", (1971L,)) s = self.execute("SELECT %s AS foo", (long(1971),))
self.failUnless(s == 1971L, "wrong integer quoting: " + str(s)) self.failUnless(s == long(1971), "wrong integer quoting: " + str(s))
def testBoolean(self): def testBoolean(self):
x = self.execute("SELECT %s as foo", (False,)) x = self.execute("SELECT %s as foo", (False,))

View File

@ -181,7 +181,7 @@ class HstoreTestCase(ConnectingTestCase):
kk = m.group(1).split(b", ") kk = m.group(1).split(b", ")
vv = m.group(2).split(b", ") vv = m.group(2).split(b", ")
ii = zip(kk, vv) ii = list(zip(kk, vv))
ii.sort() ii.sort()
self.assertEqual(len(ii), len(o)) self.assertEqual(len(ii), len(o))
@ -306,7 +306,7 @@ class HstoreTestCase(ConnectingTestCase):
ok({}) ok({})
ok({'a': 'b', 'c': None}) ok({'a': 'b', 'c': None})
ab = map(chr, range(32, 128)) ab = list(map(chr, range(32, 128)))
ok(dict(zip(ab, ab))) ok(dict(zip(ab, ab)))
ok({''.join(ab): ''.join(ab)}) ok({''.join(ab): ''.join(ab)})
@ -314,7 +314,7 @@ class HstoreTestCase(ConnectingTestCase):
if sys.version_info[0] < 3: if sys.version_info[0] < 3:
ab = map(chr, range(32, 127) + range(160, 255)) ab = map(chr, range(32, 127) + range(160, 255))
else: else:
ab = bytes(range(32, 127) + range(160, 255)).decode('latin1') ab = bytes(list(range(32, 127)) + list(range(160, 255))).decode('latin1')
ok({''.join(ab): ''.join(ab)}) ok({''.join(ab): ''.join(ab)})
ok(dict(zip(ab, ab))) ok(dict(zip(ab, ab)))
@ -371,7 +371,7 @@ class HstoreTestCase(ConnectingTestCase):
ds = [{}, {'a': 'b', 'c': None}] ds = [{}, {'a': 'b', 'c': None}]
ab = map(chr, range(32, 128)) ab = list(map(chr, range(32, 128)))
ds.append(dict(zip(ab, ab))) ds.append(dict(zip(ab, ab)))
ds.append({''.join(ab): ''.join(ab)}) ds.append({''.join(ab): ''.join(ab)})
@ -379,7 +379,7 @@ class HstoreTestCase(ConnectingTestCase):
if sys.version_info[0] < 3: if sys.version_info[0] < 3:
ab = map(chr, range(32, 127) + range(160, 255)) ab = map(chr, range(32, 127) + range(160, 255))
else: else:
ab = bytes(range(32, 127) + range(160, 255)).decode('latin1') ab = bytes(list(range(32, 127)) + list(range(160, 255))).decode('latin1')
ds.append({''.join(ab): ''.join(ab)}) ds.append({''.join(ab): ''.join(ab)})
ds.append(dict(zip(ab, ab))) ds.append(dict(zip(ab, ab)))
@ -514,7 +514,7 @@ class AdaptTypeTestCase(ConnectingTestCase):
'@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,"\\\\",],' '@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,"\\\\",],'
'^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},' '^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},'
'~,\x7f)', '~,\x7f)',
map(chr, range(1, 128))) list(map(chr, range(1, 128))))
ok('(,"\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f' ok('(,"\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
'\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !' '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !'
'""#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]' '""#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]'
@ -1641,8 +1641,8 @@ class RangeCasterTestCase(ConnectingTestCase):
bounds = ['[)', '(]', '()', '[]'] bounds = ['[)', '(]', '()', '[]']
ranges = [TextRange(low, up, bounds[i % 4]) ranges = [TextRange(low, up, bounds[i % 4])
for i, (low, up) in enumerate(zip( for i, (low, up) in enumerate(zip(
[None] + map(chr, range(1, 128)), [None] + list(map(chr, range(1, 128))),
map(chr, range(1, 128)) + [None], list(map(chr, range(1, 128))) + [None],
))] ))]
ranges.append(TextRange()) ranges.append(TextRange())
ranges.append(TextRange(empty=True)) ranges.append(TextRange(empty=True))

View File

@ -31,6 +31,23 @@ import unittest
from functools import wraps from functools import wraps
from .testconfig import dsn, repl_dsn from .testconfig import dsn, repl_dsn
# Python 2/3 compatibility
if sys.version_info[0] == 2:
# Python 2
from StringIO import StringIO
long = long
reload = reload
unichr = unichr
unicode = unicode
else:
# Python 3
from io import StringIO
from importlib import reload
long = int
unichr = chr
unicode = str
# Silence warnings caused by the stubbornness of the Python unittest # Silence warnings caused by the stubbornness of the Python unittest
# maintainers # maintainers