diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2020-05-18 00:25:08 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-18 00:25:08 +0200 |
commit | 42bc319fd087ede6ab91b149608bbfc030b64890 (patch) | |
tree | 40f1269880df7267940c7b2728685d53b53cc536 | |
parent | 135628639bd6d73b5e88aefe300acd13a04a858d (diff) | |
download | psutil-42bc319fd087ede6ab91b149608bbfc030b64890.tar.gz |
Wheels2 (#1761)
-rw-r--r-- | .github/workflows/build_wheel.yml | 16 | ||||
-rw-r--r-- | MANIFEST.in | 1 | ||||
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | psutil/_common.py | 7 | ||||
-rw-r--r-- | psutil/arch/osx/process_info.c | 5 | ||||
-rw-r--r-- | psutil/tests/__init__.py | 65 | ||||
-rwxr-xr-x | psutil/tests/runner.py | 8 | ||||
-rwxr-xr-x | psutil/tests/test_aix.py | 10 | ||||
-rwxr-xr-x | psutil/tests/test_bsd.py | 42 | ||||
-rwxr-xr-x | psutil/tests/test_linux.py | 43 | ||||
-rwxr-xr-x | psutil/tests/test_osx.py | 25 | ||||
-rwxr-xr-x | psutil/tests/test_process.py | 7 | ||||
-rwxr-xr-x | psutil/tests/test_system.py | 8 | ||||
-rwxr-xr-x | psutil/tests/test_unicode.py | 9 | ||||
-rw-r--r-- | scripts/internal/download_wheels.py | 154 | ||||
-rwxr-xr-x | scripts/internal/win_download_wheels.py | 2 | ||||
-rwxr-xr-x | setup.py | 8 |
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 @@ -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>: @@ -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(): |