From 35b500bb6fecdffd372b0022e417baa210a88462 Mon Sep 17 00:00:00 2001 From: Rick van Hattem Date: Tue, 2 Aug 2022 00:30:37 +0200 Subject: [PATCH 1/4] Updated license to 3-clause BSD License. Fixes #79 The 3-clause BSD license is effectively the same as the old license but the old license had invalid references to the Python project instead of this project. --- LICENSE | 49 ++++++------------------------------------------- 1 file changed, 6 insertions(+), 43 deletions(-) diff --git a/LICENSE b/LICENSE index adb8038..b638bda 100644 --- a/LICENSE +++ b/LICENSE @@ -1,48 +1,11 @@ -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- +Copyright 2022 Rick van Hattem -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 -Python Software Foundation; All Rights Reserved" are retained in Python alone or -in any derivative version prepared by Licensee. +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 26a1522520f0d8b656db210117fcdcbf6c526ede Mon Sep 17 00:00:00 2001 From: Rick van Hattem Date: Tue, 18 Oct 2022 17:02:30 +0200 Subject: [PATCH 2/4] testing fix for #80 --- portalocker/portalocker.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/portalocker/portalocker.py b/portalocker/portalocker.py index 4bae5e3..f25269f 100644 --- a/portalocker/portalocker.py +++ b/portalocker/portalocker.py @@ -35,7 +35,7 @@ def lock(file_: typing.IO, flags: LockFlags): if savepos: file_.seek(0) - os_fh = msvcrt.get_osfhandle(file_.fileno()) + os_fh = msvcrt.get_osfhandle(file_) try: win32file.LockFileEx(os_fh, mode, 0, -0x10000, __overlapped) except pywintypes.error as exc_value: @@ -62,7 +62,7 @@ def unlock(file_: typing.IO): if savepos: file_.seek(0) - os_fh = msvcrt.get_osfhandle(file_.fileno()) + os_fh = msvcrt.get_osfhandle(file_) try: win32file.UnlockFileEx( os_fh, 0, -0x10000, __overlapped @@ -106,7 +106,7 @@ def lock(file_: typing.IO, flags: LockFlags): 'or EXCLUSIVE flag must be specified as well') try: - fcntl.flock(file_.fileno(), flags) + fcntl.flock(file_, flags) except locking_exceptions as exc_value: # The exception code varies on different systems so we'll catch # every IO error From 568d213bae9fa2ea8861117f3a83507865fff1df Mon Sep 17 00:00:00 2001 From: Rick van Hattem Date: Tue, 18 Oct 2022 17:16:12 +0200 Subject: [PATCH 3/4] Added fileno() support. Fixes #80 on posix systems --- portalocker/portalocker.py | 4 ++-- portalocker_tests/tests.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/portalocker/portalocker.py b/portalocker/portalocker.py index f25269f..72260a7 100644 --- a/portalocker/portalocker.py +++ b/portalocker/portalocker.py @@ -35,7 +35,7 @@ def lock(file_: typing.IO, flags: LockFlags): if savepos: file_.seek(0) - os_fh = msvcrt.get_osfhandle(file_) + os_fh = msvcrt.get_osfhandle(file_.fileno()) try: win32file.LockFileEx(os_fh, mode, 0, -0x10000, __overlapped) except pywintypes.error as exc_value: @@ -62,7 +62,7 @@ def unlock(file_: typing.IO): if savepos: file_.seek(0) - os_fh = msvcrt.get_osfhandle(file_) + os_fh = msvcrt.get_osfhandle(file_.fileno()) try: win32file.UnlockFileEx( os_fh, 0, -0x10000, __overlapped diff --git a/portalocker_tests/tests.py b/portalocker_tests/tests.py index e41cb03..7a00405 100644 --- a/portalocker_tests/tests.py +++ b/portalocker_tests/tests.py @@ -331,3 +331,27 @@ def test_exclusive_processes(tmpfile, fail_when_locked): a.exception_class or b.exception_class, portalocker.LockException ) + + +@pytest.mark.skipif( + os.name == 'nt', + reason='Locking on Windows requires a file object', +) +def test_lock_fileno(tmpfile): + # Open the file 2 times + a = open(tmpfile, 'a') + b = open(tmpfile, 'a') + + # Lock exclusive non-blocking + flags = LockFlags.SHARED | LockFlags.NON_BLOCKING + + # First lock file a + portalocker.lock(a, flags) + + # Now see if we can lock using fileno() + portalocker.lock(b.fileno(), flags) + + # Cleanup + a.close() + b.close() + From faf78f15528edf05efadb885bb81ca32372a6496 Mon Sep 17 00:00:00 2001 From: Rick van Hattem Date: Tue, 18 Oct 2022 17:19:07 +0200 Subject: [PATCH 4/4] Incrementing version to v2.6.0 --- portalocker/__about__.py | 2 +- portalocker/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/portalocker/__about__.py b/portalocker/__about__.py index 17bf0ed..2264351 100644 --- a/portalocker/__about__.py +++ b/portalocker/__about__.py @@ -1,7 +1,7 @@ __package_name__ = 'portalocker' __author__ = 'Rick van Hattem' __email__ = 'wolph@wol.ph' -__version__ = '2.5.1' +__version__ = '2.6.0' __description__ = '''Wraps the portalocker recipe for easy usage''' __url__ = 'https://github.com/WoLpH/portalocker' diff --git a/portalocker/__init__.py b/portalocker/__init__.py index c0edcc1..65ddb4a 100644 --- a/portalocker/__init__.py +++ b/portalocker/__init__.py @@ -17,7 +17,7 @@ #: Current author's email address __email__ = __about__.__email__ #: Version number -__version__ = '2.5.1' +__version__ = '2.6.0' #: Package description for Pypi __description__ = __about__.__description__ #: Package homepage