summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2020-05-18 00:25:08 +0200
committerGitHub <noreply@github.com>2020-05-18 00:25:08 +0200
commit42bc319fd087ede6ab91b149608bbfc030b64890 (patch)
tree40f1269880df7267940c7b2728685d53b53cc536
parent135628639bd6d73b5e88aefe300acd13a04a858d (diff)
downloadpsutil-42bc319fd087ede6ab91b149608bbfc030b64890.tar.gz
Wheels2 (#1761)
-rw-r--r--.github/workflows/build_wheel.yml16
-rw-r--r--MANIFEST.in1
-rw-r--r--Makefile7
-rw-r--r--psutil/_common.py7
-rw-r--r--psutil/arch/osx/process_info.c5
-rw-r--r--psutil/tests/__init__.py65
-rwxr-xr-xpsutil/tests/runner.py8
-rwxr-xr-xpsutil/tests/test_aix.py10
-rwxr-xr-xpsutil/tests/test_bsd.py42
-rwxr-xr-xpsutil/tests/test_linux.py43
-rwxr-xr-xpsutil/tests/test_osx.py25
-rwxr-xr-xpsutil/tests/test_process.py7
-rwxr-xr-xpsutil/tests/test_system.py8
-rwxr-xr-xpsutil/tests/test_unicode.py9
-rw-r--r--scripts/internal/download_wheels.py154
-rwxr-xr-xscripts/internal/win_download_wheels.py2
-rwxr-xr-xsetup.py8
17 files changed, 314 insertions, 103 deletions
diff --git a/.github/workflows/build_wheel.yml b/.github/workflows/build_wheel.yml
index 917a8436..7d230b90 100644
--- a/.github/workflows/build_wheel.yml
+++ b/.github/workflows/build_wheel.yml
@@ -7,10 +7,10 @@ jobs:
name: build wheel for ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
- fail-fast: false
+ fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
- env:
+ env:
CIBW_SKIP: "pp27-*win* cp27-*manylinux* pp-*manylinux*"
CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014
CIBW_MANYLINUX_I686_IMAGE: manylinux2014
@@ -28,7 +28,7 @@ jobs:
- name: "install cibuildwheel"
run: pip install cibuildwheel==1.4.1
-
+
- name: build wheel
run: cibuildwheel .
@@ -36,16 +36,16 @@ jobs:
uses: actions/upload-artifact@v1
with:
name: wheels2
- path: wheelhouse
+ path: wheelhouse
wheel:
name: build wheel for ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
- fail-fast: false
+ fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
- env:
+ env:
CIBW_SKIP: "pp27-*win* *27* cp27-*manylinux* pp-*manylinux*"
CIBW_TEST_COMMAND: python -Wa {project}/psutil/tests/runner.py
CIBW_TEST_COMMAND_MACOS: LC_ALL='en_US.utf8' python -Wa {project}/psutil/tests/runner.py
@@ -66,7 +66,7 @@ jobs:
- name: "install cibuildwheel"
run: pip install cibuildwheel==1.4.1
-
+
- name: build wheel
run: cibuildwheel .
@@ -74,4 +74,4 @@ jobs:
uses: actions/upload-artifact@v1
with:
name: wheels
- path: wheelhouse
+ path: wheelhouse
diff --git a/MANIFEST.in b/MANIFEST.in
index 2b51a545..93c49180 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -117,6 +117,7 @@ include scripts/internal/bench_oneshot.py
include scripts/internal/bench_oneshot_2.py
include scripts/internal/check_broken_links.py
include scripts/internal/clinter.py
+include scripts/internal/download_wheels.py
include scripts/internal/fix_flake8.py
include scripts/internal/generate_manifest.py
include scripts/internal/git_pre_commit.py
diff --git a/Makefile b/Makefile
index 29afe2de..e91dfd81 100644
--- a/Makefile
+++ b/Makefile
@@ -222,8 +222,11 @@ sdist: ## Create tar.gz source distribution.
wheel: ## Generate wheel.
$(PYTHON) setup.py bdist_wheel
-win-download-wheels: ## Download wheels hosted on appveyor.
- $(TEST_PREFIX) $(PYTHON) scripts/internal/win_download_wheels.py --user giampaolo --project psutil
+win-download-wheels: ## Download latest wheels hosted on appveyor.
+ $(PYTHON) scripts/internal/win_download_wheels.py --user giampaolo --project psutil
+
+download-wheels: ## Download latest wheels hosted on github.
+ $(PYTHON) scripts/internal/download_wheels.py --user=giampaolo --project=psutil --tokenfile=~/.github.token
upload-src: ## Upload source tarball on https://pypi.org/project/psutil/
${MAKE} sdist
diff --git a/psutil/_common.py b/psutil/_common.py
index b97bb01d..74366456 100644
--- a/psutil/_common.py
+++ b/psutil/_common.py
@@ -780,12 +780,13 @@ def term_supports_colors(file=sys.stdout):
return True
-def hilite(s, color="green", bold=False):
+def hilite(s, color=None, bold=False):
"""Return an highlighted version of 'string'."""
if not term_supports_colors():
return s
attr = []
- colors = dict(green='32', red='91', brown='33', yellow='93')
+ colors = dict(green='32', red='91', brown='33', yellow='93', blue='34',
+ violet='35', lightblue='36', grey='37', darkgrey='30')
colors[None] = '29'
try:
color = colors[color]
@@ -798,7 +799,7 @@ def hilite(s, color="green", bold=False):
return '\x1b[%sm%s\x1b[0m' % (';'.join(attr), s)
-def print_color(s, color="green", bold=False, file=sys.stdout):
+def print_color(s, color=None, bold=False, file=sys.stdout):
"""Print a colorized version of string."""
if not term_supports_colors():
print(s, file=file) # NOQA
diff --git a/psutil/arch/osx/process_info.c b/psutil/arch/osx/process_info.c
index 4b84a723..f83cfe47 100644
--- a/psutil/arch/osx/process_info.c
+++ b/psutil/arch/osx/process_info.c
@@ -261,7 +261,7 @@ psutil_get_environ(pid_t pid) {
if ((errno == EINVAL) && (psutil_pid_exists(pid)))
NoSuchProcess("sysctl");
else
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_PROCARGS2)");
goto error;
}
@@ -320,7 +320,6 @@ psutil_get_environ(pid_t pid) {
free(procargs);
free(procenv);
-
return py_ret;
empty:
@@ -353,7 +352,7 @@ psutil_get_kinfo_proc(pid_t pid, struct kinfo_proc *kp) {
// now read the data from sysctl
if (sysctl(mib, 4, kp, &len, NULL, 0) == -1) {
// raise an exception and throw errno as the error
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("sysctl");
return -1;
}
diff --git a/psutil/tests/__init__.py b/psutil/tests/__init__.py
index 8a086b6b..df94d737 100644
--- a/psutil/tests/__init__.py
+++ b/psutil/tests/__init__.py
@@ -74,10 +74,10 @@ else:
__all__ = [
# constants
- 'APPVEYOR', 'DEVNULL', 'GLOBAL_TIMEOUT', 'SYSMEM_TOLERANCE', 'NO_RETRIES',
+ 'APPVEYOR', 'DEVNULL', 'GLOBAL_TIMEOUT', 'TOLERANCE_SYS_MEM', 'NO_RETRIES',
'PYPY', 'PYTHON_EXE', 'ROOT_DIR', 'SCRIPTS_DIR', 'TESTFN_PREFIX',
'UNICODE_SUFFIX', 'INVALID_UNICODE_SUFFIX', 'TOX', 'TRAVIS', 'CIRRUS',
- 'CI_TESTING', 'VALID_PROC_STATUSES',
+ 'CI_TESTING', 'VALID_PROC_STATUSES', 'TOLERANCE_DISK_USAGE',
"HAS_CPU_AFFINITY", "HAS_CPU_FREQ", "HAS_ENVIRON", "HAS_PROC_IO_COUNTERS",
"HAS_IONICE", "HAS_MEMORY_MAPS", "HAS_PROC_CPU_NUM", "HAS_RLIMIT",
"HAS_SENSORS_BATTERY", "HAS_BATTERY", "HAS_SENSORS_FANS",
@@ -90,7 +90,7 @@ __all__ = [
# test utils
'unittest', 'skip_on_access_denied', 'skip_on_not_implemented',
'retry_on_failure', 'TestMemoryLeak', 'PsutilTestCase',
- 'process_namespace', 'system_namespace',
+ 'process_namespace', 'system_namespace', 'print_sysinfo',
# install utils
'install_pip', 'install_test_deps',
# fs utils
@@ -120,25 +120,28 @@ __all__ = [
TOX = os.getenv('TOX') or '' in ('1', 'true')
PYPY = '__pypy__' in sys.builtin_module_names
# whether we're running this test suite on a Continuous Integration service
-TRAVIS = bool(os.environ.get('TRAVIS'))
-APPVEYOR = bool(os.environ.get('APPVEYOR'))
-CIRRUS = bool(os.environ.get('CIRRUS'))
-GITHUB_WHEELS = bool(os.environ.get('CIBUILDWHEEL', False))
+TRAVIS = 'TRAVIS' in os.environ
+APPVEYOR = 'APPVEYOR' in os.environ
+CIRRUS = 'CIRRUS' in os.environ
+GITHUB_WHEELS = 'CIBUILDWHEEL' in os.environ
CI_TESTING = TRAVIS or APPVEYOR or CIRRUS or GITHUB_WHEELS
# --- configurable defaults
# how many times retry_on_failure() decorator will retry
NO_RETRIES = 10
-# bytes tolerance for system-wide memory related tests
-SYSMEM_TOLERANCE = 500 * 1024 # 500KB
+# bytes tolerance for system-wide related tests
+TOLERANCE_SYS_MEM = 500 * 1024 # 500KB
+TOLERANCE_DISK_USAGE = 10 * 1024 * 1024 # 10MB
# the timeout used in functions which have to wait
GLOBAL_TIMEOUT = 5
# be more tolerant if we're on travis / appveyor in order to avoid
# false positives
-if TRAVIS or APPVEYOR:
+if CI_TESTING:
NO_RETRIES *= 3
GLOBAL_TIMEOUT *= 3
+ TOLERANCE_SYS_MEM *= 3
+ TOLERANCE_DISK_USAGE *= 3
# --- file names
@@ -154,7 +157,6 @@ if PY3:
INVALID_UNICODE_SUFFIX = b"f\xc0\x80".decode('utf8', 'surrogateescape')
else:
INVALID_UNICODE_SUFFIX = "f\xc0\x80"
-
ASCII_FS = sys.getfilesystemencoding().lower() in ('ascii', 'us-ascii')
# --- paths
@@ -737,7 +739,7 @@ def safe_rmpath(path):
# open handles or references preventing the delete operation
# to succeed immediately, so we retry for a while. See:
# https://bugs.python.org/issue33240
- stop_at = time.time() + 1
+ stop_at = time.time() + GLOBAL_TIMEOUT
while time.time() < stop_at:
try:
return fun()
@@ -1045,6 +1047,45 @@ class TestMemoryLeak(PsutilTestCase):
self.execute(call, **kwargs)
+def print_sysinfo():
+ import collections
+ import datetime
+ import getpass
+ import platform
+
+ info = collections.OrderedDict()
+ info['OS'] = platform.system()
+ if psutil.OSX:
+ info['version'] = str(platform.mac_ver())
+ elif psutil.WINDOWS:
+ info['version'] = ' '.join(map(str, platform.win32_ver()))
+ if hasattr(platform, 'win32_edition'):
+ info['edition'] = platform.win32_edition()
+ else:
+ info['version'] = platform.version()
+ if psutil.POSIX:
+ info['kernel'] = '.'.join(map(str, get_kernel_version()))
+ info['arch'] = ', '.join(
+ list(platform.architecture()) + [platform.machine()])
+ info['hostname'] = platform.node()
+ info['python'] = ', '.join([
+ platform.python_implementation(),
+ platform.python_version(),
+ platform.python_compiler()])
+ if psutil.POSIX:
+ s = platform.libc_ver()[1]
+ if s:
+ info['glibc'] = s
+ info['fs-encoding'] = sys.getfilesystemencoding()
+ info['time'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ info['user'] = getpass.getuser()
+ info['pid'] = os.getpid()
+ print("=" * 70) # NOQA
+ for k, v in info.items():
+ print("%-14s %s" % (k + ':', v)) # NOQA
+ print("=" * 70) # NOQA
+
+
def _get_eligible_cpu():
p = psutil.Process()
if hasattr(p, "cpu_num"):
diff --git a/psutil/tests/runner.py b/psutil/tests/runner.py
index 8b186203..35fea42a 100755
--- a/psutil/tests/runner.py
+++ b/psutil/tests/runner.py
@@ -45,6 +45,7 @@ from psutil._common import term_supports_colors
from psutil._compat import super
from psutil.tests import CI_TESTING
from psutil.tests import import_module_by_path
+from psutil.tests import print_sysinfo
from psutil.tests import reap_children
from psutil.tests import safe_rmpath
from psutil.tests import TOX
@@ -193,6 +194,8 @@ class ColouredTextRunner(unittest.TextTestRunner):
def run(self, suite):
result = self._run(suite)
+ if CI_TESTING:
+ print_sysinfo()
self._exit(result.wasSuccessful())
@@ -277,6 +280,8 @@ class ParallelRunner(ColouredTextRunner):
ser.testsRun, ser_fails, ser_errs, ser_skips, ser_elapsed)))
print("Ran %s tests in %.3fs using %s workers" % (
par.testsRun + ser.testsRun, par_elapsed + ser_elapsed, NWORKERS))
+ if CI_TESTING:
+ print_sysinfo()
ok = par.wasSuccessful() and ser.wasSuccessful()
self._exit(ok)
@@ -338,7 +343,8 @@ def main():
else:
suite = loader.all()
- # runner
+ if CI_TESTING:
+ print_sysinfo()
runner = get_runner(opts.parallel)
runner.run(suite)
diff --git a/psutil/tests/test_aix.py b/psutil/tests/test_aix.py
index caf20357..a32c3f6a 100755
--- a/psutil/tests/test_aix.py
+++ b/psutil/tests/test_aix.py
@@ -38,17 +38,17 @@ class AIXSpecificTestCase(PsutilTestCase):
psutil_result = psutil.virtual_memory()
- # SYSMEM_TOLERANCE from psutil.tests is not enough. For some reason
+ # TOLERANCE_SYS_MEM from psutil.tests is not enough. For some reason
# we're seeing differences of ~1.2 MB. 2 MB is still a good tolerance
# when compared to GBs.
- SYSMEM_TOLERANCE = 2 * KB * KB # 2 MB
+ TOLERANCE_SYS_MEM = 2 * KB * KB # 2 MB
self.assertEqual(psutil_result.total, total)
self.assertAlmostEqual(
- psutil_result.used, used, delta=SYSMEM_TOLERANCE)
+ psutil_result.used, used, delta=TOLERANCE_SYS_MEM)
self.assertAlmostEqual(
- psutil_result.available, available, delta=SYSMEM_TOLERANCE)
+ psutil_result.available, available, delta=TOLERANCE_SYS_MEM)
self.assertAlmostEqual(
- psutil_result.free, free, delta=SYSMEM_TOLERANCE)
+ psutil_result.free, free, delta=TOLERANCE_SYS_MEM)
def test_swap_memory(self):
out = sh('/usr/sbin/lsps -a')
diff --git a/psutil/tests/test_bsd.py b/psutil/tests/test_bsd.py
index cfbec71d..c91ee3a5 100755
--- a/psutil/tests/test_bsd.py
+++ b/psutil/tests/test_bsd.py
@@ -25,7 +25,7 @@ from psutil.tests import HAS_BATTERY
from psutil.tests import PsutilTestCase
from psutil.tests import retry_on_failure
from psutil.tests import sh
-from psutil.tests import SYSMEM_TOLERANCE
+from psutil.tests import TOLERANCE_SYS_MEM
from psutil.tests import terminate
from psutil.tests import unittest
from psutil.tests import which
@@ -280,37 +280,37 @@ class FreeBSDSystemTestCase(PsutilTestCase):
def test_vmem_active(self):
syst = sysctl("vm.stats.vm.v_active_count") * PAGESIZE
self.assertAlmostEqual(psutil.virtual_memory().active, syst,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_vmem_inactive(self):
syst = sysctl("vm.stats.vm.v_inactive_count") * PAGESIZE
self.assertAlmostEqual(psutil.virtual_memory().inactive, syst,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_vmem_wired(self):
syst = sysctl("vm.stats.vm.v_wire_count") * PAGESIZE
self.assertAlmostEqual(psutil.virtual_memory().wired, syst,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_vmem_cached(self):
syst = sysctl("vm.stats.vm.v_cache_count") * PAGESIZE
self.assertAlmostEqual(psutil.virtual_memory().cached, syst,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_vmem_free(self):
syst = sysctl("vm.stats.vm.v_free_count") * PAGESIZE
self.assertAlmostEqual(psutil.virtual_memory().free, syst,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_vmem_buffers(self):
syst = sysctl("vfs.bufspace")
self.assertAlmostEqual(psutil.virtual_memory().buffers, syst,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
# --- virtual_memory(); tests against muse
@@ -324,42 +324,42 @@ class FreeBSDSystemTestCase(PsutilTestCase):
def test_muse_vmem_active(self):
num = muse('Active')
self.assertAlmostEqual(psutil.virtual_memory().active, num,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@unittest.skipIf(not MUSE_AVAILABLE, "muse not installed")
@retry_on_failure()
def test_muse_vmem_inactive(self):
num = muse('Inactive')
self.assertAlmostEqual(psutil.virtual_memory().inactive, num,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@unittest.skipIf(not MUSE_AVAILABLE, "muse not installed")
@retry_on_failure()
def test_muse_vmem_wired(self):
num = muse('Wired')
self.assertAlmostEqual(psutil.virtual_memory().wired, num,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@unittest.skipIf(not MUSE_AVAILABLE, "muse not installed")
@retry_on_failure()
def test_muse_vmem_cached(self):
num = muse('Cache')
self.assertAlmostEqual(psutil.virtual_memory().cached, num,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@unittest.skipIf(not MUSE_AVAILABLE, "muse not installed")
@retry_on_failure()
def test_muse_vmem_free(self):
num = muse('Free')
self.assertAlmostEqual(psutil.virtual_memory().free, num,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
@unittest.skipIf(not MUSE_AVAILABLE, "muse not installed")
@retry_on_failure()
def test_muse_vmem_buffers(self):
num = muse('Buffer')
self.assertAlmostEqual(psutil.virtual_memory().buffers, num,
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
def test_cpu_stats_ctx_switches(self):
self.assertAlmostEqual(psutil.cpu_stats().ctx_switches,
@@ -388,17 +388,17 @@ class FreeBSDSystemTestCase(PsutilTestCase):
def test_swapmem_free(self):
total, used, free = self.parse_swapinfo()
self.assertAlmostEqual(
- psutil.swap_memory().free, free, delta=SYSMEM_TOLERANCE)
+ psutil.swap_memory().free, free, delta=TOLERANCE_SYS_MEM)
def test_swapmem_used(self):
total, used, free = self.parse_swapinfo()
self.assertAlmostEqual(
- psutil.swap_memory().used, used, delta=SYSMEM_TOLERANCE)
+ psutil.swap_memory().used, used, delta=TOLERANCE_SYS_MEM)
def test_swapmem_total(self):
total, used, free = self.parse_swapinfo()
self.assertAlmostEqual(
- psutil.swap_memory().total, total, delta=SYSMEM_TOLERANCE)
+ psutil.swap_memory().total, total, delta=TOLERANCE_SYS_MEM)
# --- others
@@ -512,27 +512,27 @@ class NetBSDTestCase(PsutilTestCase):
def test_vmem_free(self):
self.assertAlmostEqual(
psutil.virtual_memory().free, self.parse_meminfo("MemFree:"),
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
def test_vmem_buffers(self):
self.assertAlmostEqual(
psutil.virtual_memory().buffers, self.parse_meminfo("Buffers:"),
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
def test_vmem_shared(self):
self.assertAlmostEqual(
psutil.virtual_memory().shared, self.parse_meminfo("MemShared:"),
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
def test_swapmem_total(self):
self.assertAlmostEqual(
psutil.swap_memory().total, self.parse_meminfo("SwapTotal:"),
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
def test_swapmem_free(self):
self.assertAlmostEqual(
psutil.swap_memory().free, self.parse_meminfo("SwapFree:"),
- delta=SYSMEM_TOLERANCE)
+ delta=TOLERANCE_SYS_MEM)
def test_swapmem_used(self):
smem = psutil.swap_memory()
diff --git a/psutil/tests/test_linux.py b/psutil/tests/test_linux.py
index 9cc518bb..9dd12890 100755
--- a/psutil/tests/test_linux.py
+++ b/psutil/tests/test_linux.py
@@ -28,6 +28,7 @@ from psutil._compat import FileNotFoundError
from psutil._compat import PY3
from psutil._compat import u
from psutil.tests import call_until
+from psutil.tests import GLOBAL_TIMEOUT
from psutil.tests import HAS_BATTERY
from psutil.tests import HAS_CPU_FREQ
from psutil.tests import HAS_GETLOADAVG
@@ -40,8 +41,9 @@ from psutil.tests import retry_on_failure
from psutil.tests import safe_rmpath
from psutil.tests import sh
from psutil.tests import skip_on_not_implemented
-from psutil.tests import SYSMEM_TOLERANCE
from psutil.tests import ThreadTask
+from psutil.tests import TOLERANCE_DISK_USAGE
+from psutil.tests import TOLERANCE_SYS_MEM
from psutil.tests import TRAVIS
from psutil.tests import unittest
from psutil.tests import which
@@ -211,7 +213,7 @@ class TestSystemVirtualMemory(PsutilTestCase):
free_value = free.used
psutil_value = psutil.virtual_memory().used
self.assertAlmostEqual(
- free_value, psutil_value, delta=SYSMEM_TOLERANCE,
+ free_value, psutil_value, delta=TOLERANCE_SYS_MEM,
msg='%s %s \n%s' % (free_value, psutil_value, free.output))
@unittest.skipIf(TRAVIS, "unreliable on TRAVIS")
@@ -220,14 +222,14 @@ class TestSystemVirtualMemory(PsutilTestCase):
vmstat_value = vmstat('free memory') * 1024
psutil_value = psutil.virtual_memory().free
self.assertAlmostEqual(
- vmstat_value, psutil_value, delta=SYSMEM_TOLERANCE)
+ vmstat_value, psutil_value, delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_buffers(self):
vmstat_value = vmstat('buffer memory') * 1024
psutil_value = psutil.virtual_memory().buffers
self.assertAlmostEqual(
- vmstat_value, psutil_value, delta=SYSMEM_TOLERANCE)
+ vmstat_value, psutil_value, delta=TOLERANCE_SYS_MEM)
# https://travis-ci.org/giampaolo/psutil/jobs/226719664
@unittest.skipIf(TRAVIS, "unreliable on TRAVIS")
@@ -236,7 +238,7 @@ class TestSystemVirtualMemory(PsutilTestCase):
vmstat_value = vmstat('active memory') * 1024
psutil_value = psutil.virtual_memory().active
self.assertAlmostEqual(
- vmstat_value, psutil_value, delta=SYSMEM_TOLERANCE)
+ vmstat_value, psutil_value, delta=TOLERANCE_SYS_MEM)
# https://travis-ci.org/giampaolo/psutil/jobs/227242952
@unittest.skipIf(TRAVIS, "unreliable on TRAVIS")
@@ -245,7 +247,7 @@ class TestSystemVirtualMemory(PsutilTestCase):
vmstat_value = vmstat('inactive memory') * 1024
psutil_value = psutil.virtual_memory().inactive
self.assertAlmostEqual(
- vmstat_value, psutil_value, delta=SYSMEM_TOLERANCE)
+ vmstat_value, psutil_value, delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_shared(self):
@@ -255,7 +257,7 @@ class TestSystemVirtualMemory(PsutilTestCase):
raise unittest.SkipTest("free does not support 'shared' column")
psutil_value = psutil.virtual_memory().shared
self.assertAlmostEqual(
- free_value, psutil_value, delta=SYSMEM_TOLERANCE,
+ free_value, psutil_value, delta=TOLERANCE_SYS_MEM,
msg='%s %s \n%s' % (free_value, psutil_value, free.output))
@retry_on_failure()
@@ -270,7 +272,7 @@ class TestSystemVirtualMemory(PsutilTestCase):
free_value = int(lines[1].split()[-1])
psutil_value = psutil.virtual_memory().available
self.assertAlmostEqual(
- free_value, psutil_value, delta=SYSMEM_TOLERANCE,
+ free_value, psutil_value, delta=TOLERANCE_SYS_MEM,
msg='%s %s \n%s' % (free_value, psutil_value, out))
def test_warnings_on_misses(self):
@@ -508,21 +510,21 @@ class TestSystemSwapMemory(PsutilTestCase):
free_value = free_swap().total
psutil_value = psutil.swap_memory().total
return self.assertAlmostEqual(
- free_value, psutil_value, delta=SYSMEM_TOLERANCE)
+ free_value, psutil_value, delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_used(self):
free_value = free_swap().used
psutil_value = psutil.swap_memory().used
return self.assertAlmostEqual(
- free_value, psutil_value, delta=SYSMEM_TOLERANCE)
+ free_value, psutil_value, delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_free(self):
free_value = free_swap().free
psutil_value = psutil.swap_memory().free
return self.assertAlmostEqual(
- free_value, psutil_value, delta=SYSMEM_TOLERANCE)
+ free_value, psutil_value, delta=TOLERANCE_SYS_MEM)
def test_missing_sin_sout(self):
with mock.patch('psutil._common.open', create=True) as m:
@@ -572,7 +574,7 @@ class TestSystemSwapMemory(PsutilTestCase):
total *= unit_multiplier
free *= unit_multiplier
self.assertEqual(swap.total, total)
- self.assertAlmostEqual(swap.free, free, delta=SYSMEM_TOLERANCE)
+ self.assertAlmostEqual(swap.free, free, delta=TOLERANCE_SYS_MEM)
def test_emulate_meminfo_has_no_metrics(self):
# Emulate a case where /proc/meminfo provides no swap metrics
@@ -1025,11 +1027,10 @@ class TestSystemDiskPartitions(PsutilTestCase):
usage = psutil.disk_usage(part.mountpoint)
dev, total, used, free = df(part.mountpoint)
self.assertEqual(usage.total, total)
- # 10 MB tollerance
- if abs(usage.free - free) > 10 * 1024 * 1024:
- self.fail("psutil=%s, df=%s" % (usage.free, free))
- if abs(usage.used - used) > 10 * 1024 * 1024:
- self.fail("psutil=%s, df=%s" % (usage.used, used))
+ self.assertAlmostEqual(usage.free, free,
+ delta=TOLERANCE_DISK_USAGE)
+ self.assertAlmostEqual(usage.used, used,
+ delta=TOLERANCE_DISK_USAGE)
def test_zfs_fs(self):
# Test that ZFS partitions are returned.
@@ -1375,8 +1376,10 @@ class TestMisc(PsutilTestCase):
t.start()
try:
p = psutil.Process()
- tid = p.threads()[1].id
- assert not psutil.pid_exists(tid), tid
+ threads = p.threads()
+ self.assertEqual(len(threads), 2)
+ tid = sorted(threads, key=lambda x: x.id)[1].id
+ self.assertNotEqual(p.pid, tid)
pt = psutil.Process(tid)
pt.as_dict()
self.assertNotIn(tid, psutil.pids())
@@ -1705,7 +1708,7 @@ class TestProcess(PsutilTestCase):
def test_open_files_mode(self):
def get_test_file(fname):
p = psutil.Process()
- giveup_at = time.time() + 2
+ giveup_at = time.time() + GLOBAL_TIMEOUT
while True:
for file in p.open_files():
if file.path == os.path.abspath(fname):
diff --git a/psutil/tests/test_osx.py b/psutil/tests/test_osx.py
index 1d6e1dc9..14f6d149 100755
--- a/psutil/tests/test_osx.py
+++ b/psutil/tests/test_osx.py
@@ -12,14 +12,15 @@ import time
import psutil
from psutil import MACOS
-from psutil.tests import spawn_zombie
-from psutil.tests import spawn_testproc
from psutil.tests import HAS_BATTERY
from psutil.tests import PsutilTestCase
from psutil.tests import retry_on_failure
from psutil.tests import sh
-from psutil.tests import SYSMEM_TOLERANCE
+from psutil.tests import spawn_testproc
+from psutil.tests import spawn_zombie
from psutil.tests import terminate
+from psutil.tests import TOLERANCE_DISK_USAGE
+from psutil.tests import TOLERANCE_SYS_MEM
from psutil.tests import unittest
@@ -165,6 +166,7 @@ class TestSystemAPIs(PsutilTestCase):
# --- disk
+ @retry_on_failure()
def test_disks(self):
# test psutil.disk_usage() and psutil.disk_partitions()
# against "df -a"
@@ -186,11 +188,10 @@ class TestSystemAPIs(PsutilTestCase):
dev, total, used, free = df(part.mountpoint)
self.assertEqual(part.device, dev)
self.assertEqual(usage.total, total)
- # 10 MB tollerance
- if abs(usage.free - free) > 10 * 1024 * 1024:
- self.fail("psutil=%s, df=%s" % usage.free, free)
- if abs(usage.used - used) > 10 * 1024 * 1024:
- self.fail("psutil=%s, df=%s" % usage.used, used)
+ self.assertAlmostEqual(usage.free, free,
+ delta=TOLERANCE_DISK_USAGE)
+ self.assertAlmostEqual(usage.used, used,
+ delta=TOLERANCE_DISK_USAGE)
# --- cpu
@@ -221,25 +222,25 @@ class TestSystemAPIs(PsutilTestCase):
def test_vmem_free(self):
vmstat_val = vm_stat("free")
psutil_val = psutil.virtual_memory().free
- self.assertAlmostEqual(psutil_val, vmstat_val, delta=SYSMEM_TOLERANCE)
+ self.assertAlmostEqual(psutil_val, vmstat_val, delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_vmem_active(self):
vmstat_val = vm_stat("active")
psutil_val = psutil.virtual_memory().active
- self.assertAlmostEqual(psutil_val, vmstat_val, delta=SYSMEM_TOLERANCE)
+ self.assertAlmostEqual(psutil_val, vmstat_val, delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_vmem_inactive(self):
vmstat_val = vm_stat("inactive")
psutil_val = psutil.virtual_memory().inactive
- self.assertAlmostEqual(psutil_val, vmstat_val, delta=SYSMEM_TOLERANCE)
+ self.assertAlmostEqual(psutil_val, vmstat_val, delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_vmem_wired(self):
vmstat_val = vm_stat("wired")
psutil_val = psutil.virtual_memory().wired
- self.assertAlmostEqual(psutil_val, vmstat_val, delta=SYSMEM_TOLERANCE)
+ self.assertAlmostEqual(psutil_val, vmstat_val, delta=TOLERANCE_SYS_MEM)
# --- swap mem
diff --git a/psutil/tests/test_process.py b/psutil/tests/test_process.py
index 4448ec6d..61890b8e 100755
--- a/psutil/tests/test_process.py
+++ b/psutil/tests/test_process.py
@@ -41,6 +41,8 @@ from psutil.tests import CIRRUS
from psutil.tests import copyload_shared_lib
from psutil.tests import create_exe
from psutil.tests import enum
+from psutil.tests import GITHUB_WHEELS
+from psutil.tests import GLOBAL_TIMEOUT
from psutil.tests import HAS_CPU_AFFINITY
from psutil.tests import HAS_ENVIRON
from psutil.tests import HAS_IONICE
@@ -209,7 +211,7 @@ class TestProcess(PsutilTestCase):
p = self.spawn_psproc()
self.assertRaises(psutil.TimeoutExpired, p.wait, 0)
p.kill()
- stop_at = time.time() + 2
+ stop_at = time.time() + GLOBAL_TIMEOUT
while time.time() < stop_at:
try:
code = p.wait(0)
@@ -1379,7 +1381,8 @@ class TestProcess(PsutilTestCase):
p = psutil.Process()
d1 = clean_dict(p.environ())
d2 = clean_dict(os.environ.copy())
- self.assertEqual(d1, d2)
+ if not OSX and GITHUB_WHEELS:
+ self.assertEqual(d1, d2)
@unittest.skipIf(not HAS_ENVIRON, "not supported")
@unittest.skipIf(not POSIX, "POSIX only")
diff --git a/psutil/tests/test_system.py b/psutil/tests/test_system.py
index 49eb2d0b..004f4882 100755
--- a/psutil/tests/test_system.py
+++ b/psutil/tests/test_system.py
@@ -35,6 +35,7 @@ from psutil.tests import check_net_address
from psutil.tests import CI_TESTING
from psutil.tests import DEVNULL
from psutil.tests import enum
+from psutil.tests import GLOBAL_TIMEOUT
from psutil.tests import HAS_BATTERY
from psutil.tests import HAS_CPU_FREQ
from psutil.tests import HAS_GETLOADAVG
@@ -378,7 +379,7 @@ class TestCpuAPIs(PsutilTestCase):
def test_cpu_times_time_increases(self):
# Make sure time increases between calls.
t1 = sum(psutil.cpu_times())
- stop_at = time.time() + 1
+ stop_at = time.time() + GLOBAL_TIMEOUT
while time.time() < stop_at:
t2 = sum(psutil.cpu_times())
if t2 > t1:
@@ -422,7 +423,7 @@ class TestCpuAPIs(PsutilTestCase):
# Simulate some work load then make sure time have increased
# between calls.
tot1 = psutil.cpu_times(percpu=True)
- giveup_at = time.time() + 1
+ giveup_at = time.time() + GLOBAL_TIMEOUT
while True:
if time.time() >= giveup_at:
return self.fail("timeout")
@@ -619,7 +620,8 @@ class TestDiskAPIs(PsutilTestCase):
try:
os.stat(disk.mountpoint)
except OSError as err:
- if (GITHUB_WHEELS or TRAVIS) and MACOS and err.errno == errno.EIO:
+ if (GITHUB_WHEELS or TRAVIS) and \
+ MACOS and err.errno == errno.EIO:
continue
# http://mail.python.org/pipermail/python-dev/
# 2012-June/120787.html
diff --git a/psutil/tests/test_unicode.py b/psutil/tests/test_unicode.py
index ec5ef4e3..af421d4e 100755
--- a/psutil/tests/test_unicode.py
+++ b/psutil/tests/test_unicode.py
@@ -108,7 +108,6 @@ from psutil.tests import spawn_testproc
from psutil.tests import terminate
from psutil.tests import TESTFN_PREFIX
from psutil.tests import TRAVIS
-from psutil.tests import GITHUB_WHEELS
from psutil.tests import UNICODE_SUFFIX
from psutil.tests import unittest
import psutil
@@ -145,7 +144,7 @@ def subprocess_supports_unicode(suffix):
safe_rmpath(testfn)
create_exe(testfn)
sproc = spawn_testproc(cmd=[testfn])
- except UnicodeEncodeError:
+ except (UnicodeEncodeError, IOError):
return False
else:
return True
@@ -231,8 +230,7 @@ class _BaseFSAPIsTests(object):
@unittest.skipIf(not POSIX, "POSIX only")
def test_proc_connections(self):
- suffix = os.path.basename(self.funky_name)
- name = self.get_testfn(suffix=suffix)
+ name = self.get_testfn(suffix=self.funky_suffix)
try:
sock = bind_unix_socket(name)
except UnicodeEncodeError:
@@ -257,8 +255,7 @@ class _BaseFSAPIsTests(object):
return conn
raise ValueError("connection not found")
- suffix = os.path.basename(self.funky_name)
- name = self.get_testfn(suffix=suffix)
+ name = self.get_testfn(suffix=self.funky_suffix)
try:
sock = bind_unix_socket(name)
except UnicodeEncodeError:
diff --git a/scripts/internal/download_wheels.py b/scripts/internal/download_wheels.py
new file mode 100644
index 00000000..1834f1b3
--- /dev/null
+++ b/scripts/internal/download_wheels.py
@@ -0,0 +1,154 @@
+#!/usr/bin/env python3
+
+# Copyright (c) 2009 Giampaolo Rodola'. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Script which downloads wheel files hosted on GitHub:
+https://github.com/giampaolo/psutil/actions
+It needs an access token string generated from personal GitHub profile:
+https://github.com/settings/tokens
+The token must be created with at least "public_repo" scope/rights.
+If you lose it, just generate a new token.
+REST API doc:
+https://developer.github.com/v3/actions/artifacts/
+"""
+
+import argparse
+import collections
+import json
+import os
+import requests
+import shutil
+import zipfile
+
+from psutil import __version__ as PSUTIL_VERSION
+from psutil._common import bytes2human
+from psutil._common import print_color
+
+
+USER = ""
+PROJECT = ""
+TOKEN = ""
+OUTFILE = "wheels.zip"
+
+
+# --- GitHub API
+
+
+def get_artifacts():
+ base_url = "https://api.github.com/repos/%s/%s" % (USER, PROJECT)
+ url = base_url + "/actions/artifacts"
+ res = requests.get(url=url, headers={"Authorization": "token %s" % TOKEN})
+ res.raise_for_status()
+ data = json.loads(res.content)
+ return data
+
+
+def download_zip(url):
+ print("downloading: " + url)
+ res = requests.get(url=url, headers={"Authorization": "token %s" % TOKEN})
+ res.raise_for_status()
+ totbytes = 0
+ with open(OUTFILE, 'wb') as f:
+ for chunk in res.iter_content(chunk_size=16384):
+ f.write(chunk)
+ totbytes += len(chunk)
+ print("got %s, size %s)" % (OUTFILE, bytes2human(totbytes)))
+
+
+# --- extract
+
+
+def rename_27_wheels():
+ # See: https://github.com/giampaolo/psutil/issues/810
+ src = 'dist/psutil-%s-cp27-cp27m-win32.whl' % PSUTIL_VERSION
+ dst = 'dist/psutil-%s-cp27-none-win32.whl' % PSUTIL_VERSION
+ print("rename: %s\n %s" % (src, dst))
+ os.rename(src, dst)
+ src = 'dist/psutil-%s-cp27-cp27m-win_amd64.whl' % PSUTIL_VERSION
+ dst = 'dist/psutil-%s-cp27-none-win_amd64.whl' % PSUTIL_VERSION
+ print("rename: %s\n %s" % (src, dst))
+ os.rename(src, dst)
+
+
+def extract():
+ with zipfile.ZipFile(OUTFILE, 'r') as zf:
+ zf.extractall('dist')
+
+
+def print_wheels():
+ def is64bit(name):
+ return name.endswith(('x86_64.whl', 'amd64.whl'))
+
+ groups = collections.defaultdict(list)
+ for name in os.listdir('dist'):
+ plat = name.split('-')[-1]
+ pyimpl = name.split('-')[3]
+ ispypy = 'pypy' in pyimpl
+ if 'linux' in plat:
+ if ispypy:
+ groups['pypy_on_linux'].append(name)
+ else:
+ groups['linux'].append(name)
+ elif 'win' in plat:
+ if ispypy:
+ groups['pypy_on_windows'].append(name)
+ else:
+ groups['windows'].append(name)
+ elif 'macosx' in plat:
+ if ispypy:
+ groups['pypy_on_macos'].append(name)
+ else:
+ groups['macos'].append(name)
+ else:
+ assert 0, name
+
+ totsize = 0
+ templ = "%-54s %7s %7s %7s"
+ for platf, names in groups.items():
+ ppn = "%s (total = %s)" % (platf.replace('_', ' '), len(names))
+ s = templ % (ppn, "size", "arch", "pyver")
+ print_color('\n' + s, color=None, bold=True)
+ for name in sorted(names):
+ path = os.path.join('dist', name)
+ size = os.path.getsize(path)
+ totsize += size
+ arch = '64' if is64bit(name) else '32'
+ pyver = 'pypy' if name.split('-')[3].startswith('pypy') else 'py'
+ pyver += name.split('-')[2][2:]
+ s = templ % (name, bytes2human(size), arch, pyver)
+ if 'pypy' in pyver:
+ print_color(s, color='violet')
+ else:
+ print_color(s, color='brown')
+
+
+def run():
+ if os.path.isdir('dist'):
+ shutil.rmtree('dist')
+ data = get_artifacts()
+ download_zip(data['artifacts'][0]['archive_download_url'])
+ os.mkdir('dist')
+ extract()
+ # rename_27_wheels()
+ print_wheels()
+
+
+def main():
+ global USER, PROJECT, TOKEN
+ parser = argparse.ArgumentParser(description='GitHub wheels downloader')
+ parser.add_argument('--user', required=True)
+ parser.add_argument('--project', required=True)
+ parser.add_argument('--tokenfile', required=True)
+ args = parser.parse_args()
+ USER = args.user
+ PROJECT = args.project
+ with open(os.path.expanduser(args.tokenfile)) as f:
+ TOKEN = f.read().strip()
+ run()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/internal/win_download_wheels.py b/scripts/internal/win_download_wheels.py
index 3720dd96..8dae0573 100755
--- a/scripts/internal/win_download_wheels.py
+++ b/scripts/internal/win_download_wheels.py
@@ -5,7 +5,7 @@
# found in the LICENSE file.
"""
-Script which downloads exe and wheel files hosted on AppVeyor:
+Script which downloads wheel files hosted on AppVeyor:
https://ci.appveyor.com/project/giampaolo/psutil
Readapted from the original recipe of Ibarra Corretge'
<saghul@gmail.com>:
diff --git a/setup.py b/setup.py
index 260df147..ac7b8b53 100755
--- a/setup.py
+++ b/setup.py
@@ -69,10 +69,10 @@ if POSIX:
extras_require = {"test": [
"ipaddress; python_version < '3.0'",
- "mock; python_version < '3.0'",
- "pypiwin32; sys.platform == 'win32'",
- "wmi; sys.platform == 'win32'",
- "enum34; python_version <= '3.4'",]}
+ "mock; python_version < '3.0'",
+ "pypiwin32; sys.platform == 'win32'",
+ "wmi; sys.platform == 'win32'",
+ "enum34; python_version <= '3.4'"]}
def get_version():