Hello community, here is the log from the commit of package python-zc.lockfile for openSUSE:Factory checked in at 2019-04-19 18:36:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-zc.lockfile (Old) and /work/SRC/openSUSE:Factory/.python-zc.lockfile.new.5536 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-zc.lockfile" Fri Apr 19 18:36:14 2019 rev:5 rq:693255 version:1.4 Changes: -------- --- /work/SRC/openSUSE:Factory/python-zc.lockfile/python-zc.lockfile.changes 2017-07-08 12:34:56.301893024 +0200 +++ /work/SRC/openSUSE:Factory/.python-zc.lockfile.new.5536/python-zc.lockfile.changes 2019-04-19 18:36:15.487022777 +0200 @@ -1,0 +2,9 @@ +Tue Apr 9 11:06:01 UTC 2019 - Marketa Calabkova <mcalabk...@suse.com> + +- update to version 1.4 + * Claim support for Python 3.4, 3.5, 3.6 and 3.7. + * Drop Python 2.6, 3.2 and 3.3. + * Stop logging failure to acquire locks. Clients can do that if + they wish. + +------------------------------------------------------------------- Old: ---- zc.lockfile-1.2.1.tar.gz New: ---- zc.lockfile-1.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-zc.lockfile.spec ++++++ --- /var/tmp/diff_new_pack.a4exkv/_old 2019-04-19 18:36:16.127023590 +0200 +++ /var/tmp/diff_new_pack.a4exkv/_new 2019-04-19 18:36:16.131023595 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-zc.lockfile # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # Copyright (c) 2013 LISA GmbH, Bingen, Germany. # # All modifications and additions to the file contributed by third parties @@ -13,28 +13,26 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-zc.lockfile -Version: 1.2.1 +Version: 1.4 Release: 0 Summary: Basic inter-process locks License: ZPL-2.1 Group: Development/Libraries/Python -Url: https://pypi.python.org/pypi/zc.lockfile +URL: https://pypi.python.org/pypi/zc.lockfile Source: https://files.pythonhosted.org/packages/source/z/zc.lockfile/zc.lockfile-%{version}.tar.gz +BuildRequires: %{python_module mock} BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module zope.testing} BuildRequires: fdupes BuildRequires: python-rpm-macros -# Testing requirements: -BuildRequires: %{python_module mock} -BuildRequires: %{python_module zope.testing} Provides: python-zc-lockfile = %{version} Obsoletes: python-zc-lockfile < %{version} -BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildArch: noarch %python_subpackages @@ -60,14 +58,14 @@ # concatenate both README.txt cat %{buildroot}%{python_sitelib}/zc/lockfile/README.txt >> README.txt rm %{buildroot}%{python_sitelib}/zc/lockfile/README.txt -%python_expand %fdupes -s %{buildroot}%{$python_sitelib} +%python_expand %fdupes %{buildroot}%{$python_sitelib} %check %python_exec setup.py test %files %{python_files} -%defattr(-,root,root) -%doc CHANGES.txt COPYRIGHT.txt LICENSE.txt README.txt +%license LICENSE.txt +%doc CHANGES.rst COPYRIGHT.txt README.txt %{python_sitelib}/* %changelog ++++++ zc.lockfile-1.2.1.tar.gz -> zc.lockfile-1.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/.gitignore new/zc.lockfile-1.4/.gitignore --- old/zc.lockfile-1.2.1/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/zc.lockfile-1.4/.gitignore 2018-11-12 10:59:04.000000000 +0100 @@ -0,0 +1,4 @@ +*.egg-info/ +*.pyc +/.eggs/ +/.tox/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/.travis.yml new/zc.lockfile-1.4/.travis.yml --- old/zc.lockfile-1.2.1/.travis.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/zc.lockfile-1.4/.travis.yml 2018-11-12 10:59:04.000000000 +0100 @@ -0,0 +1,19 @@ +language: python +python: + - 2.7 + - 3.4 + - 3.5 + - 3.6 + - pypy + - pypy3 +matrix: + include: + - python: "3.7" + dist: xenial + sudo: true +install: + - pip install . +script: + - python setup.py test -q +notifications: + email: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/CHANGES.rst new/zc.lockfile-1.4/CHANGES.rst --- old/zc.lockfile-1.2.1/CHANGES.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/zc.lockfile-1.4/CHANGES.rst 2018-11-12 10:59:04.000000000 +0100 @@ -0,0 +1,72 @@ +Change History +*************** + +1.4 (2018-11-12) +================ + +- Claim support for Python 3.6 and 3.7. + +- Drop Python 2.6 and 3.3. + + +1.3.0 (2018-04-23) +================== + +- Stop logging failure to acquire locks. Clients can do that if they wish. + +- Claim support for Python 3.4 and 3.5. + +- Drop Python 3.2 support because pip no longer supports it. + +1.2.1 (2016-06-19) +================== + +- Fixed: unlocking and locking didn't work when a multiprocessing + process was running (and presumably other conditions). + +1.2.0 (2016-06-09) +================== + +- Added the ability to include the hostname in the lock file content. + +- Code and ReST markup cosmetics. + [alecghica] + +1.1.0 (2013-02-12) +================== + +- Added Trove classifiers and made setup.py zest.releaser friendly. + +- Added Python 3.2, 3.3 and PyPy 1.9 support. + +- Removed Python 2.4 and Python 2.5 support. + +1.0.2 (2012-12-02) +================== + +- Fixed: the fix included in 1.0.1 caused multiple pids to be written + to the lock file + +1.0.1 (2012-11-30) +================== + +- Fixed: when there was lock contention, the pid in the lock file was + lost. + + Thanks to Daniel Moisset reporting the problem and providing a fix + with tests. + +- Added test extra to declare test dependency on ``zope.testing``. + +- Using Python's ``doctest`` module instead of depreacted + ``zope.testing.doctest``. + +1.0.0 (2008-10-18) +================== + +- Fixed a small bug in error logging. + +1.0.0b1 (2007-07-18) +==================== + +- Initial release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/CHANGES.txt new/zc.lockfile-1.4/CHANGES.txt --- old/zc.lockfile-1.2.1/CHANGES.txt 2016-06-19 18:26:16.000000000 +0200 +++ new/zc.lockfile-1.4/CHANGES.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,55 +0,0 @@ -Change History -*************** - -1.2.1 (2016-06-19) -================== - -- Fixed: unlocking and locking didn't work when a multiprocessing - process was running (and presumably other conditions). - -1.2.0 (2016-06-09) -================== - -- Added the ability to include the hostname in the lock file content. - -- Code and ReST markup cosmetics. - [alecghica] - -1.1.0 (2013-02-12) -================== - -- Added Trove classifiers and made setup.py zest.releaser friendly. - -- Added Python 3.2, 3.3 and PyPy 1.9 support. - -- Removed Python 2.4 and Python 2.5 support. - -1.0.2 (2012-12-02) -================== - -- Fixed: the fix included in 1.0.1 caused multiple pids to be written - to the lock file - -1.0.1 (2012-11-30) -================== - -- Fixed: when there was lock contention, the pid in the lock file was - lost. - - Thanks to Daniel Moisset reporting the problem and providing a fix - with tests. - -- Added test extra to declare test dependency on ``zope.testing``. - -- Using Python's ``doctest`` module instead of depreacted - ``zope.testing.doctest``. - -1.0.0 (2008-10-18) -================== - -- Fixed a small bug in error logging. - -1.0.0b1 (2007-07-18) -==================== - -- Initial release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/PKG-INFO new/zc.lockfile-1.4/PKG-INFO --- old/zc.lockfile-1.2.1/PKG-INFO 2016-06-19 18:27:21.000000000 +0200 +++ new/zc.lockfile-1.4/PKG-INFO 2018-11-12 10:59:05.000000000 +0100 @@ -1,6 +1,6 @@ -Metadata-Version: 1.1 +Metadata-Version: 2.1 Name: zc.lockfile -Version: 1.2.1 +Version: 1.4 Summary: Basic inter-process locks Home-page: http://www.python.org/pypi/zc.lockfile Author: Zope Foundation @@ -45,9 +45,10 @@ ... print("Can't lock file") Can't lock file + .. We don't log failure to acquire. + >>> for record in handler.records: # doctest: +ELLIPSIS ... print(record.levelname+' '+record.getMessage()) - ERROR Error locking file lock; pid=... To release the lock, use it's close method: @@ -97,6 +98,23 @@ Change History *************** + 1.4 (2018-11-12) + ================ + + - Claim support for Python 3.6 and 3.7. + + - Drop Python 2.6 and 3.3. + + + 1.3.0 (2018-04-23) + ================== + + - Stop logging failure to acquire locks. Clients can do that if they wish. + + - Claim support for Python 3.4 and 3.5. + + - Drop Python 3.2 support because pip no longer supports it. + 1.2.1 (2016-06-19) ================== @@ -150,9 +168,6 @@ - Initial release - Download - ********************** - Keywords: lock Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable @@ -163,11 +178,13 @@ Classifier: Operating System :: Microsoft :: Windows Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development +Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/README.rst new/zc.lockfile-1.4/README.rst --- old/zc.lockfile-1.2.1/README.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/zc.lockfile-1.4/README.rst 2018-11-12 10:59:04.000000000 +0100 @@ -0,0 +1,14 @@ +************************* +Basic inter-process locks +************************* + +The zc.lockfile package provides a basic portable implementation of +interprocess locks using lock files. The purpose if not specifically +to lock files, but to simply provide locks with an implementation +based on file-locking primitives. Of course, these locks could be +used to mediate access to *other* files. For example, the ZODB file +storage implementation uses file locks to mediate access to +file-storage database files. The database files and lock file files +are separate files. + +.. contents:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/README.txt new/zc.lockfile-1.4/README.txt --- old/zc.lockfile-1.2.1/README.txt 2016-06-09 14:48:53.000000000 +0200 +++ new/zc.lockfile-1.4/README.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,14 +0,0 @@ -************************* -Basic inter-process locks -************************* - -The zc.lockfile package provides a basic portable implementation of -interprocess locks using lock files. The purpose if not specifically -to lock files, but to simply provide locks with an implementation -based on file-locking primitives. Of course, these locks could be -used to mediate access to *other* files. For example, the ZODB file -storage implementation uses file locks to mediate access to -file-storage database files. The database files and lock file files -are separate files. - -.. contents:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/doc.txt new/zc.lockfile-1.4/doc.txt --- old/zc.lockfile-1.2.1/doc.txt 2016-06-19 18:27:21.000000000 +0200 +++ new/zc.lockfile-1.4/doc.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,146 +0,0 @@ -************************* -Basic inter-process locks -************************* - -The zc.lockfile package provides a basic portable implementation of -interprocess locks using lock files. The purpose if not specifically -to lock files, but to simply provide locks with an implementation -based on file-locking primitives. Of course, these locks could be -used to mediate access to *other* files. For example, the ZODB file -storage implementation uses file locks to mediate access to -file-storage database files. The database files and lock file files -are separate files. - -.. contents:: - -Detailed Documentation -********************** - -Lock file support -================= - -The ZODB lock_file module provides support for creating file system -locks. These are locks that are implemented with lock files and -OS-provided locking facilities. To create a lock, instantiate a -LockFile object with a file name: - - >>> import zc.lockfile - >>> lock = zc.lockfile.LockFile('lock') - -If we try to lock the same name, we'll get a lock error: - - >>> import zope.testing.loggingsupport - >>> handler = zope.testing.loggingsupport.InstalledHandler('zc.lockfile') - >>> try: - ... zc.lockfile.LockFile('lock') - ... except zc.lockfile.LockError: - ... print("Can't lock file") - Can't lock file - - >>> for record in handler.records: # doctest: +ELLIPSIS - ... print(record.levelname+' '+record.getMessage()) - ERROR Error locking file lock; pid=... - -To release the lock, use it's close method: - - >>> lock.close() - -The lock file is not removed. It is left behind: - - >>> import os - >>> os.path.exists('lock') - True - -Of course, now that we've released the lock, we can create it again: - - >>> lock = zc.lockfile.LockFile('lock') - >>> lock.close() - -.. Cleanup - - >>> import os - >>> os.remove('lock') - -Hostname in lock file -===================== - -In a container environment (e.g. Docker), the PID is typically always -identical even if multiple containers are running under the same operating -system instance. - -Clearly, inspecting lock files doesn't then help much in debugging. To identify -the container which created the lock file, we need information about the -container in the lock file. Since Docker uses the container identifier or name -as the hostname, this information can be stored in the lock file in addition to -or instead of the PID. - -Use the ``content_template`` keyword argument to ``LockFile`` to specify a -custom lock file content format: - - >>> lock = zc.lockfile.LockFile('lock', content_template='{pid};{hostname}') - >>> lock.close() - -If you now inspected the lock file, you would see e.g.: - - $ cat lock - 123;myhostname - - -Change History -*************** - -1.2.1 (2016-06-19) -================== - -- Fixed: unlocking and locking didn't work when a multiprocessing - process was running (and presumably other conditions). - -1.2.0 (2016-06-09) -================== - -- Added the ability to include the hostname in the lock file content. - -- Code and ReST markup cosmetics. - [alecghica] - -1.1.0 (2013-02-12) -================== - -- Added Trove classifiers and made setup.py zest.releaser friendly. - -- Added Python 3.2, 3.3 and PyPy 1.9 support. - -- Removed Python 2.4 and Python 2.5 support. - -1.0.2 (2012-12-02) -================== - -- Fixed: the fix included in 1.0.1 caused multiple pids to be written - to the lock file - -1.0.1 (2012-11-30) -================== - -- Fixed: when there was lock contention, the pid in the lock file was - lost. - - Thanks to Daniel Moisset reporting the problem and providing a fix - with tests. - -- Added test extra to declare test dependency on ``zope.testing``. - -- Using Python's ``doctest`` module instead of depreacted - ``zope.testing.doctest``. - -1.0.0 (2008-10-18) -================== - -- Fixed a small bug in error logging. - -1.0.0b1 (2007-07-18) -==================== - -- Initial release - -Download -********************** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/setup.cfg new/zc.lockfile-1.4/setup.cfg --- old/zc.lockfile-1.2.1/setup.cfg 2016-06-19 18:27:21.000000000 +0200 +++ new/zc.lockfile-1.4/setup.cfg 2018-11-12 10:59:05.000000000 +0100 @@ -1,5 +1,4 @@ [egg_info] tag_build = -tag_svn_revision = 0 tag_date = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/setup.py new/zc.lockfile-1.4/setup.py --- old/zc.lockfile-1.2.1/setup.py 2016-06-19 18:26:39.000000000 +0200 +++ new/zc.lockfile-1.4/setup.py 2018-11-12 10:59:04.000000000 +0100 @@ -12,7 +12,7 @@ # ############################################################################## -version = '1.2.1' +version = '1.4' import os from setuptools import setup, find_packages @@ -25,21 +25,16 @@ return open(os.path.join(os.path.dirname(__file__), *rnames)).read() long_description=( - read('README.txt') + read('README.rst') + '\n' + 'Detailed Documentation\n' '**********************\n' + '\n' + read('src', 'zc', 'lockfile', 'README.txt') + '\n' + - read('CHANGES.txt') - + '\n' + - 'Download\n' - '**********************\n' + read('CHANGES.rst') ) -open('doc.txt', 'w').write(long_description) - setup( name = 'zc.lockfile', version=version, @@ -67,11 +62,12 @@ 'Operating System :: Microsoft :: Windows', 'Programming Language :: Python', 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.2', - 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Software Development', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/src/zc/lockfile/README.txt new/zc.lockfile-1.4/src/zc/lockfile/README.txt --- old/zc.lockfile-1.2.1/src/zc/lockfile/README.txt 2016-06-09 14:48:53.000000000 +0200 +++ new/zc.lockfile-1.4/src/zc/lockfile/README.txt 2018-11-12 10:59:04.000000000 +0100 @@ -19,9 +19,10 @@ ... print("Can't lock file") Can't lock file +.. We don't log failure to acquire. + >>> for record in handler.records: # doctest: +ELLIPSIS ... print(record.levelname+' '+record.getMessage()) - ERROR Error locking file lock; pid=... To release the lock, use it's close method: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/src/zc/lockfile/__init__.py new/zc.lockfile-1.4/src/zc/lockfile/__init__.py --- old/zc.lockfile-1.2.1/src/zc/lockfile/__init__.py 2016-06-19 18:25:46.000000000 +0200 +++ new/zc.lockfile-1.4/src/zc/lockfile/__init__.py 2018-11-12 10:59:04.000000000 +0100 @@ -87,22 +87,10 @@ try: _lock_file(fp) except: - fp.seek(1) - content = fp.read().strip() fp.close() - if content_template == '{pid}': - # Original exception message format when using the default - # lock file template - pid = content[:20] if content else 'UNKNOWN' - logger.exception("Error locking file %s; pid=%s", path, pid) - else: - # Include the first 40 characters of lock file contents for - # custom lock file templates - logger.exception('Error locking file %s; content: "%s%s"', - path, content[:40], - '...' if len(content) > 40 else '') raise + # We got the lock, record info in the file. self._fp = fp fp.write(" %s\n" % content_template.format(pid=os.getpid(), hostname=LazyHostName())) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/src/zc/lockfile/__init__.py~ new/zc.lockfile-1.4/src/zc/lockfile/__init__.py~ --- old/zc.lockfile-1.2.1/src/zc/lockfile/__init__.py~ 2016-06-09 14:48:53.000000000 +0200 +++ new/zc.lockfile-1.4/src/zc/lockfile/__init__.py~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,118 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE -# -############################################################################## - -import os -import errno -import logging -logger = logging.getLogger("zc.lockfile") - -class LockError(Exception): - """Couldn't get a lock - """ - -try: - import fcntl -except ImportError: - try: - import msvcrt - except ImportError: - def _lock_file(file): - raise TypeError('No file-locking support on this platform') - def _unlock_file(file): - raise TypeError('No file-locking support on this platform') - - else: - # Windows - def _lock_file(file): - # Lock just the first byte - try: - msvcrt.locking(file.fileno(), msvcrt.LK_NBLCK, 1) - except IOError: - raise LockError("Couldn't lock %r" % file.name) - - def _unlock_file(file): - try: - file.seek(0) - msvcrt.locking(file.fileno(), msvcrt.LK_UNLCK, 1) - except IOError: - raise LockError("Couldn't unlock %r" % file.name) - -else: - # Unix - _flags = fcntl.LOCK_EX | fcntl.LOCK_NB - - def _lock_file(file): - try: - fcntl.flock(file.fileno(), _flags) - except IOError: - raise LockError("Couldn't lock %r" % file.name) - - def _unlock_file(file): - # File is automatically unlocked on close - pass - - -class LazyHostName(object): - """Avoid importing socket and calling gethostname() unnecessarily""" - def __str__(self): - import socket - return socket.gethostname() - - -class LockFile: - - _fp = None - - def __init__(self, path, content_template='{pid}'): - self._path = path - try: - # Try to open for writing without truncation: - fp = open(path, 'r+') - except IOError: - # If the file doesn't exist, we'll get an IO error, try a+ - # Note that there may be a race here. Multiple processes - # could fail on the r+ open and open the file a+, but only - # one will get the the lock and write a pid. - fp = open(path, 'a+') - - try: - _lock_file(fp) - except: - fp.seek(1) - content = fp.read().strip() - fp.close() - if content_template == '{pid}': - # Original exception message format when using the default - # lock file template - pid = content[:20] if content else 'UNKNOWN' - logger.exception("Error locking file %s; pid=%s", path, pid) - else: - # Include the first 40 characters of lock file contents for - # custom lock file templates - logger.exception('Error locking file %s; content: "%s%s"', - path, content[:40], - '...' if len(content) > 40 else '') - raise - - self._fp = fp - fp.write(" %s\n" % content_template.format(pid=os.getpid(), - hostname=LazyHostName())) - fp.truncate() - fp.flush() - - def close(self): - if self._fp is not None: - _unlock_file(self._fp) - self._fp.close() - self._fp = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/src/zc/lockfile/tests.py new/zc.lockfile-1.4/src/zc/lockfile/tests.py --- old/zc.lockfile-1.2.1/src/zc/lockfile/tests.py 2016-06-19 18:25:46.000000000 +0200 +++ new/zc.lockfile-1.4/src/zc/lockfile/tests.py 2018-11-12 10:59:04.000000000 +0100 @@ -150,40 +150,16 @@ os.chdir(self.here) setupstack.rmtree(self.tmp) - def test_log_entry(self): + def test_log_formatting(self): # PID and hostname are parsed and logged from lock file on failure - test_logger = TestLogger() - - def lock(locked, before_closing): - lock = None - try: + with patch('os.getpid', Mock(return_value=123)): + with patch('socket.gethostname', Mock(return_value='myhostname')): lock = zc.lockfile.LockFile('f.lock', content_template='{pid}/{hostname}') - except Exception: - pass - locked.set() - before_closing.wait() - if lock is not None: - lock.close() + with open('f.lock') as f: + self.assertEqual(' 123/myhostname\n', f.read()) - with patch('os.getpid', Mock(return_value=123)): - with patch('socket.gethostname', Mock(return_value='myhostname')): - with patch.object(zc.lockfile, 'logger', test_logger): - first_locked = threading.Event() - second_locked = threading.Event() - thread1 = threading.Thread( - target=lock, args=(first_locked, second_locked)) - thread2 = threading.Thread( - target=lock, args=(second_locked, second_locked)) - thread1.start() - first_locked.wait() - assert not test_logger.log_entries - thread2.start() - thread1.join() - thread2.join() - expected = [('Error locking file %s; content: "%s%s"', - 'f.lock', '123/myhostname', '')] - assert test_logger.log_entries == expected, test_logger.log_entries + lock.close() def test_unlock_and_lock_while_multiprocessing_process_running(self): import multiprocessing diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/src/zc/lockfile/tests.py~ new/zc.lockfile-1.4/src/zc/lockfile/tests.py~ --- old/zc.lockfile-1.2.1/src/zc/lockfile/tests.py~ 2016-06-09 14:48:53.000000000 +0200 +++ new/zc.lockfile-1.4/src/zc/lockfile/tests.py~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,199 +0,0 @@ -############################################################################## -# -# Copyright (c) 2004 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -import os, re, sys, unittest, doctest -import zc.lockfile, time, threading -from zope.testing import renormalizing, setupstack -import tempfile -try: - from unittest.mock import Mock, patch -except ImportError: - from mock import Mock, patch - -checker = renormalizing.RENormalizing([ - # Python 3 adds module path to error class name. - (re.compile("zc\.lockfile\.LockError:"), - r"LockError:"), - ]) - -def inc(): - while 1: - try: - lock = zc.lockfile.LockFile('f.lock') - except zc.lockfile.LockError: - continue - else: - break - f = open('f', 'r+b') - v = int(f.readline().strip()) - time.sleep(0.01) - v += 1 - f.seek(0) - f.write(('%d\n' % v).encode('ASCII')) - f.close() - lock.close() - -def many_threads_read_and_write(): - r""" - >>> with open('f', 'w+b') as file: - ... _ = file.write(b'0\n') - >>> with open('f.lock', 'w+b') as file: - ... _ = file.write(b'0\n') - - >>> n = 50 - >>> threads = [threading.Thread(target=inc) for i in range(n)] - >>> _ = [thread.start() for thread in threads] - >>> _ = [thread.join() for thread in threads] - >>> with open('f', 'rb') as file: - ... saved = int(file.read().strip()) - >>> saved == n - True - - >>> os.remove('f') - - We should only have one pid in the lock file: - - >>> f = open('f.lock') - >>> len(f.read().strip().split()) - 1 - >>> f.close() - - >>> os.remove('f.lock') - - """ - -def pid_in_lockfile(): - r""" - >>> import os, zc.lockfile - >>> pid = os.getpid() - >>> lock = zc.lockfile.LockFile("f.lock") - >>> f = open("f.lock") - >>> _ = f.seek(1) - >>> f.read().strip() == str(pid) - True - >>> f.close() - - Make sure that locking twice does not overwrite the old pid: - - >>> lock = zc.lockfile.LockFile("f.lock") - Traceback (most recent call last): - ... - LockError: Couldn't lock 'f.lock' - - >>> f = open("f.lock") - >>> _ = f.seek(1) - >>> f.read().strip() == str(pid) - True - >>> f.close() - - >>> lock.close() - """ - - -def hostname_in_lockfile(): - r""" - hostname is correctly written into the lock file when it's included in the - lock file content template - - >>> import zc.lockfile - >>> with patch('socket.gethostname', Mock(return_value='myhostname')): - ... lock = zc.lockfile.LockFile("f.lock", content_template='{hostname}') - >>> f = open("f.lock") - >>> _ = f.seek(1) - >>> f.read().rstrip() - 'myhostname' - >>> f.close() - - Make sure that locking twice does not overwrite the old hostname: - - >>> lock = zc.lockfile.LockFile("f.lock", content_template='{hostname}') - Traceback (most recent call last): - ... - LockError: Couldn't lock 'f.lock' - - >>> f = open("f.lock") - >>> _ = f.seek(1) - >>> f.read().rstrip() - 'myhostname' - >>> f.close() - - >>> lock.close() - """ - - -class TestLogger(object): - def __init__(self): - self.log_entries = [] - - def exception(self, msg, *args): - self.log_entries.append((msg,) + args) - - -class LockFileLogEntryTestCase(unittest.TestCase): - """Tests for logging in case of lock failure""" - def setUp(self): - self.here = os.getcwd() - self.tmp = tempfile.mkdtemp(prefix='zc.lockfile-test-') - os.chdir(self.tmp) - - def tearDown(self): - os.chdir(self.here) - setupstack.rmtree(self.tmp) - - def test_log_entry(self): - # PID and hostname are parsed and logged from lock file on failure - test_logger = TestLogger() - - def lock(locked, before_closing): - lock = None - try: - lock = zc.lockfile.LockFile('f.lock', - content_template='{pid}/{hostname}') - except Exception: - pass - locked.set() - before_closing.wait() - if lock is not None: - lock.close() - - with patch('os.getpid', Mock(return_value=123)): - with patch('socket.gethostname', Mock(return_value='myhostname')): - with patch.object(zc.lockfile, 'logger', test_logger): - first_locked = threading.Event() - second_locked = threading.Event() - thread1 = threading.Thread( - target=lock, args=(first_locked, second_locked)) - thread2 = threading.Thread( - target=lock, args=(second_locked, second_locked)) - thread1.start() - first_locked.wait() - assert not test_logger.log_entries - thread2.start() - thread1.join() - thread2.join() - expected = [('Error locking file %s; content: "%s%s"', - 'f.lock', '123/myhostname', '')] - assert test_logger.log_entries == expected, test_logger.log_entries - - -def test_suite(): - suite = unittest.TestSuite() - suite.addTest(doctest.DocFileSuite( - 'README.txt', checker=checker, - setUp=setupstack.setUpDirectory, tearDown=setupstack.tearDown)) - suite.addTest(doctest.DocTestSuite( - setUp=setupstack.setUpDirectory, tearDown=setupstack.tearDown, - checker=checker)) - # Add unittest test cases from this module - suite.addTest(unittest.defaultTestLoader.loadTestsFromName(__name__)) - return suite diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/src/zc.lockfile.egg-info/PKG-INFO new/zc.lockfile-1.4/src/zc.lockfile.egg-info/PKG-INFO --- old/zc.lockfile-1.2.1/src/zc.lockfile.egg-info/PKG-INFO 2016-06-19 18:27:21.000000000 +0200 +++ new/zc.lockfile-1.4/src/zc.lockfile.egg-info/PKG-INFO 2018-11-12 10:59:05.000000000 +0100 @@ -1,6 +1,6 @@ -Metadata-Version: 1.1 +Metadata-Version: 2.1 Name: zc.lockfile -Version: 1.2.1 +Version: 1.4 Summary: Basic inter-process locks Home-page: http://www.python.org/pypi/zc.lockfile Author: Zope Foundation @@ -45,9 +45,10 @@ ... print("Can't lock file") Can't lock file + .. We don't log failure to acquire. + >>> for record in handler.records: # doctest: +ELLIPSIS ... print(record.levelname+' '+record.getMessage()) - ERROR Error locking file lock; pid=... To release the lock, use it's close method: @@ -97,6 +98,23 @@ Change History *************** + 1.4 (2018-11-12) + ================ + + - Claim support for Python 3.6 and 3.7. + + - Drop Python 2.6 and 3.3. + + + 1.3.0 (2018-04-23) + ================== + + - Stop logging failure to acquire locks. Clients can do that if they wish. + + - Claim support for Python 3.4 and 3.5. + + - Drop Python 3.2 support because pip no longer supports it. + 1.2.1 (2016-06-19) ================== @@ -150,9 +168,6 @@ - Initial release - Download - ********************** - Keywords: lock Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable @@ -163,11 +178,13 @@ Classifier: Operating System :: Microsoft :: Windows Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development +Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/src/zc.lockfile.egg-info/SOURCES.txt new/zc.lockfile-1.4/src/zc.lockfile.egg-info/SOURCES.txt --- old/zc.lockfile-1.2.1/src/zc.lockfile.egg-info/SOURCES.txt 2016-06-19 18:27:21.000000000 +0200 +++ new/zc.lockfile-1.4/src/zc.lockfile.egg-info/SOURCES.txt 2018-11-12 10:59:05.000000000 +0100 @@ -1,11 +1,12 @@ -CHANGES.txt +.gitignore +.travis.yml +CHANGES.rst COPYRIGHT.txt LICENSE.txt MANIFEST.in -README.txt +README.rst bootstrap.py buildout.cfg -doc.txt setup.py tox.ini src/zc/__init__.py @@ -18,6 +19,4 @@ src/zc.lockfile.egg-info/top_level.txt src/zc/lockfile/README.txt src/zc/lockfile/__init__.py -src/zc/lockfile/__init__.py~ -src/zc/lockfile/tests.py -src/zc/lockfile/tests.py~ \ No newline at end of file +src/zc/lockfile/tests.py \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/src/zc.lockfile.egg-info/requires.txt new/zc.lockfile-1.4/src/zc.lockfile.egg-info/requires.txt --- old/zc.lockfile-1.2.1/src/zc.lockfile.egg-info/requires.txt 2016-06-19 18:27:21.000000000 +0200 +++ new/zc.lockfile-1.4/src/zc.lockfile.egg-info/requires.txt 2018-11-12 10:59:05.000000000 +0100 @@ -1,4 +1,5 @@ setuptools [test] +mock zope.testing diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.2.1/tox.ini new/zc.lockfile-1.4/tox.ini --- old/zc.lockfile-1.2.1/tox.ini 2016-06-09 14:48:53.000000000 +0200 +++ new/zc.lockfile-1.4/tox.ini 2018-11-12 10:59:04.000000000 +0100 @@ -1,6 +1,6 @@ [tox] envlist = - py26,py27,py32,py33,pypy,pypy3 + py27,py34,py35,py36,py37,pypy,pypy3 [testenv] commands =