Merge branch 'master' of github.com:MongoEngine/mongoengine into dont-test-on-py-32

This commit is contained in:
Stefan Wojcik 2016-10-19 18:13:41 -04:00
commit d2869bf4ed
6 changed files with 66 additions and 24 deletions

View File

@ -99,7 +99,7 @@ Some simple examples of what MongoEngine code looks like:
Tests Tests
===== =====
To run the test suite, ensure you are running a local instance of MongoDB on To run the test suite, ensure you are running a local instance of MongoDB on
the standard port and have installed ``nose`` and ``rednose``, and run: ``python setup.py nosetests``. the standard port and have ``nose`` installed. Then, run: ``python setup.py nosetests``.
To run the test suite on every supported Python version and every supported PyMongo version, To run the test suite on every supported Python version and every supported PyMongo version,
you can use ``tox``. you can use ``tox``.

View File

@ -1,5 +1,5 @@
from pymongo import MongoClient, ReadPreference, uri_parser from pymongo import MongoClient, ReadPreference, uri_parser
from mongoengine.python_support import IS_PYMONGO_3 from mongoengine.python_support import (IS_PYMONGO_3, str_types)
__all__ = ['ConnectionError', 'connect', 'register_connection', __all__ = ['ConnectionError', 'connect', 'register_connection',
'DEFAULT_CONNECTION_NAME'] 'DEFAULT_CONNECTION_NAME']
@ -56,25 +56,35 @@ def register_connection(alias, name=None, host=None, port=None,
'authentication_source': authentication_source 'authentication_source': authentication_source
} }
# Handle uri style connections
conn_host = conn_settings['host'] conn_host = conn_settings['host']
if conn_host.startswith('mongomock://'): # host can be a list or a string, so if string, force to a list
conn_settings['is_mock'] = True if isinstance(conn_host, str_types):
# `mongomock://` is not a valid url prefix and must be replaced by `mongodb://` conn_host = [conn_host]
conn_settings['host'] = conn_host.replace('mongomock://', 'mongodb://', 1)
elif '://' in conn_host: resolved_hosts = []
uri_dict = uri_parser.parse_uri(conn_host) for entity in conn_host:
conn_settings.update({ # Handle uri style connections
'name': uri_dict.get('database') or name, if entity.startswith('mongomock://'):
'username': uri_dict.get('username'), conn_settings['is_mock'] = True
'password': uri_dict.get('password'), # `mongomock://` is not a valid url prefix and must be replaced by `mongodb://`
'read_preference': read_preference, resolved_hosts.append(entity.replace('mongomock://', 'mongodb://', 1))
}) elif '://' in entity:
uri_options = uri_dict['options'] uri_dict = uri_parser.parse_uri(entity)
if 'replicaset' in uri_options: resolved_hosts.append(entity)
conn_settings['replicaSet'] = True conn_settings.update({
if 'authsource' in uri_options: 'name': uri_dict.get('database') or name,
conn_settings['authentication_source'] = uri_options['authsource'] 'username': uri_dict.get('username'),
'password': uri_dict.get('password'),
'read_preference': read_preference,
})
uri_options = uri_dict['options']
if 'replicaset' in uri_options:
conn_settings['replicaSet'] = True
if 'authsource' in uri_options:
conn_settings['authentication_source'] = uri_options['authsource']
else:
resolved_hosts.append(entity)
conn_settings['host'] = resolved_hosts
# Deprecated parameters that should not be passed on # Deprecated parameters that should not be passed on
kwargs.pop('slaves', None) kwargs.pop('slaves', None)

View File

@ -1,5 +1,4 @@
[nosetests] [nosetests]
rednose = 1
verbosity = 2 verbosity = 2
detailed-errors = 1 detailed-errors = 1
cover-erase = 1 cover-erase = 1

View File

@ -53,13 +53,13 @@ CLASSIFIERS = [
extra_opts = {"packages": find_packages(exclude=["tests", "tests.*"])} extra_opts = {"packages": find_packages(exclude=["tests", "tests.*"])}
if sys.version_info[0] == 3: if sys.version_info[0] == 3:
extra_opts['use_2to3'] = True extra_opts['use_2to3'] = True
extra_opts['tests_require'] = ['nose', 'rednose', 'coverage==3.7.1', 'blinker', 'Pillow>=2.0.0'] extra_opts['tests_require'] = ['nose', 'coverage==3.7.1', 'blinker', 'Pillow>=2.0.0']
if "test" in sys.argv or "nosetests" in sys.argv: if "test" in sys.argv or "nosetests" in sys.argv:
extra_opts['packages'] = find_packages() extra_opts['packages'] = find_packages()
extra_opts['package_data'] = {"tests": ["fields/mongoengine.png", "fields/mongodb_leaf.png"]} extra_opts['package_data'] = {"tests": ["fields/mongoengine.png", "fields/mongodb_leaf.png"]}
else: else:
# coverage 4 does not support Python 3.2 anymore # coverage 4 does not support Python 3.2 anymore
extra_opts['tests_require'] = ['nose', 'rednose', 'coverage==3.7.1', 'blinker', 'Pillow>=2.0.0', 'python-dateutil'] extra_opts['tests_require'] = ['nose', 'coverage==3.7.1', 'blinker', 'Pillow>=2.0.0', 'python-dateutil']
if sys.version_info[0] == 2 and sys.version_info[1] == 6: if sys.version_info[0] == 2 and sys.version_info[1] == 6:
extra_opts['tests_require'].append('unittest2') extra_opts['tests_require'].append('unittest2')

View File

@ -88,6 +88,40 @@ class ConnectionTest(unittest.TestCase):
conn = get_connection('testdb7') conn = get_connection('testdb7')
self.assertTrue(isinstance(conn, mongomock.MongoClient)) self.assertTrue(isinstance(conn, mongomock.MongoClient))
def test_connect_with_host_list(self):
"""Ensure that the connect() method works when host is a list
Uses mongomock to test w/o needing multiple mongod/mongos processes
"""
try:
import mongomock
except ImportError:
raise SkipTest('you need mongomock installed to run this testcase')
connect(host=['mongomock://localhost'])
conn = get_connection()
self.assertTrue(isinstance(conn, mongomock.MongoClient))
connect(host=['mongodb://localhost'], is_mock=True, alias='testdb2')
conn = get_connection('testdb2')
self.assertTrue(isinstance(conn, mongomock.MongoClient))
connect(host=['localhost'], is_mock=True, alias='testdb3')
conn = get_connection('testdb3')
self.assertTrue(isinstance(conn, mongomock.MongoClient))
connect(host=['mongomock://localhost:27017', 'mongomock://localhost:27018'], alias='testdb4')
conn = get_connection('testdb4')
self.assertTrue(isinstance(conn, mongomock.MongoClient))
connect(host=['mongodb://localhost:27017', 'mongodb://localhost:27018'], is_mock=True, alias='testdb5')
conn = get_connection('testdb5')
self.assertTrue(isinstance(conn, mongomock.MongoClient))
connect(host=['localhost:27017', 'localhost:27018'], is_mock=True, alias='testdb6')
conn = get_connection('testdb6')
self.assertTrue(isinstance(conn, mongomock.MongoClient))
def test_disconnect(self): def test_disconnect(self):
"""Ensure that the disconnect() method works properly """Ensure that the disconnect() method works properly
""" """

View File

@ -7,7 +7,6 @@ commands =
python setup.py nosetests {posargs} python setup.py nosetests {posargs}
deps = deps =
nose nose
rednose
mg27: PyMongo<2.8 mg27: PyMongo<2.8
mg28: PyMongo>=2.8,<3.0 mg28: PyMongo>=2.8,<3.0
mg30: PyMongo>=3.0 mg30: PyMongo>=3.0