lint cleanups; drop 3.6 from CI and metadata. (#32)
diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml
index 47a8fff..0874933 100644
--- a/.github/workflows/python-package.yml
+++ b/.github/workflows/python-package.yml
@@ -18,7 +18,7 @@
strategy:
fail-fast: false
matrix:
- python-version: [3.6, 3.7, 3.8, 3.9, '3.10', '3.11.0-beta - 3.11']
+ python-version: [3.7, 3.8, 3.9, '3.10', '3.11.0-beta - 3.11']
steps:
- uses: actions/checkout@v3
@@ -42,7 +42,7 @@
strategy:
fail-fast: false
matrix:
- python-version: [3.6, 3.7, 3.8, 3.9, '3.10', '3.11.0-beta - 3.11']
+ python-version: [3.7, 3.8, 3.9, '3.10', '3.11.0-beta - 3.11']
steps:
- uses: actions/checkout@v3
diff --git a/ChangeLog.md b/ChangeLog.md
index c02f5bf..d2e71b7 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,8 +1,16 @@
+## 1.6.x
+
+* Some pylint based refactorings to portpicker and portpicker\_test.
+* Drop 3.6 from our CI test matrix and metadata. It probably still works
+ there, but expect our unittests to include 3.7-ism's in the future. We'll
+ *attempt* to avoid modern constructs in portpicker.py itself but zero
+ guarantees. Using an old Python? Use an old portpicker.
+
## 1.5.2
* Do not re-pick a known used (not-yet-returned) port when running stand alone
without a portserver.
-
+
## 1.5.1
* When not using a portserver *(you really should)*, try the `bind(0)`
diff --git a/pyproject.toml b/pyproject.toml
index 9f27e60..932b7de 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,7 +5,7 @@
[tool.tox]
legacy_tox_ini = """
[tox]
-envlist = py{36,37,38,39}
+envlist = py{37,38,39,310,311}
isolated_build = true
skip_missing_interpreters = true
# minimum tox version
@@ -17,5 +17,5 @@
commands =
check-manifest --ignore 'src/tests/**'
python -c 'from setuptools import setup; setup()' check -m -s
- py.test -v -s {posargs}
+ py.test -vv -s {posargs}
"""
diff --git a/setup.cfg b/setup.cfg
index d3ad524..1a5071e 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,7 +1,7 @@
# https://setuptools.readthedocs.io/en/latest/setuptools.html#configuring-setup-using-setup-cfg-files
[metadata]
name = portpicker
-version = 1.5.2
+version = 1.6.0b1
maintainer = Google LLC
maintainer_email = greg@krypto.org
license = Apache 2.0
@@ -22,11 +22,11 @@
Intended Audience :: Developers
Programming Language :: Python
Programming Language :: Python :: 3
- Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
+ Programming Language :: Python :: 3.11
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: Implementation :: PyPy
platforms = POSIX, Windows
diff --git a/src/portpicker.py b/src/portpicker.py
index 4b514d7..1d678cb 100644
--- a/src/portpicker.py
+++ b/src/portpicker.py
@@ -35,6 +35,9 @@
test_port = portpicker.pick_unused_port()
"""
+# pylint: disable=consider-using-f-string
+# Some people still use this on old Pythons despite our test matrix and
+# supported versions. Be kind for now, until it gets in our way.
from __future__ import print_function
import logging
@@ -43,10 +46,12 @@
import socket
import sys
+_winapi = None # pylint: disable=invalid-name
if sys.platform == 'win32':
- import _winapi
-else:
- _winapi = None
+ try:
+ import _winapi
+ except ImportError:
+ _winapi = None
# The legacy Bind, IsPortFree, etc. names are not exported.
__all__ = ('bind', 'is_port_free', 'pick_unused_port', 'return_port',
diff --git a/src/tests/portpicker_test.py b/src/tests/portpicker_test.py
index c2925db..033e50d 100644
--- a/src/tests/portpicker_test.py
+++ b/src/tests/portpicker_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
#
# Copyright 2007 Google Inc. All Rights Reserved.
#
@@ -14,29 +14,20 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-"""Unittests for the portpicker module."""
+"""Unittests for portpicker."""
-from __future__ import print_function
+# pylint: disable=invalid-name,protected-access,missing-class-docstring,missing-function-docstring
+
+from contextlib import ExitStack
import errno
import os
-import random
import socket
import sys
import unittest
-from contextlib import ExitStack
-
-if sys.platform == 'win32':
- import _winapi
-else:
- _winapi = None
-
-try:
- # pylint: disable=no-name-in-module
- from unittest import mock # Python >= 3.3.
-except ImportError:
- import mock # https://pypi.python.org/pypi/mock
+from unittest import mock
import portpicker
+_winapi = portpicker._winapi
class PickUnusedPortTest(unittest.TestCase):
@@ -47,6 +38,7 @@
return self._bind(port, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
def setUp(self):
+ super().setUp()
# So we can Bind even if portpicker.bind is stubbed out.
self._bind = portpicker.bind
portpicker._owned_ports.clear()
@@ -93,7 +85,7 @@
self.assertTrue(self.IsUnusedTCPPort(port))
self.assertTrue(self.IsUnusedUDPPort(port))
finally:
- os.environ['PORTSERVER_ADDRESS'] = addr
+ os.environ['PORTSERVER_ADDRESS'] = addr
@unittest.skipIf('PORTSERVER_ADDRESS' not in os.environ,
'no port server to test against')
@@ -253,12 +245,11 @@
# Only successfully return a port if an OS-assigned port is
# requested, or if we're checking that the last OS-assigned port
# is unused on the other protocol.
- if port == 0 or port == self.last_assigned_port:
+ if port in (0, self.last_assigned_port):
self.last_assigned_port = self._bind(port, socket_type,
socket_proto)
return self.last_assigned_port
- else:
- return None
+ return None
with mock.patch.object(portpicker, 'bind', error_for_explicit_ports):
# Without server, this can be little flaky, so check that it
@@ -295,7 +286,7 @@
# Now test the second part, the fallback from above, which asks the
# OS for a port.
- def mock_port_free(port):
+ def mock_port_free(unused_port):
return False
with mock.patch.object(portpicker, 'is_port_free', mock_port_free):