Hello community, here is the log from the commit of package python-pymongo for openSUSE:Factory checked in at 2015-08-05 19:14:47 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pymongo (Old) and /work/SRC/openSUSE:Factory/.python-pymongo.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pymongo" Changes: -------- --- /work/SRC/openSUSE:Factory/python-pymongo/python-pymongo.changes 2015-08-05 06:50:36.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-pymongo.new/python-pymongo.changes 2015-08-05 19:14:51.000000000 +0200 @@ -1,0 +2,15 @@ +Wed Aug 5 00:49:55 UTC 2015 - jacobwin...@gmail.com + +- Update to 3.0.3, fixes: + * PYTHON-942: Error in changelog guidance for Python 3 (find timeout parameter) + * PYTHON-934: Unable to specify ssl_match_hostname option using URI style connection string + * PYTHON-946: Undocumented regression in Collection.find - projection tuple no longer allowed + * PYTHON-939: Monitor threads slow to terminate on application shutdown. + * PYTHON-932: Error in GSSAPI / Kerberos + * PYTHON-954: TxMongo is recommended for production use + * PYTHON-945: Remove validation of the OP_REPLY "startingFrom" field + * PYTHON-951: Corrupt GridFS files can send GridOut.read / readline into an infinite loop + * PYTHON-940: Unhelpful and pretty wrong error message + * PYTHON-933: "maxPoolSize=0" allowed, causes hang + +------------------------------------------------------------------- Old: ---- pymongo-3.0.2.tar.gz New: ---- pymongo-3.0.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pymongo.spec ++++++ --- /var/tmp/diff_new_pack.wsyL5P/_old 2015-08-05 19:14:52.000000000 +0200 +++ /var/tmp/diff_new_pack.wsyL5P/_new 2015-08-05 19:14:52.000000000 +0200 @@ -17,7 +17,7 @@ Name: python-pymongo -Version: 3.0.2 +Version: 3.0.3 Release: 0 Url: http://github.com/mongodb/mongo-python-driver Summary: Python driver for MongoDB ++++++ pymongo-3.0.2.tar.gz -> pymongo-3.0.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/MANIFEST.in new/pymongo-3.0.3/MANIFEST.in --- old/pymongo-3.0.2/MANIFEST.in 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/MANIFEST.in 2015-07-01 02:07:31.000000000 +0200 @@ -6,6 +6,7 @@ recursive-include doc *.conf recursive-include doc *.css recursive-include doc *.js +recursive-include doc *.png recursive-include tools *.py include tools/README.rst recursive-include test *.pem diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/PKG-INFO new/pymongo-3.0.3/PKG-INFO --- old/pymongo-3.0.2/PKG-INFO 2015-05-12 21:28:05.000000000 +0200 +++ new/pymongo-3.0.3/PKG-INFO 2015-07-01 02:43:33.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: pymongo -Version: 3.0.2 +Version: 3.0.3 Summary: Python driver for MongoDB <http://www.mongodb.org> Home-page: http://github.com/mongodb/mongo-python-driver Author: Bernie Hackett diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/doc/changelog.rst new/pymongo-3.0.3/doc/changelog.rst --- old/pymongo-3.0.2/doc/changelog.rst 2015-05-12 01:11:51.000000000 +0200 +++ new/pymongo-3.0.3/doc/changelog.rst 2015-07-01 02:07:31.000000000 +0200 @@ -1,6 +1,20 @@ Changelog ========= +Changes in Version 3.0.3 +------------------------ + +Version 3.0.3 fixes issues reported since the release of 3.0.2, including a +feature breaking bug in the GSSAPI implementation. + +Issues Resolved +............... + +See the `PyMongo 3.0.3 release notes in JIRA`_ for the list of resolved issues +in this release. + +.. _PyMongo 3.0.3 release notes in JIRA: https://jira.mongodb.org/browse/PYTHON/fixforversion/15528 + Changes in Version 3.0.2 ------------------------ @@ -379,7 +393,6 @@ - spec -> filter - fields -> projection -- timeout -> no_cursor_timeout - partial -> allow_partial_results The following find/find_one options have been added: @@ -415,6 +428,13 @@ - manipulate +The following renames need special handling. + +- timeout -> no_cursor_timeout - + The default for `timeout` was True. The default for `no_cursor_timeout` is + False. If you were previously passing False for `timeout` you must pass + **True** for `no_cursor_timeout` to keep the previous behavior. + :mod:`~pymongo.errors` changes .............................. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/doc/developer/index.rst new/pymongo-3.0.3/doc/developer/index.rst --- old/pymongo-3.0.2/doc/developer/index.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/pymongo-3.0.3/doc/developer/index.rst 2015-07-01 02:07:31.000000000 +0200 @@ -0,0 +1,9 @@ +Developer Guide +=============== + +Technical guide for contributors to PyMongo. + +.. toctree:: + :maxdepth: 1 + + periodic_executor diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/doc/developer/periodic_executor.rst new/pymongo-3.0.3/doc/developer/periodic_executor.rst --- old/pymongo-3.0.2/doc/developer/periodic_executor.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/pymongo-3.0.3/doc/developer/periodic_executor.rst 2015-07-01 02:07:31.000000000 +0200 @@ -0,0 +1,69 @@ +Periodic Executors +================== + +.. currentmodule:: pymongo + +PyMongo implements a :class:`~periodic_executor.PeriodicExecutor` for two +purposes: as the background thread for :class:`~monitor.Monitor`, and to +regularly check if there are `OP_KILL_CURSORS` messages that must be sent to the server. + +Monitoring +---------- + +For each server in the topology, :class:`~topology.Topology` launches a +monitor thread. This thread must not prevent the topology from being freed, +so it weakrefs the topology. Furthermore, it uses a weakref callback to close +itself promptly when the topology is freed. + +Solid lines represent strong references, dashed lines weak ones: + +.. generated with graphviz from periodic-executor-refs.dot + +.. image:: ../static/periodic-executor-refs.png + +See `Stopping Executors`_ below for an explanation of ``_EXECUTORS``. + +Killing Cursors +--------------- + +An incompletely iterated :class:`~cursor.Cursor` on the client represents an +open cursor object on the server. In code like this, we lose a reference to +the cursor before finishing iteration:: + + for doc in collection.find(): + raise Exception() + +We try to send an `OP_KILL_CURSORS` to the server to tell it to clean up the +server-side cursor. But we must not take any locks directly from the cursor's +destructor (see `PYTHON-799 <https://jira.mongodb.org/browse/PYTHON-799>`_), +so we cannot safely use the PyMongo data structures required to send a message. +The solution is to add the cursor's id to an array on the +:class:`~mongo_client.MongoClient` without taking any locks. + +Each client has a :class:`~periodic_executor.PeriodicExecutor` devoted to +checking the array for cursor ids. Any it sees are the result of cursors that +were freed while the server-side cursor was still open. The executor can safely +take the locks it needs in order to send the `OP_KILL_CURSORS` message. + +Stopping Executors +------------------ + +Just as :class:`~cursor.Cursor` must not take any locks from its destructor, +neither can :class:`~mongo_client.MongoClient` and :class:`~topology.Topology`. +Thus, although the client calls :meth:`close` on its kill-cursors thread, and +the topology calls :meth:`close` on all its monitor threads, the :meth:`close` +method cannot actually call :meth:`wake` on the executor, since :meth:`wake` +takes a lock. + +Instead, executors wake very frequently to check if ``self.close`` is set, +and if so they exit. + +A thread can log spurious errors if it wakes late in the Python interpreter's +shutdown sequence, so we try to join threads before then. Each periodic +executor (either a monitor or a kill-cursors thread) adds a weakref to itself +to a set called ``_EXECUTORS``, in the ``periodic_executor`` module. + +An `exit handler`_ runs on shutdown and tells all executors to stop, then +tries (with a short timeout) to join all executor threads. + +.. _exit handler: https://docs.python.org/2/library/atexit.html diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/doc/faq.rst new/pymongo-3.0.3/doc/faq.rst --- old/pymongo-3.0.2/doc/faq.rst 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/doc/faq.rst 2015-07-01 02:07:31.000000000 +0200 @@ -86,8 +86,8 @@ `Motor <https://github.com/mongodb/motor>`_ project. For `Twisted <http://twistedmatrix.com/>`_, see `TxMongo -<http://github.com/fiorix/mongo-async-python-driver>`_. Compared to PyMongo, -TxMongo is less stable, lacks features, and is less actively maintained. +<https://github.com/twisted/txmongo>`_. Its stated mission is to keep feature +parity with PyMongo. Key order in subdocuments -- why does my query work in the shell but not PyMongo? --------------------------------------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/doc/index.rst new/pymongo-3.0.3/doc/index.rst --- old/pymongo-3.0.2/doc/index.rst 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/doc/index.rst 2015-07-01 02:07:31.000000000 +0200 @@ -32,6 +32,9 @@ A listing of Python tools and libraries that have been written for MongoDB. +:doc:`developer/index` + Developer guide for contributors to PyMongo. + Getting Help ------------ If you're having trouble or have questions about PyMongo, the best place to ask is the `MongoDB user group <http://groups.google.com/group/mongodb-user>`_. Once you get an answer, it'd be great if you could work it back into this documentation and contribute! @@ -88,4 +91,4 @@ contributors changelog python3 - + developer/index Files old/pymongo-3.0.2/doc/static/periodic-executor-refs.png and new/pymongo-3.0.3/doc/static/periodic-executor-refs.png differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/doc/tools.rst new/pymongo-3.0.3/doc/tools.rst --- old/pymongo-3.0.2/doc/tools.rst 2015-05-08 01:13:35.000000000 +0200 +++ new/pymongo-3.0.3/doc/tools.rst 2015-07-01 02:07:31.000000000 +0200 @@ -135,6 +135,5 @@ * `Motor <https://github.com/mongodb/motor>`_ is a full-featured, non-blocking MongoDB driver for Python Tornado applications. -* `TxMongo <http://github.com/fiorix/mongo-async-python-driver>`_ is an - asynchronous Python driver for MongoDB, although it is not currently - recommended for production use. +* `TxMongo <https://github.com/twisted/txmongo>`_ is an asynchronous Twisted + Python driver for MongoDB. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/gridfs/grid_file.py new/pymongo-3.0.3/gridfs/grid_file.py --- old/pymongo-3.0.2/gridfs/grid_file.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/gridfs/grid_file.py 2015-07-01 02:07:31.000000000 +0200 @@ -434,6 +434,9 @@ chunk_data = chunk["data"][self.__position % chunk_size:] + if not chunk_data: + raise CorruptGridFile("truncated chunk") + self.__position += len(chunk_data) self.__buffer = EMPTY return chunk_data diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/__init__.py new/pymongo-3.0.3/pymongo/__init__.py --- old/pymongo-3.0.2/pymongo/__init__.py 2015-05-12 21:21:52.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/__init__.py 2015-07-01 02:26:33.000000000 +0200 @@ -70,7 +70,7 @@ ALL = 2 """Profile all operations.""" -version_tuple = (3, 0, 2) +version_tuple = (3, 0, 3) def get_version_string(): if isinstance(version_tuple[-1], str): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/auth.py new/pymongo-3.0.3/pymongo/auth.py --- old/pymongo-3.0.2/pymongo/auth.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/auth.py 2015-07-01 02:07:31.000000000 +0200 @@ -241,8 +241,9 @@ gsn = credentials.mechanism_properties.service_name # Starting here and continuing through the while loop below - establish # the security context. See RFC 4752, Section 3.1, first paragraph. + host = sock_info.address[0] result, ctx = kerberos.authGSSClientInit( - gsn + '@' + sock_info.host, gssflags=kerberos.GSS_C_MUTUAL_FLAG) + gsn + '@' + host, gssflags=kerberos.GSS_C_MUTUAL_FLAG) if result != kerberos.AUTH_GSS_COMPLETE: raise OperationFailure('Kerberos context failed to initialize.') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/command_cursor.py new/pymongo-3.0.3/pymongo/command_cursor.py --- old/pymongo-3.0.2/pymongo/command_cursor.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/command_cursor.py 2015-07-01 02:07:31.000000000 +0200 @@ -117,10 +117,6 @@ if self.__id == 0: self.__killed = True - assert doc["starting_from"] == self.__retrieved, ( - "Result batch started from %s, expected %s" % ( - doc['starting_from'], self.__retrieved)) - self.__retrieved += doc["number_returned"] self.__data = deque(doc["data"]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/common.py new/pymongo-3.0.3/pymongo/common.py --- old/pymongo-3.0.2/pymongo/common.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/common.py 2015-07-01 02:07:31.000000000 +0200 @@ -140,15 +140,25 @@ def validate_positive_integer(option, value): - """Validate that 'value' is a positive integer. + """Validate that 'value' is a positive integer, which does not include 0. """ val = validate_integer(option, value) - if val < 0: + if val <= 0: raise ValueError("The value of %s must be " "a positive integer" % (option,)) return val +def validate_non_negative_integer(option, value): + """Validate that 'value' is a positive integer or 0. + """ + val = validate_integer(option, value) + if val < 0: + raise ValueError("The value of %s must be " + "a non negative integer" % (option,)) + return val + + def validate_readable(option, value): """Validates that 'value' is file-like and readable. """ @@ -169,6 +179,14 @@ return validate_positive_integer(option, value) +def validate_non_negative_integer_or_none(option, value): + """Validate that 'value' is a positive integer or 0 or None. + """ + if value is None: + return value + return validate_non_negative_integer(option, value) + + def validate_string(option, value): """Validates that 'value' is an instance of `basestring` for Python 2 or `str` for Python 3. @@ -392,13 +410,13 @@ 'socketkeepalive': validate_boolean_or_string, 'sockettimeoutms': validate_timeout_or_none, 'waitqueuetimeoutms': validate_timeout_or_none, - 'waitqueuemultiple': validate_positive_integer_or_none, + 'waitqueuemultiple': validate_non_negative_integer_or_none, 'ssl': validate_boolean_or_string, 'ssl_keyfile': validate_readable, 'ssl_certfile': validate_readable, 'ssl_cert_reqs': validate_cert_reqs, 'ssl_ca_certs': validate_readable, - 'ssl_match_hostname': validate_boolean, + 'ssl_match_hostname': validate_boolean_or_string, 'read_preference': validate_read_preference, 'readpreference': validate_read_preference_mode, 'readpreferencetags': validate_read_preference_tags, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/cursor.py new/pymongo-3.0.3/pymongo/cursor.py --- old/pymongo-3.0.2/pymongo/cursor.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/cursor.py 2015-07-01 02:07:31.000000000 +0200 @@ -864,12 +864,6 @@ if self.__id == 0: self.__killed = True - # starting from doesn't get set on getmore's for tailable cursors - if not self.__query_flags & _QUERY_OPTIONS["tailable_cursor"]: - assert doc["starting_from"] == self.__retrieved, ( - "Result batch started from %s, expected %s" % ( - doc['starting_from'], self.__retrieved)) - self.__retrieved += doc["number_returned"] self.__data = deque(doc["data"]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/helpers.py new/pymongo-3.0.3/pymongo/helpers.py --- old/pymongo-3.0.2/pymongo/helpers.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/helpers.py 2015-07-01 02:07:31.000000000 +0200 @@ -270,7 +270,7 @@ def _fields_list_to_dict(fields, option_name): - """Takes a list of field names and returns a matching dictionary. + """Takes a sequence of field names and returns a matching dictionary. ["a", "b"] becomes {"a": 1, "b": 1} @@ -280,15 +280,13 @@ """ if isinstance(fields, collections.Mapping): return fields - elif isinstance(fields, list): - as_dict = {} - for field in fields: - if not isinstance(field, string_type): - raise TypeError("%s must be a list of key names, each an " - "instance of %s" % (option_name, - string_type.__name__)) - as_dict[field] = 1 - return as_dict - else: - raise TypeError("%s must be a mapping or " - "list of key names" % (option_name,)) + + if isinstance(fields, collections.Sequence): + if not all(isinstance(field, string_type) for field in fields): + raise TypeError("%s must be a list of key names, each an " + "instance of %s" % (option_name, + string_type.__name__)) + return dict.fromkeys(fields, 1) + + raise TypeError("%s must be a mapping or " + "list of key names" % (option_name,)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/mongo_client.py new/pymongo-3.0.3/pymongo/mongo_client.py --- old/pymongo-3.0.2/pymongo/mongo_client.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/mongo_client.py 2015-07-01 02:07:31.000000000 +0200 @@ -117,7 +117,7 @@ - `maxPoolSize` (optional): The maximum number of connections that the pool will open simultaneously. If this is set, operations will block if there are `maxPoolSize` outstanding connections - from the pool. Defaults to 100. + from the pool. Defaults to 100. Cannot be 0. - `socketTimeoutMS`: (integer or None) Controls how long (in milliseconds) the driver will wait for a response after sending an ordinary (non-monitoring) database operation before concluding that diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/network.py new/pymongo-3.0.3/pymongo/network.py --- old/pymongo-3.0.2/pymongo/network.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/network.py 2015-07-01 02:07:31.000000000 +0200 @@ -60,13 +60,19 @@ header = _receive_data_on_socket(sock, 16) length = _UNPACK_INT(header[:4])[0] + actual_op = _UNPACK_INT(header[12:])[0] + assert operation == actual_op, ("wire protocol error: " + "unknown opcode %r" % (actual_op,)) # No request_id for exhaust cursor "getMore". if request_id is not None: response_id = _UNPACK_INT(header[8:12])[0] - assert request_id == response_id, "ids don't match %r %r" % ( - request_id, response_id) + assert request_id == response_id, ( + "wire protocol error: got response id %r but expected %r" + % (response_id, request_id)) + + assert length > 16, ("wire protocol error: message length is shorter" + " than standard message header: %r" % (length,)) - assert operation == _UNPACK_INT(header[12:])[0] return _receive_data_on_socket(sock, length - 16) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo/periodic_executor.py new/pymongo-3.0.3/pymongo/periodic_executor.py --- old/pymongo-3.0.2/pymongo/periodic_executor.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/pymongo/periodic_executor.py 2015-07-01 02:07:31.000000000 +0200 @@ -70,7 +70,7 @@ callback; see monitor.py. Since this can be called from a weakref callback during garbage - collection it must take no locks! + collection it must take no locks! That means it cannot call wake(). """ self._stopped = True @@ -132,10 +132,19 @@ def _shutdown_executors(): # Copy the set. Stopping threads has the side effect of removing executors. executors = list(_EXECUTORS) + + # First signal all executors to close... for ref in executors: executor = ref() if executor: executor.close() - executor.join(10) + + # ...then try to join them. + for ref in executors: + executor = ref() + if executor: + executor.join(1) + + executor = None atexit.register(_shutdown_executors) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo.egg-info/PKG-INFO new/pymongo-3.0.3/pymongo.egg-info/PKG-INFO --- old/pymongo-3.0.2/pymongo.egg-info/PKG-INFO 2015-05-12 21:28:05.000000000 +0200 +++ new/pymongo-3.0.3/pymongo.egg-info/PKG-INFO 2015-07-01 02:43:33.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: pymongo -Version: 3.0.2 +Version: 3.0.3 Summary: Python driver for MongoDB <http://www.mongodb.org> Home-page: http://github.com/mongodb/mongo-python-driver Author: Bernie Hackett diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/pymongo.egg-info/SOURCES.txt new/pymongo-3.0.3/pymongo.egg-info/SOURCES.txt --- old/pymongo-3.0.2/pymongo.egg-info/SOURCES.txt 2015-05-12 21:28:05.000000000 +0200 +++ new/pymongo-3.0.3/pymongo.egg-info/SOURCES.txt 2015-07-01 02:43:33.000000000 +0200 @@ -77,6 +77,8 @@ doc/api/pymongo/son_manipulator.rst doc/api/pymongo/uri_parser.rst doc/api/pymongo/write_concern.rst +doc/developer/index.rst +doc/developer/periodic_executor.rst doc/examples/aggregation.rst doc/examples/authentication.rst doc/examples/bulk.rst @@ -91,6 +93,7 @@ doc/examples/tls.rst doc/pydoctheme/theme.conf doc/pydoctheme/static/pydoctheme.css +doc/static/periodic-executor-refs.png doc/static/sidebar.js gridfs/__init__.py gridfs/errors.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/setup.py new/pymongo-3.0.3/setup.py --- old/pymongo-3.0.2/setup.py 2015-05-12 21:21:41.000000000 +0200 +++ new/pymongo-3.0.3/setup.py 2015-07-01 02:26:19.000000000 +0200 @@ -26,7 +26,7 @@ from distutils.errors import DistutilsPlatformError, DistutilsExecError from distutils.core import Extension -version = "3.0.2" +version = "3.0.3" f = open("README.rst") try: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/test/test_client.py new/pymongo-3.0.3/test/test_client.py --- old/pymongo-3.0.2/test/test_client.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/test/test_client.py 2015-07-01 02:07:31.000000000 +0200 @@ -121,6 +121,10 @@ self.assertRaises(ConfigurationError, MongoClient, []) + def test_max_pool_size_zero(self): + with self.assertRaises(ValueError): + MongoClient(maxPoolSize=0) + def test_get_db(self): def make_db(base, name): return base[name] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/test/test_database.py new/pymongo-3.0.3/test/test_database.py --- old/pymongo-3.0.2/test/test_database.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/test/test_database.py 2015-07-01 02:07:31.000000000 +0200 @@ -524,7 +524,7 @@ # Admin read-only user should be able to query any db, # but not write. admin_db.authenticate('ro-admin', 'pass') - self.assertEqual(0, other_db.test.count()) + self.assertEqual(None, other_db.test.find_one()) self.assertRaises(OperationFailure, other_db.test.insert_one, {}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/test/test_gridfs.py new/pymongo-3.0.3/test/test_gridfs.py --- old/pymongo-3.0.2/test/test_gridfs.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/test/test_gridfs.py 2015-07-01 02:07:31.000000000 +0200 @@ -24,12 +24,12 @@ import time import gridfs +from bson.binary import Binary from bson.py3compat import u, StringIO, string_type from pymongo.mongo_client import MongoClient from pymongo.errors import ConfigurationError, ConnectionFailure from pymongo.read_preferences import ReadPreference -from gridfs.errors import (FileExists, - NoFile) +from gridfs.errors import CorruptGridFile, FileExists, NoFile from test.test_replica_set_client import TestReplicaSetClientBase from test import (client_context, unittest, @@ -159,6 +159,19 @@ self.assertEqual(255 * 1024, raw["chunkSize"]) self.assertTrue(isinstance(raw["md5"], string_type)) + def test_corrupt_chunk(self): + files_id = self.fs.put(b'foobar') + self.db.fs.chunks.update_one({'files_id': files_id}, + {'$set': {'data': Binary(b'foo', 0)}}) + try: + out = self.fs.get(files_id) + self.assertRaises(CorruptGridFile, out.read) + + out = self.fs.get(files_id) + self.assertRaises(CorruptGridFile, out.readline) + finally: + self.fs.delete(files_id) + def test_delete_ensures_index(self): # setUp has dropped collections. names = self.db.collection_names() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/test/test_pooling.py new/pymongo-3.0.3/test/test_pooling.py --- old/pymongo-3.0.2/test/test_pooling.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/test/test_pooling.py 2015-07-01 02:07:31.000000000 +0200 @@ -428,6 +428,10 @@ self.assertEqual(nthreads, self.n_passed) self.assertTrue(len(cx_pool.sockets) > 1) + def test_max_pool_size_zero(self): + with self.assertRaises(ValueError): + rs_or_single_client(maxPoolSize=0) + def test_max_pool_size_with_connection_failure(self): # The pool acquires its semaphore before attempting to connect; ensure # it releases the semaphore on connection failure. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/test/test_ssl.py new/pymongo-3.0.3/test/test_ssl.py --- old/pymongo-3.0.2/test/test_ssl.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/test/test_ssl.py 2015-07-01 02:07:31.000000000 +0200 @@ -339,7 +339,7 @@ "hostname in the certificate") uri_fmt = ("mongodb://server/?ssl=true&ssl_certfile=%s&ssl_cert_reqs" - "=%s&ssl_ca_certs=%s") + "=%s&ssl_ca_certs=%s&ssl_match_hostname=true") client = MongoClient(uri_fmt % (CLIENT_PEM, 'CERT_REQUIRED', CA_PEM)) db = client.pymongo_ssl_test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymongo-3.0.2/test/test_uri_parser.py new/pymongo-3.0.3/test/test_uri_parser.py --- old/pymongo-3.0.2/test/test_uri_parser.py 2015-05-12 00:51:23.000000000 +0200 +++ new/pymongo-3.0.3/test/test_uri_parser.py 2015-07-01 02:07:31.000000000 +0200 @@ -102,6 +102,10 @@ self.assertRaises(ValueError, split_options, 'connectTimeoutMS=0.0') self.assertRaises(ValueError, split_options, 'connectTimeoutMS=1e100000') self.assertRaises(ValueError, split_options, 'connectTimeoutMS=-1e100000') + self.assertRaises(ValueError, split_options, 'ssl=foo') + self.assertTrue(split_options('ssl=true')) + self.assertRaises(ValueError, split_options, 'ssl_match_hostname=foo') + self.assertTrue(split_options('ssl_match_hostname=true')) # On most platforms float('inf') and float('-inf') represent # +/- infinity, although on Python 2.4 and 2.5 on Windows those