diff -Nru php-timer-2.1.2/build.xml php-timer-5.0.3/build.xml --- php-timer-2.1.2/build.xml 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/build.xml 2020-12-20 19:31:24.000000000 +0000 @@ -1,19 +1,30 @@ - + - - + + - + + + + + + + + + + + + diff -Nru php-timer-2.1.2/ChangeLog.md php-timer-5.0.3/ChangeLog.md --- php-timer-2.1.2/ChangeLog.md 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/ChangeLog.md 2020-12-20 19:31:24.000000000 +0000 @@ -2,11 +2,102 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [5.0.3] - 2020-10-26 + +### Fixed + +* `SebastianBergmann\Timer\Exception` now correctly extends `\Throwable` + +## [5.0.2] - 2020-09-28 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` + +## [5.0.1] - 2020-06-26 + +### Added + +* This component is now supported on PHP 8 + +## [5.0.0] - 2020-06-07 + +### Changed + +* Parameter type for `SebastianBergmann\Timer\Duration::fromMicroseconds()` was changed from `int` to `float` +* Parameter type for `SebastianBergmann\Timer\Duration::fromNanoseconds()` was changed from `int` to `float` +* Return type for `SebastianBergmann\Timer\Duration::asNanoseconds()` was changed from `int` to `float` + +### Fixed + +* [#31](https://github.com/sebastianbergmann/php-timer/issues/31): Type Error on 32-bit systems (where `hrtime()` returns `float` instead of `int`) + +## [4.0.0] - 2020-06-01 + +### Added + +* Introduced `Duration` value object for encapsulating a duration with nanosecond granularity +* Introduced `ResourceUsageFormatter` object for formatting resource usage with option to explicitly pass a duration (instead of looking at the unreliable `$_SERVER['REQUEST_TIME_FLOAT']` variable) + +### Changed + +* The methods of `Timer` are no longer static +* `Timer::stop()` now returns a `Duration` value object + +### Removed + +* Functionality that is now implemented in `Duration` and `ResourceUsageFormatter` has been removed from `Timer` + +## [3.1.4] - 2020-04-20 + +### Changed + +* `Timer::timeSinceStartOfRequest()` no longer tries `$_SERVER['REQUEST_TIME']` when `$_SERVER['REQUEST_TIME_FLOAT']` is not available (`$_SERVER['REQUEST_TIME_FLOAT']` was added in PHP 5.4 and this library requires PHP 7.3) +* Improved exception messages when `$_SERVER['REQUEST_TIME_FLOAT']` is not set or is not of type `float` + +### Changed + +## [3.1.3] - 2020-04-20 + +### Changed + +* `Timer::timeSinceStartOfRequest()` now raises an exception if `$_SERVER['REQUEST_TIME_FLOAT']` does not contain a `float` (or `$_SERVER['REQUEST_TIME']` does not contain an `int`) + +## [3.1.2] - 2020-04-17 + +### Changed + +* Improved the fix for [#30](https://github.com/sebastianbergmann/php-timer/issues/30) and restored usage of `hrtime()` + +## [3.1.1] - 2020-04-17 + +### Fixed + +* [#30](https://github.com/sebastianbergmann/php-timer/issues/30): Resolution of time returned by `Timer::stop()` is different than before (this reverts using `hrtime()` instead of `microtime()`) + +## [3.1.0] - 2020-04-17 + +### Added + +* `Timer::secondsToShortTimeString()` as alternative to `Timer::secondsToTimeString()` + +### Changed + +* `Timer::start()` and `Timer::stop()` now use `hrtime()` (high resolution monotonic timer) instead of `microtime()` +* `Timer::timeSinceStartOfRequest()` now uses `Timer::secondsToShortTimeString()` for time formatting +* Improved formatting of `Timer::secondsToTimeString()` result + +## [3.0.0] - 2020-02-07 + +### Removed + +* This component is no longer supported on PHP 7.1 and PHP 7.2 + ## [2.1.2] - 2019-06-07 ### Fixed -* Fixed [#21](https://github.com/sebastianbergmann/php-timer/pull/3352): Formatting of memory consumption does not work on 32bit systems +* [#21](https://github.com/sebastianbergmann/php-timer/pull/21): Formatting of memory consumption does not work on 32bit systems ## [2.1.1] - 2019-02-20 @@ -30,7 +121,18 @@ * This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 -[2.1.2]: https://github.com/sebastianbergmann/diff/compare/2.1.1...2.1.2 -[2.1.1]: https://github.com/sebastianbergmann/diff/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/sebastianbergmann/diff/compare/2.0.0...2.1.0 -[2.0.0]: https://github.com/sebastianbergmann/diff/compare/1.0.9...2.0.0 +[5.0.3]: https://github.com/sebastianbergmann/php-timer/compare/5.0.2...5.0.3 +[5.0.2]: https://github.com/sebastianbergmann/php-timer/compare/5.0.1...5.0.2 +[5.0.1]: https://github.com/sebastianbergmann/php-timer/compare/5.0.0...5.0.1 +[5.0.0]: https://github.com/sebastianbergmann/php-timer/compare/4.0.0...5.0.0 +[4.0.0]: https://github.com/sebastianbergmann/php-timer/compare/3.1.4...4.0.0 +[3.1.4]: https://github.com/sebastianbergmann/php-timer/compare/3.1.3...3.1.4 +[3.1.3]: https://github.com/sebastianbergmann/php-timer/compare/3.1.2...3.1.3 +[3.1.2]: https://github.com/sebastianbergmann/php-timer/compare/3.1.1...3.1.2 +[3.1.1]: https://github.com/sebastianbergmann/php-timer/compare/3.1.0...3.1.1 +[3.1.0]: https://github.com/sebastianbergmann/php-timer/compare/3.0.0...3.1.0 +[3.0.0]: https://github.com/sebastianbergmann/php-timer/compare/2.1.2...3.0.0 +[2.1.2]: https://github.com/sebastianbergmann/php-timer/compare/2.1.1...2.1.2 +[2.1.1]: https://github.com/sebastianbergmann/php-timer/compare/2.1.0...2.1.1 +[2.1.0]: https://github.com/sebastianbergmann/php-timer/compare/2.0.0...2.1.0 +[2.0.0]: https://github.com/sebastianbergmann/php-timer/compare/1.0.9...2.0.0 diff -Nru php-timer-2.1.2/composer.json php-timer-5.0.3/composer.json --- php-timer-2.1.2/composer.json 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/composer.json 2020-12-20 19:31:24.000000000 +0000 @@ -19,12 +19,15 @@ }, "prefer-stable": true, "require": { - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "config": { + "platform": { + "php": "7.3.0" + }, "optimize-autoloader": true, "sort-packages": true }, @@ -35,7 +38,7 @@ }, "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "5.0-dev" } } } diff -Nru php-timer-2.1.2/debian/changelog php-timer-5.0.3/debian/changelog --- php-timer-2.1.2/debian/changelog 2019-08-18 18:24:16.000000000 +0000 +++ php-timer-5.0.3/debian/changelog 2020-12-21 13:04:01.000000000 +0000 @@ -1,3 +1,96 @@ +php-timer (5.0.3-2) unstable; urgency=medium + + [ Remi Collet ] + * Fix test failing on 32-bit (Closes: #966412) + + -- David Prévot Mon, 21 Dec 2020 09:04:01 -0400 + +php-timer (5.0.3-1) unstable; urgency=medium + + * Source upload now that everything is in place + + -- David Prévot Sun, 20 Dec 2020 17:25:51 -0400 + +php-timer (5.0.3-1~stage1) unstable; urgency=medium + + * Upload to unstable in sync with PHPUnit 9 + + [ Sebastian Bergmann ] + * Prepare release + + [ David Prévot ] + * Update watch file format version to 4. + * Update Standards-Version to 4.5.1 + + -- David Prévot Sun, 20 Dec 2020 15:32:59 -0400 + +php-timer (5.0.2-1) experimental; urgency=medium + + [ Sebastian Bergmann ] + * Prepare release + + [ David Prévot ] + * Rename main branch to debian/latest (DEP-14) + * Set Rules-Requires-Root: no. + + -- David Prévot Wed, 30 Sep 2020 11:44:55 -0400 + +php-timer (5.0.1-1) experimental; urgency=medium + + [ Sebastian Bergmann ] + * Support PHP 8 for https://github.com/sebastianbergmann/phpunit/issues/4325 + * Prepare release + + -- David Prévot Sun, 28 Jun 2020 13:51:50 -1000 + +php-timer (5.0.0-1) experimental; urgency=medium + + [ Sebastian Bergmann ] + * Closes #31 + + -- David Prévot Wed, 10 Jun 2020 15:20:09 -1000 + +php-timer (4.0.0-1) experimental; urgency=medium + + [ Sebastian Bergmann ] + * Ignore tests etc. from archive exports + * Prepare release + + [ David Prévot ] + * Document gbp import-ref usage + * Use debhelper-compat 13 + * Simplify override_dh_auto_test + * Build-Depend on recent phpunit + + -- David Prévot Fri, 05 Jun 2020 17:50:12 -1000 + +php-timer (3.1.4-1) experimental; urgency=medium + + [ Sebastian Bergmann ] + * Prepare release + + -- David Prévot Sun, 26 Apr 2020 08:33:12 -1000 + +php-timer (3.0.0-1) experimental; urgency=medium + + * Upload version compatible with PHPUnit 9 to experimental + + [ Sebastian Bergmann ] + * Bump copyright year + * Drop support for PHP 7.1 and PHP 7.2 + * Prepare release + + [ David Prévot ] + * debian/copyright: Update copyright (years) + * debian/upstream/metadata: + + Set fields: Bug-Database, Bug-Submit, Repository, Repository-Browse + + Remove obsolete fields: Contact, Name + * debian/control: + + Drop versioned dependency satisfied in (old)stable + + Update standards version to 4.5.0 + + -- David Prévot Fri, 07 Feb 2020 19:57:34 -1000 + php-timer (2.1.2-2) unstable; urgency=medium * Upload to unstable now thet buster has been released diff -Nru php-timer-2.1.2/debian/control php-timer-5.0.3/debian/control --- php-timer-2.1.2/debian/control 2019-08-18 18:20:00.000000000 +0000 +++ php-timer-5.0.3/debian/control 2020-12-20 19:38:25.000000000 +0000 @@ -5,14 +5,15 @@ Uploaders: Prach Pongpanich , David Prévot Build-Depends: ant, - debhelper-compat (= 12), + debhelper-compat (= 13), phpab, - phpunit, - pkg-php-tools (>= 1.7~) -Standards-Version: 4.4.0 + phpunit (>= 9.2), + pkg-php-tools +Standards-Version: 4.5.1 Homepage: https://github.com/sebastianbergmann/php-timer -Vcs-Git: https://salsa.debian.org/php-team/pear/php-timer.git +Vcs-Git: https://salsa.debian.org/php-team/pear/php-timer.git -b debian/latest Vcs-Browser: https://salsa.debian.org/php-team/pear/php-timer +Rules-Requires-Root: no Package: php-timer Architecture: all diff -Nru php-timer-2.1.2/debian/copyright php-timer-5.0.3/debian/copyright --- php-timer-2.1.2/debian/copyright 2019-08-18 18:19:37.000000000 +0000 +++ php-timer-5.0.3/debian/copyright 2020-12-20 19:32:04.000000000 +0000 @@ -4,7 +4,7 @@ Source: https://github.com/sebastianbergmann/php-timer/ Files: * -Copyright: 2009-2019, Sebastian Bergmann +Copyright: 2009-2020, Sebastian Bergmann License: BSD-3-clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff -Nru php-timer-2.1.2/debian/gbp.conf php-timer-5.0.3/debian/gbp.conf --- php-timer-2.1.2/debian/gbp.conf 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/debian/gbp.conf 2020-12-20 19:31:30.000000000 +0000 @@ -0,0 +1,9 @@ +[DEFAULT] +debian-branch = debian/latest +pristine-tar = True +pristine-tar-commit = True + +## Once --filter support gets added to gbp import-ref, we should be able +## to simplify the workflow and ignore the upstream branch. +# filter = [ '.gitattributes' ] +# upstream-tag = %(version%~%-)s diff -Nru php-timer-2.1.2/debian/patches/0001-Fix-34-test-failing-on-32-bit.patch php-timer-5.0.3/debian/patches/0001-Fix-34-test-failing-on-32-bit.patch --- php-timer-2.1.2/debian/patches/0001-Fix-34-test-failing-on-32-bit.patch 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/debian/patches/0001-Fix-34-test-failing-on-32-bit.patch 2020-12-21 13:02:23.000000000 +0000 @@ -0,0 +1,99 @@ +From: Remi Collet +Date: Tue, 27 Oct 2020 11:38:32 +0100 +Subject: Fix #34 test failing on 32-bit + +Origin: upstream, https://github.com/sebastianbergmann/php-timer/commit/e6f95693a8082d4639a8488b0e997ab35d081fc9 +Bug: https://github.com/sebastianbergmann/php-timer/issues/34 +Bug-Debian: #966412 +--- + tests/DurationTest.php | 70 +++++++++++++++++++++++++------------------------- + 1 file changed, 35 insertions(+), 35 deletions(-) + +diff --git a/tests/DurationTest.php b/tests/DurationTest.php +index d8ba2a0..2129757 100644 +--- a/tests/DurationTest.php ++++ b/tests/DurationTest.php +@@ -43,7 +43,7 @@ final class DurationTest extends TestCase + * @dataProvider durationProvider + * @testdox Formats $microseconds microseconds as "$string" + */ +- public function testCanBeFormattedAsString(string $string, int $microseconds): void ++ public function testCanBeFormattedAsString(string $string, float $microseconds): void + { + $duration = Duration::fromMicroseconds($microseconds); + +@@ -53,40 +53,40 @@ final class DurationTest extends TestCase + public function durationProvider(): array + { + return [ +- ['00:00', (int) round((0 * 1000000))], +- ['00:00.001', (int) round((.001 * 1000000))], +- ['00:00.010', (int) round((.01 * 1000000))], +- ['00:00.100', (int) round((.1 * 1000000))], +- ['00:00.999', (int) round((.999 * 1000000))], +- ['00:00.999', (int) round((.9999 * 1000000))], +- ['00:01', (int) round((1 * 1000000))], +- ['00:02', (int) round((2 * 1000000))], +- ['00:59.900', (int) round((59.9 * 1000000))], +- ['00:59.990', (int) round((59.99 * 1000000))], +- ['00:59.999', (int) round((59.999 * 1000000))], +- ['00:59.999', (int) round((59.9999 * 1000000))], +- ['00:59.001', (int) round((59.001 * 1000000))], +- ['00:59.010', (int) round((59.01 * 1000000))], +- ['01:00', (int) round((60 * 1000000))], +- ['01:01', (int) round((61 * 1000000))], +- ['02:00', (int) round((120 * 1000000))], +- ['02:01', (int) round((121 * 1000000))], +- ['59:59.900', (int) round((3599.9 * 1000000))], +- ['59:59.990', (int) round((3599.99 * 1000000))], +- ['59:59.999', (int) round((3599.999 * 1000000))], +- ['59:59.999', (int) round((3599.9999 * 1000000))], +- ['59:59.001', (int) round((3599.001 * 1000000))], +- ['59:59.010', (int) round((3599.01 * 1000000))], +- ['01:00:00', (int) round((3600 * 1000000))], +- ['01:00:01', (int) round((3601 * 1000000))], +- ['01:00:01.900', (int) round((3601.9 * 1000000))], +- ['01:00:01.990', (int) round((3601.99 * 1000000))], +- ['01:00:01.999', (int) round((3601.999 * 1000000))], +- ['01:00:01.999', (int) round((3601.9999 * 1000000))], +- ['01:00:59.999', (int) round((3659.9999 * 1000000))], +- ['01:00:59.001', (int) round((3659.001 * 1000000))], +- ['01:00:59.010', (int) round((3659.01 * 1000000))], +- ['01:59:59.999', (int) round((7199.9999 * 1000000))], ++ ['00:00', round((0 * 1000000))], ++ ['00:00.001', round((.001 * 1000000))], ++ ['00:00.010', round((.01 * 1000000))], ++ ['00:00.100', round((.1 * 1000000))], ++ ['00:00.999', round((.999 * 1000000))], ++ ['00:00.999', round((.9999 * 1000000))], ++ ['00:01', round((1 * 1000000))], ++ ['00:02', round((2 * 1000000))], ++ ['00:59.900', round((59.9 * 1000000))], ++ ['00:59.990', round((59.99 * 1000000))], ++ ['00:59.999', round((59.999 * 1000000))], ++ ['00:59.999', round((59.9999 * 1000000))], ++ ['00:59.001', round((59.001 * 1000000))], ++ ['00:59.010', round((59.01 * 1000000))], ++ ['01:00', round((60 * 1000000))], ++ ['01:01', round((61 * 1000000))], ++ ['02:00', round((120 * 1000000))], ++ ['02:01', round((121 * 1000000))], ++ ['59:59.900', round((3599.9 * 1000000))], ++ ['59:59.990', round((3599.99 * 1000000))], ++ ['59:59.999', round((3599.999 * 1000000))], ++ ['59:59.999', round((3599.9999 * 1000000))], ++ ['59:59.001', round((3599.001 * 1000000))], ++ ['59:59.010', round((3599.01 * 1000000))], ++ ['01:00:00', round((3600 * 1000000))], ++ ['01:00:01', round((3601 * 1000000))], ++ ['01:00:01.900', round((3601.9 * 1000000))], ++ ['01:00:01.990', round((3601.99 * 1000000))], ++ ['01:00:01.999', round((3601.999 * 1000000))], ++ ['01:00:01.999', round((3601.9999 * 1000000))], ++ ['01:00:59.999', round((3659.9999 * 1000000))], ++ ['01:00:59.001', round((3659.001 * 1000000))], ++ ['01:00:59.010', round((3659.01 * 1000000))], ++ ['01:59:59.999', round((7199.9999 * 1000000))], + ]; + } + } diff -Nru php-timer-2.1.2/debian/patches/series php-timer-5.0.3/debian/patches/series --- php-timer-2.1.2/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/debian/patches/series 2020-12-21 13:02:23.000000000 +0000 @@ -0,0 +1 @@ +0001-Fix-34-test-failing-on-32-bit.patch diff -Nru php-timer-2.1.2/debian/README.source php-timer-5.0.3/debian/README.source --- php-timer-2.1.2/debian/README.source 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/debian/README.source 2020-12-20 19:31:30.000000000 +0000 @@ -0,0 +1,8 @@ +Starting with 4.0.0, we are merging the signed upstream tags as +upstream, instead of using the tarball that doesn’t ship tests. + +# Example to import upstream 4.0.0 version +version=4.0.0 +# We still use the upstream branch to drop the .gitattributes file from upstream +gbp import-ref --upstream-tag=%\(version%~%-\)s -u$version --debian-branch=upstream +gbp import-ref --upstream-tree=BRANCH -u$version diff -Nru php-timer-2.1.2/debian/rules php-timer-5.0.3/debian/rules --- php-timer-2.1.2/debian/rules 2019-08-18 18:19:36.000000000 +0000 +++ php-timer-5.0.3/debian/rules 2020-12-20 19:31:30.000000000 +0000 @@ -10,8 +10,4 @@ src override_dh_auto_test: -ifeq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS))) phpunit --bootstrap src/autoload.php -else - @echo "** tests disabled" -endif diff -Nru php-timer-2.1.2/debian/upstream/metadata php-timer-5.0.3/debian/upstream/metadata --- php-timer-2.1.2/debian/upstream/metadata 2019-08-18 18:19:37.000000000 +0000 +++ php-timer-5.0.3/debian/upstream/metadata 2020-12-20 19:31:30.000000000 +0000 @@ -1,2 +1,4 @@ -Name: PHP_Timer -Contact: Sebastian Bergmann +Bug-Database: https://github.com/sebastianbergmann/php-timer/issues +Bug-Submit: https://github.com/sebastianbergmann/php-timer/issues/new +Repository: https://github.com/sebastianbergmann/php-timer.git +Repository-Browse: https://github.com/sebastianbergmann/php-timer diff -Nru php-timer-2.1.2/debian/watch php-timer-5.0.3/debian/watch --- php-timer-2.1.2/debian/watch 2019-02-25 22:46:09.000000000 +0000 +++ php-timer-5.0.3/debian/watch 2020-12-20 19:32:13.000000000 +0000 @@ -1,3 +1,3 @@ -version=3 +version=4 https://github.com/sebastianbergmann/php-timer/releases \ .*/archive/v?([\d\.]+)\.tar.gz diff -Nru php-timer-2.1.2/.gitattributes php-timer-5.0.3/.gitattributes --- php-timer-2.1.2/.gitattributes 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/.gitattributes 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -*.php diff=php diff -Nru php-timer-2.1.2/.github/FUNDING.yml php-timer-5.0.3/.github/FUNDING.yml --- php-timer-2.1.2/.github/FUNDING.yml 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/.github/FUNDING.yml 2020-12-20 19:31:24.000000000 +0000 @@ -1 +1 @@ -patreon: s_bergmann +github: sebastianbergmann diff -Nru php-timer-2.1.2/.github/stale.yml php-timer-5.0.3/.github/stale.yml --- php-timer-2.1.2/.github/stale.yml 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/.github/stale.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -# Configuration for probot-stale - https://github.com/probot/stale - -# Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 60 - -# Number of days of inactivity before a stale Issue or Pull Request is closed. -# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 7 - -# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable -exemptLabels: - - enhancement - -# Set to true to ignore issues in a project (defaults to false) -exemptProjects: false - -# Set to true to ignore issues in a milestone (defaults to false) -exemptMilestones: false - -# Label to use when marking as stale -staleLabel: stale - -# Comment to post when marking as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. - -# Comment to post when removing the stale label. -# unmarkComment: > -# Your comment here. - -# Comment to post when closing a stale Issue or Pull Request. -closeComment: > - This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. - -# Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 30 - -# Limit to only `issues` or `pulls` -only: issues - diff -Nru php-timer-2.1.2/.github/workflows/ci.yml php-timer-5.0.3/.github/workflows/ci.yml --- php-timer-2.1.2/.github/workflows/ci.yml 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/.github/workflows/ci.yml 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,101 @@ +# https://help.github.com/en/categories/automating-your-workflow-with-github-actions + +on: + - "pull_request" + - "push" + +name: "CI" + +jobs: + coding-guidelines: + name: "Coding Guidelines" + + runs-on: "ubuntu-latest" + + steps: + - name: "Checkout" + uses: "actions/checkout@v2" + + - name: "Run friendsofphp/php-cs-fixer" + run: "php7.4 ./tools/php-cs-fixer fix --diff-format=udiff --dry-run --show-progress=dots --using-cache=no --verbose" + + type-checker: + name: "Type Checker" + + runs-on: "ubuntu-latest" + + steps: + - name: "Checkout" + uses: "actions/checkout@v2" + + - name: "Update dependencies with composer" + run: "php7.4 ./tools/composer update --no-ansi --no-interaction --no-progress" + + - name: "Run vimeo/psalm" + run: "php7.4 ./tools/psalm --config=.psalm/config.xml --no-progress --shepherd --show-info=false --stats" + + backward-compatibility: + name: Backward Compatibility + + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Fetch tags + run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* + + - name: Install PHP with extensions + uses: shivammathur/setup-php@v2 + with: + php-version: 7.4 + coverage: none + extensions: intl + + - name: Run roave/backward-compatibility-check + run: ./tools/roave-backward-compatibility-check --from=5.0.3 + + tests: + name: "Tests" + + runs-on: "ubuntu-latest" + + strategy: + fail-fast: false + matrix: + php-version: + - "7.3" + - "7.4" + - "8.0" + - "8.1" + + steps: + - name: "Checkout" + uses: "actions/checkout@v2" + + - name: "Install PHP with extensions" + uses: "shivammathur/setup-php@v2" + with: + php-version: "${{ matrix.php-version }}" + coverage: "pcov" + + - name: "Cache dependencies installed with composer" + uses: "actions/cache@v1" + with: + path: "~/.composer/cache" + key: "php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}" + restore-keys: "php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-" + + - name: "Install dependencies with composer" + run: "./tools/composer update --no-ansi --no-interaction --no-progress" + + - name: "Run tests with phpunit/phpunit" + run: "vendor/bin/phpunit --coverage-clover=coverage.xml" + + - name: "Send code coverage report to Codecov.io" + env: + CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" + run: "bash <(curl -s https://codecov.io/bash) || true" diff -Nru php-timer-2.1.2/.gitignore php-timer-5.0.3/.gitignore --- php-timer-2.1.2/.gitignore 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/.gitignore 2020-12-20 19:31:24.000000000 +0000 @@ -1,5 +1,6 @@ /.idea +/.php_cs /.php_cs.cache -/vendor +/.phpunit.result.cache /composer.lock - +/vendor diff -Nru php-timer-2.1.2/LICENSE php-timer-5.0.3/LICENSE --- php-timer-2.1.2/LICENSE 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/LICENSE 2020-12-20 19:31:24.000000000 +0000 @@ -1,6 +1,6 @@ phpunit/php-timer -Copyright (c) 2010-2019, Sebastian Bergmann . +Copyright (c) 2010-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without diff -Nru php-timer-2.1.2/.phive/phars.xml php-timer-5.0.3/.phive/phars.xml --- php-timer-2.1.2/.phive/phars.xml 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/.phive/phars.xml 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,6 @@ + + + + + + diff -Nru php-timer-2.1.2/.php_cs.dist php-timer-5.0.3/.php_cs.dist --- php-timer-2.1.2/.php_cs.dist 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/.php_cs.dist 2020-12-20 19:31:24.000000000 +0000 @@ -8,190 +8,206 @@ file that was distributed with this source code. EOF; +$finder = PhpCsFixer\Finder::create() + ->files() + ->in(__DIR__ . '/src') + ->in(__DIR__ . '/tests'); + return PhpCsFixer\Config::create() + ->setFinder($finder) ->setRiskyAllowed(true) - ->setRules( - [ - 'align_multiline_comment' => true, - 'array_indentation' => true, - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => [ - 'operators' => [ - '=' => 'align', - '=>' => 'align', - ], + ->setRules([ + 'align_multiline_comment' => true, + 'array_indentation' => true, + 'array_syntax' => ['syntax' => 'short'], + 'binary_operator_spaces' => [ + 'operators' => [ + '=' => 'align', + '=>' => 'align', ], - 'blank_line_after_namespace' => true, - 'blank_line_before_statement' => [ - 'statements' => [ - 'break', - 'continue', - 'declare', - 'do', - 'for', - 'foreach', - 'if', - 'include', - 'include_once', - 'require', - 'require_once', - 'return', - 'switch', - 'throw', - 'try', - 'while', - 'yield', - ], + ], + 'blank_line_after_namespace' => true, + 'blank_line_before_statement' => [ + 'statements' => [ + 'break', + 'continue', + 'declare', + 'do', + 'for', + 'foreach', + 'if', + 'include', + 'include_once', + 'require', + 'require_once', + 'return', + 'switch', + 'throw', + 'try', + 'while', + 'yield', ], - 'braces' => true, - 'cast_spaces' => true, - 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], - 'combine_consecutive_issets' => true, - 'combine_consecutive_unsets' => true, - 'compact_nullable_typehint' => true, - 'concat_space' => ['spacing' => 'one'], - 'declare_equal_normalize' => ['space' => 'none'], - 'declare_strict_types' => true, - 'dir_constant' => true, - 'elseif' => true, - 'encoding' => true, - 'full_opening_tag' => true, - 'function_declaration' => true, - 'header_comment' => ['header' => $header, 'separate' => 'none'], - 'indentation_type' => true, - 'is_null' => true, - 'line_ending' => true, - 'list_syntax' => ['syntax' => 'short'], - 'logical_operators' => true, - 'lowercase_cast' => true, - 'lowercase_constants' => true, - 'lowercase_keywords' => true, - 'lowercase_static_reference' => true, - 'magic_constant_casing' => true, - 'method_argument_space' => ['ensure_fully_multiline' => true], - 'modernize_types_casting' => true, - 'multiline_comment_opening_closing' => true, - 'multiline_whitespace_before_semicolons' => true, - 'native_constant_invocation' => true, - 'native_function_casing' => true, - 'native_function_invocation' => true, - 'new_with_braces' => false, - 'no_alias_functions' => true, - 'no_alternative_syntax' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_blank_lines_before_namespace' => true, - 'no_closing_tag' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_homoglyph_names' => true, - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => ['use' => 'print'], - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_null_property_initialization' => true, - 'no_php4_constructor' => true, - 'no_short_bool_cast' => true, - 'no_short_echo_tag' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_superfluous_elseif' => true, - 'no_superfluous_phpdoc_tags' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unneeded_curly_braces' => true, - 'no_unneeded_final_method' => true, - 'no_unreachable_default_argument_value' => true, - 'no_unset_on_property' => true, - 'no_unused_imports' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'non_printable_character' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, - 'ordered_class_elements' => [ - 'order' => [ - 'use_trait', - 'constant_public', - 'constant_protected', - 'constant_private', - 'property_public_static', - 'property_protected_static', - 'property_private_static', - 'property_public', - 'property_protected', - 'property_private', - 'method_public_static', - 'construct', - 'destruct', - 'magic', - 'phpunit', - 'method_public', - 'method_protected', - 'method_private', - 'method_protected_static', - 'method_private_static', - ], + ], + 'braces' => true, + 'cast_spaces' => true, + 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], + 'combine_consecutive_issets' => true, + 'combine_consecutive_unsets' => true, + 'compact_nullable_typehint' => true, + 'concat_space' => ['spacing' => 'one'], + 'declare_equal_normalize' => ['space' => 'none'], + 'declare_strict_types' => true, + 'dir_constant' => true, + 'elseif' => true, + 'encoding' => true, + 'full_opening_tag' => true, + 'function_declaration' => true, + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ], + 'header_comment' => ['header' => $header, 'separate' => 'none'], + 'indentation_type' => true, + 'is_null' => true, + 'line_ending' => true, + 'list_syntax' => ['syntax' => 'short'], + 'logical_operators' => true, + 'lowercase_cast' => true, + 'lowercase_constants' => true, + 'lowercase_keywords' => true, + 'lowercase_static_reference' => true, + 'magic_constant_casing' => true, + 'method_argument_space' => ['ensure_fully_multiline' => true], + 'modernize_types_casting' => true, + 'multiline_comment_opening_closing' => true, + 'multiline_whitespace_before_semicolons' => true, + 'native_constant_invocation' => false, + 'native_function_casing' => false, + 'native_function_invocation' => false, + 'new_with_braces' => false, + 'no_alias_functions' => true, + 'no_alternative_syntax' => true, + 'no_blank_lines_after_class_opening' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_blank_lines_before_namespace' => true, + 'no_closing_tag' => true, + 'no_empty_comment' => true, + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_extra_blank_lines' => true, + 'no_homoglyph_names' => true, + 'no_leading_import_slash' => true, + 'no_leading_namespace_whitespace' => true, + 'no_mixed_echo_print' => ['use' => 'print'], + 'no_multiline_whitespace_around_double_arrow' => true, + 'no_null_property_initialization' => true, + 'no_php4_constructor' => true, + 'no_short_bool_cast' => true, + 'no_short_echo_tag' => true, + 'no_singleline_whitespace_before_semicolons' => true, + 'no_spaces_after_function_name' => true, + 'no_spaces_inside_parenthesis' => true, + 'no_superfluous_elseif' => true, + 'no_superfluous_phpdoc_tags' => [ + 'allow_mixed' => true, + ], + 'no_trailing_comma_in_list_call' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_trailing_whitespace' => true, + 'no_trailing_whitespace_in_comment' => true, + 'no_unneeded_control_parentheses' => true, + 'no_unneeded_curly_braces' => true, + 'no_unneeded_final_method' => true, + 'no_unreachable_default_argument_value' => true, + 'no_unset_on_property' => true, + 'no_unused_imports' => true, + 'no_useless_else' => true, + 'no_useless_return' => true, + 'no_whitespace_before_comma_in_array' => true, + 'no_whitespace_in_blank_line' => true, + 'non_printable_character' => true, + 'normalize_index_brace' => true, + 'object_operator_without_whitespace' => true, + 'ordered_class_elements' => [ + 'order' => [ + 'use_trait', + 'constant_public', + 'constant_protected', + 'constant_private', + 'property_public_static', + 'property_protected_static', + 'property_private_static', + 'property_public', + 'property_protected', + 'property_private', + 'method_public_static', + 'construct', + 'destruct', + 'magic', + 'phpunit', + 'method_public', + 'method_protected', + 'method_private', + 'method_protected_static', + 'method_private_static', ], - 'ordered_imports' => true, - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_align' => true, - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_order' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types' => ['groups' => ['simple', 'meta']], - 'phpdoc_types_order' => true, - 'phpdoc_var_without_name' => true, - 'pow_to_exponentiation' => true, - 'protected_to_private' => true, - 'return_assignment' => true, - 'return_type_declaration' => ['space_before' => 'none'], - 'self_accessor' => true, - 'semicolon_after_instruction' => true, - 'set_type_to_cast' => true, - 'short_scalar_cast' => true, - 'simplified_null_return' => true, - 'single_blank_line_at_eof' => true, - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'single_quote' => true, - 'standardize_not_equals' => true, - 'ternary_to_null_coalescing' => true, - 'trailing_comma_in_multiline_array' => true, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'visibility_required' => [ - 'elements' => [ - 'const', - 'method', - 'property', - ], + ], + 'ordered_imports' => [ + 'imports_order' => [ + PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_CONST, + PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_FUNCTION, + PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_CLASS, + ] + ], + 'ordered_interfaces' => [ + 'direction' => 'ascend', + 'order' => 'alpha', + ], + 'phpdoc_add_missing_param_annotation' => false, + 'phpdoc_align' => true, + 'phpdoc_annotation_without_dot' => true, + 'phpdoc_indent' => true, + 'phpdoc_no_access' => true, + 'phpdoc_no_empty_return' => true, + 'phpdoc_no_package' => true, + 'phpdoc_order' => true, + 'phpdoc_return_self_reference' => true, + 'phpdoc_scalar' => true, + 'phpdoc_separation' => true, + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_summary' => true, + 'phpdoc_to_comment' => true, + 'phpdoc_trim' => true, + 'phpdoc_trim_consecutive_blank_line_separation' => true, + 'phpdoc_types' => ['groups' => ['simple', 'meta']], + 'phpdoc_types_order' => true, + 'phpdoc_var_without_name' => true, + 'pow_to_exponentiation' => true, + 'protected_to_private' => true, + 'return_assignment' => true, + 'return_type_declaration' => ['space_before' => 'none'], + 'self_accessor' => true, + 'semicolon_after_instruction' => true, + 'set_type_to_cast' => true, + 'short_scalar_cast' => true, + 'simplified_null_return' => false, + 'single_blank_line_at_eof' => true, + 'single_import_per_statement' => true, + 'single_line_after_imports' => true, + 'single_quote' => true, + 'standardize_not_equals' => true, + 'ternary_to_null_coalescing' => true, + 'trailing_comma_in_multiline_array' => true, + 'trim_array_spaces' => true, + 'unary_operator_spaces' => true, + 'visibility_required' => [ + 'elements' => [ + 'const', + 'method', + 'property', ], - 'void_return' => true, - 'whitespace_after_comma_in_array' => true, - ] - ) - ->setFinder( - PhpCsFixer\Finder::create() - ->files() - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests') - ); + ], + 'void_return' => true, + 'whitespace_after_comma_in_array' => true, + ]); diff -Nru php-timer-2.1.2/phpunit.xml php-timer-5.0.3/phpunit.xml --- php-timer-2.1.2/phpunit.xml 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/phpunit.xml 2020-12-20 19:31:24.000000000 +0000 @@ -1,19 +1,24 @@ - - tests - + + + tests + + - - + + src - - + + diff -Nru php-timer-2.1.2/.psalm/baseline.xml php-timer-5.0.3/.psalm/baseline.xml --- php-timer-2.1.2/.psalm/baseline.xml 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/.psalm/baseline.xml 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,2 @@ + + diff -Nru php-timer-2.1.2/.psalm/config.xml php-timer-5.0.3/.psalm/config.xml --- php-timer-2.1.2/.psalm/config.xml 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/.psalm/config.xml 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,16 @@ + + + + + + + + + diff -Nru php-timer-2.1.2/README.md php-timer-5.0.3/README.md --- php-timer-2.1.2/README.md 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/README.md 2020-12-20 19:31:24.000000000 +0000 @@ -1,49 +1,104 @@ -[![Build Status](https://travis-ci.org/sebastianbergmann/php-timer.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-timer) - # phpunit/php-timer +[![CI Status](https://github.com/sebastianbergmann/php-timer/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-timer/actions) +[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-timer/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-timer) + Utility class for timing things, factored out of PHPUnit into a stand-alone component. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - composer require phpunit/php-timer +``` +composer require phpunit/php-timer +``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - composer require --dev phpunit/php-timer +``` +composer require --dev phpunit/php-timer +``` ## Usage ### Basic Timing ```php -use SebastianBergmann\Timer\Timer; +require __DIR__ . '/vendor/autoload.php'; -Timer::start(); +use SebastianBergmann\Timer\Timer; -// ... +$timer = new Timer; -$time = Timer::stop(); -var_dump($time); +$timer->start(); -print Timer::secondsToTimeString($time); +foreach (\range(0, 100000) as $i) { + // ... +} + +$duration = $timer->stop(); + +var_dump(get_class($duration)); +var_dump($duration->asString()); +var_dump($duration->asSeconds()); +var_dump($duration->asMilliseconds()); +var_dump($duration->asMicroseconds()); +var_dump($duration->asNanoseconds()); ``` The code above yields the output below: - double(1.0967254638672E-5) - 0 ms +``` +string(32) "SebastianBergmann\Timer\Duration" +string(9) "00:00.002" +float(0.002851062) +float(2.851062) +float(2851.062) +int(2851062) +``` + +### Resource Consumption -### Resource Consumption Since PHP Startup +#### Explicit duration ```php +require __DIR__ . '/vendor/autoload.php'; + +use SebastianBergmann\Timer\ResourceUsageFormatter; use SebastianBergmann\Timer\Timer; -print Timer::resourceUsage(); +$timer = new Timer; +$timer->start(); + +foreach (\range(0, 100000) as $i) { + // ... +} + +print (new ResourceUsageFormatter)->resourceUsage($timer->stop()); ``` The code above yields the output below: - Time: 0 ms, Memory: 0.50MB +``` +Time: 00:00.002, Memory: 6.00 MB +``` + +#### Duration since PHP Startup (using unreliable `$_SERVER['REQUEST_TIME_FLOAT']`) + +```php +require __DIR__ . '/vendor/autoload.php'; + +use SebastianBergmann\Timer\ResourceUsageFormatter; + +foreach (\range(0, 100000) as $i) { + // ... +} + +print (new ResourceUsageFormatter)->resourceUsageSinceStartOfRequest(); +``` + +The code above yields the output below: + +``` +Time: 00:00.002, Memory: 6.00 MB +``` diff -Nru php-timer-2.1.2/src/Duration.php php-timer-5.0.3/src/Duration.php --- php-timer-2.1.2/src/Duration.php 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/src/Duration.php 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +use function floor; +use function sprintf; + +/** + * @psalm-immutable + */ +final class Duration +{ + /** + * @var float + */ + private $nanoseconds; + + /** + * @var int + */ + private $hours; + + /** + * @var int + */ + private $minutes; + + /** + * @var int + */ + private $seconds; + + /** + * @var int + */ + private $milliseconds; + + public static function fromMicroseconds(float $microseconds): self + { + return new self($microseconds * 1000); + } + + public static function fromNanoseconds(float $nanoseconds): self + { + return new self($nanoseconds); + } + + private function __construct(float $nanoseconds) + { + $this->nanoseconds = $nanoseconds; + $timeInMilliseconds = $nanoseconds / 1000000; + $hours = floor($timeInMilliseconds / 60 / 60 / 1000); + $hoursInMilliseconds = $hours * 60 * 60 * 1000; + $minutes = floor($timeInMilliseconds / 60 / 1000) % 60; + $minutesInMilliseconds = $minutes * 60 * 1000; + $seconds = floor(($timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds) / 1000); + $secondsInMilliseconds = $seconds * 1000; + $milliseconds = $timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds - $secondsInMilliseconds; + $this->hours = (int) $hours; + $this->minutes = $minutes; + $this->seconds = (int) $seconds; + $this->milliseconds = (int) $milliseconds; + } + + public function asNanoseconds(): float + { + return $this->nanoseconds; + } + + public function asMicroseconds(): float + { + return $this->nanoseconds / 1000; + } + + public function asMilliseconds(): float + { + return $this->nanoseconds / 1000000; + } + + public function asSeconds(): float + { + return $this->nanoseconds / 1000000000; + } + + public function asString(): string + { + $result = ''; + + if ($this->hours > 0) { + $result = sprintf('%02d', $this->hours) . ':'; + } + + $result .= sprintf('%02d', $this->minutes) . ':'; + $result .= sprintf('%02d', $this->seconds); + + if ($this->milliseconds > 0) { + $result .= '.' . sprintf('%03d', $this->milliseconds); + } + + return $result; + } +} diff -Nru php-timer-2.1.2/src/Exception.php php-timer-5.0.3/src/Exception.php --- php-timer-2.1.2/src/Exception.php 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/src/Exception.php 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -interface Exception -{ -} diff -Nru php-timer-2.1.2/src/exceptions/Exception.php php-timer-5.0.3/src/exceptions/Exception.php --- php-timer-2.1.2/src/exceptions/Exception.php 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/src/exceptions/Exception.php 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +use Throwable; + +interface Exception extends Throwable +{ +} diff -Nru php-timer-2.1.2/src/exceptions/NoActiveTimerException.php php-timer-5.0.3/src/exceptions/NoActiveTimerException.php --- php-timer-2.1.2/src/exceptions/NoActiveTimerException.php 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/src/exceptions/NoActiveTimerException.php 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +use LogicException; + +final class NoActiveTimerException extends LogicException implements Exception +{ +} diff -Nru php-timer-2.1.2/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php php-timer-5.0.3/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php --- php-timer-2.1.2/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +use RuntimeException; + +final class TimeSinceStartOfRequestNotAvailableException extends RuntimeException implements Exception +{ +} diff -Nru php-timer-2.1.2/src/ResourceUsageFormatter.php php-timer-5.0.3/src/ResourceUsageFormatter.php --- php-timer-2.1.2/src/ResourceUsageFormatter.php 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/src/ResourceUsageFormatter.php 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +use function is_float; +use function memory_get_peak_usage; +use function microtime; +use function sprintf; + +final class ResourceUsageFormatter +{ + /** + * @psalm-var array + */ + private const SIZES = [ + 'GB' => 1073741824, + 'MB' => 1048576, + 'KB' => 1024, + ]; + + public function resourceUsage(Duration $duration): string + { + return sprintf( + 'Time: %s, Memory: %s', + $duration->asString(), + $this->bytesToString(memory_get_peak_usage(true)) + ); + } + + /** + * @throws TimeSinceStartOfRequestNotAvailableException + */ + public function resourceUsageSinceStartOfRequest(): string + { + if (!isset($_SERVER['REQUEST_TIME_FLOAT'])) { + throw new TimeSinceStartOfRequestNotAvailableException( + 'Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not available' + ); + } + + if (!is_float($_SERVER['REQUEST_TIME_FLOAT'])) { + throw new TimeSinceStartOfRequestNotAvailableException( + 'Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not of type float' + ); + } + + return $this->resourceUsage( + Duration::fromMicroseconds( + (1000000 * (microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'])) + ) + ); + } + + private function bytesToString(int $bytes): string + { + foreach (self::SIZES as $unit => $value) { + if ($bytes >= $value) { + return sprintf('%.2f %s', $bytes >= 1024 ? $bytes / $value : $bytes, $unit); + } + } + + // @codeCoverageIgnoreStart + return $bytes . ' byte' . ($bytes !== 1 ? 's' : ''); + // @codeCoverageIgnoreEnd + } +} diff -Nru php-timer-2.1.2/src/RuntimeException.php php-timer-5.0.3/src/RuntimeException.php --- php-timer-2.1.2/src/RuntimeException.php 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/src/RuntimeException.php 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff -Nru php-timer-2.1.2/src/Timer.php php-timer-5.0.3/src/Timer.php --- php-timer-2.1.2/src/Timer.php 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/src/Timer.php 2020-12-20 19:31:24.000000000 +0000 @@ -9,92 +9,32 @@ */ namespace SebastianBergmann\Timer; +use function array_pop; +use function hrtime; + final class Timer { /** - * @var int[] - */ - private static $sizes = [ - 'GB' => 1073741824, - 'MB' => 1048576, - 'KB' => 1024, - ]; - - /** - * @var int[] - */ - private static $times = [ - 'hour' => 3600000, - 'minute' => 60000, - 'second' => 1000, - ]; - - /** - * @var float[] + * @psalm-var list */ - private static $startTimes = []; + private $startTimes = []; - public static function start(): void + public function start(): void { - self::$startTimes[] = \microtime(true); - } - - public static function stop(): float - { - return \microtime(true) - \array_pop(self::$startTimes); - } - - public static function bytesToString(float $bytes): string - { - foreach (self::$sizes as $unit => $value) { - if ($bytes >= $value) { - return \sprintf('%.2f %s', $bytes >= 1024 ? $bytes / $value : $bytes, $unit); - } - } - - return $bytes . ' byte' . ((int) $bytes !== 1 ? 's' : ''); - } - - public static function secondsToTimeString(float $time): string - { - $ms = \round($time * 1000); - - foreach (self::$times as $unit => $value) { - if ($ms >= $value) { - $time = \floor($ms / $value * 100.0) / 100.0; - - return $time . ' ' . ($time == 1 ? $unit : $unit . 's'); - } - } - - return $ms . ' ms'; + $this->startTimes[] = (float) hrtime(true); } /** - * @throws RuntimeException + * @throws NoActiveTimerException */ - public static function timeSinceStartOfRequest(): string + public function stop(): Duration { - if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { - $startOfRequest = $_SERVER['REQUEST_TIME_FLOAT']; - } elseif (isset($_SERVER['REQUEST_TIME'])) { - $startOfRequest = $_SERVER['REQUEST_TIME']; - } else { - throw new RuntimeException('Cannot determine time at which the request started'); + if (empty($this->startTimes)) { + throw new NoActiveTimerException( + 'Timer::start() has to be called before Timer::stop()' + ); } - return self::secondsToTimeString(\microtime(true) - $startOfRequest); - } - - /** - * @throws RuntimeException - */ - public static function resourceUsage(): string - { - return \sprintf( - 'Time: %s, Memory: %s', - self::timeSinceStartOfRequest(), - self::bytesToString(\memory_get_peak_usage(true)) - ); + return Duration::fromNanoseconds((float) hrtime(true) - array_pop($this->startTimes)); } } diff -Nru php-timer-2.1.2/tests/DurationTest.php php-timer-5.0.3/tests/DurationTest.php --- php-timer-2.1.2/tests/DurationTest.php 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/tests/DurationTest.php 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +use function round; +use PHPUnit\Framework\TestCase; + +/** + * @covers \SebastianBergmann\Timer\Duration + * + * @uses \SebastianBergmann\Timer\Timer + */ +final class DurationTest extends TestCase +{ + public function testCanBeCreatedFromNanoseconds(): void + { + $duration = Duration::fromNanoseconds(1); + + $this->assertSame(1.0, $duration->asNanoseconds()); + $this->assertSame(1.0E-3, $duration->asMicroseconds()); + $this->assertSame(1.0E-6, $duration->asMilliseconds()); + $this->assertSame(1.0E-9, $duration->asSeconds()); + } + + public function testCanBeCreatedFromMicroseconds(): void + { + $duration = Duration::fromMicroseconds(1); + + $this->assertSame(1000.0, $duration->asNanoseconds()); + $this->assertSame(1.0, $duration->asMicroseconds()); + $this->assertSame(1.0E-3, $duration->asMilliseconds()); + $this->assertSame(1.0E-6, $duration->asSeconds()); + } + + /** + * @dataProvider durationProvider + * @testdox Formats $microseconds microseconds as "$string" + */ + public function testCanBeFormattedAsString(string $string, int $microseconds): void + { + $duration = Duration::fromMicroseconds($microseconds); + + $this->assertSame($string, $duration->asString()); + } + + public function durationProvider(): array + { + return [ + ['00:00', (int) round((0 * 1000000))], + ['00:00.001', (int) round((.001 * 1000000))], + ['00:00.010', (int) round((.01 * 1000000))], + ['00:00.100', (int) round((.1 * 1000000))], + ['00:00.999', (int) round((.999 * 1000000))], + ['00:00.999', (int) round((.9999 * 1000000))], + ['00:01', (int) round((1 * 1000000))], + ['00:02', (int) round((2 * 1000000))], + ['00:59.900', (int) round((59.9 * 1000000))], + ['00:59.990', (int) round((59.99 * 1000000))], + ['00:59.999', (int) round((59.999 * 1000000))], + ['00:59.999', (int) round((59.9999 * 1000000))], + ['00:59.001', (int) round((59.001 * 1000000))], + ['00:59.010', (int) round((59.01 * 1000000))], + ['01:00', (int) round((60 * 1000000))], + ['01:01', (int) round((61 * 1000000))], + ['02:00', (int) round((120 * 1000000))], + ['02:01', (int) round((121 * 1000000))], + ['59:59.900', (int) round((3599.9 * 1000000))], + ['59:59.990', (int) round((3599.99 * 1000000))], + ['59:59.999', (int) round((3599.999 * 1000000))], + ['59:59.999', (int) round((3599.9999 * 1000000))], + ['59:59.001', (int) round((3599.001 * 1000000))], + ['59:59.010', (int) round((3599.01 * 1000000))], + ['01:00:00', (int) round((3600 * 1000000))], + ['01:00:01', (int) round((3601 * 1000000))], + ['01:00:01.900', (int) round((3601.9 * 1000000))], + ['01:00:01.990', (int) round((3601.99 * 1000000))], + ['01:00:01.999', (int) round((3601.999 * 1000000))], + ['01:00:01.999', (int) round((3601.9999 * 1000000))], + ['01:00:59.999', (int) round((3659.9999 * 1000000))], + ['01:00:59.001', (int) round((3659.001 * 1000000))], + ['01:00:59.010', (int) round((3659.01 * 1000000))], + ['01:59:59.999', (int) round((7199.9999 * 1000000))], + ]; + } +} diff -Nru php-timer-2.1.2/tests/ResourceUsageFormatterTest.php php-timer-5.0.3/tests/ResourceUsageFormatterTest.php --- php-timer-2.1.2/tests/ResourceUsageFormatterTest.php 1970-01-01 00:00:00.000000000 +0000 +++ php-timer-5.0.3/tests/ResourceUsageFormatterTest.php 2020-12-20 19:31:24.000000000 +0000 @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +use PHPUnit\Framework\TestCase; + +/** + * @covers \SebastianBergmann\Timer\ResourceUsageFormatter + * + * @uses \SebastianBergmann\Timer\Duration + * @uses \SebastianBergmann\Timer\Timer + */ +final class ResourceUsageFormatterTest extends TestCase +{ + /** + * @var ResourceUsageFormatter + */ + private $formatter; + + protected function setUp(): void + { + $this->formatter = new ResourceUsageFormatter; + } + + public function testCanFormatResourceUsage(): void + { + $this->assertStringMatchesFormat( + 'Time: 01:01, Memory: %s', + $this->formatter->resourceUsage( + Duration::fromMicroseconds(61000000) + ) + ); + } + + public function testCanFormatResourceUsageSinceStartOfRequest(): void + { + $this->assertStringMatchesFormat( + 'Time: %s, Memory: %s', + $this->formatter->resourceUsageSinceStartOfRequest() + ); + } + + /** + * @backupGlobals enabled + * @testdox Cannot format resource usage since start of request when $_SERVER['REQUEST_TIME_FLOAT'] is not available + */ + public function testCannotFormatResourceUsageSinceStartOfRequestWhenRequestTimeFloatIsNotAvailable(): void + { + unset($_SERVER['REQUEST_TIME_FLOAT']); + + $this->expectException(TimeSinceStartOfRequestNotAvailableException::class); + + $this->formatter->resourceUsageSinceStartOfRequest(); + } + + /** + * @backupGlobals enabled + * @testdox Cannot format resource usage since start of request when $_SERVER['REQUEST_TIME_FLOAT'] is not valid + */ + public function testCannotFormatResourceUsageSinceStartOfRequestWhenRequestTimeFloatIsNotValid(): void + { + $_SERVER['REQUEST_TIME_FLOAT'] = 'string'; + + $this->expectException(TimeSinceStartOfRequestNotAvailableException::class); + + $this->formatter->resourceUsageSinceStartOfRequest(); + } +} diff -Nru php-timer-2.1.2/tests/TimerTest.php php-timer-5.0.3/tests/TimerTest.php --- php-timer-2.1.2/tests/TimerTest.php 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/tests/TimerTest.php 2020-12-20 19:31:24.000000000 +0000 @@ -13,122 +13,33 @@ /** * @covers \SebastianBergmann\Timer\Timer + * + * @uses \SebastianBergmann\Timer\Duration */ final class TimerTest extends TestCase { - public function testCanBeStartedAndStopped(): void - { - $this->assertIsFloat(Timer::stop()); - } - - public function testCanFormatTimeSinceStartOfRequest(): void - { - $this->assertStringMatchesFormat('%f %s', Timer::timeSinceStartOfRequest()); - } - /** - * @backupGlobals enabled + * @var Timer */ - public function testCanFormatSinceStartOfRequestWhenRequestTimeIsNotAvailableAsFloat(): void - { - if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { - unset($_SERVER['REQUEST_TIME_FLOAT']); - } - - $this->assertStringMatchesFormat('%f %s', Timer::timeSinceStartOfRequest()); - } + private $timer; - /** - * @backupGlobals enabled - */ - public function testCannotFormatTimeSinceStartOfRequestWhenRequestTimeIsNotAvailable(): void + protected function setUp(): void { - if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { - unset($_SERVER['REQUEST_TIME_FLOAT']); - } - - if (isset($_SERVER['REQUEST_TIME'])) { - unset($_SERVER['REQUEST_TIME']); - } - - $this->expectException(RuntimeException::class); - - Timer::timeSinceStartOfRequest(); + $this->timer = new Timer; } - public function testCanFormatResourceUsage(): void + public function testCanBeStartedAndStopped(): void { - $this->assertStringMatchesFormat('Time: %s, Memory: %f %s', Timer::resourceUsage()); - } + $this->timer->start(); - /** - * @dataProvider secondsProvider - */ - public function testCanFormatSecondsAsString(string $string, float $seconds): void - { - $this->assertEquals($string, Timer::secondsToTimeString($seconds)); + /* @noinspection UnnecessaryAssertionInspection */ + $this->assertInstanceOf(Duration::class, $this->timer->stop()); } - public function secondsProvider(): array + public function testCannotBeStoppedWhenItWasNotStarted(): void { - return [ - ['0 ms', 0], - ['1 ms', .001], - ['10 ms', .01], - ['100 ms', .1], - ['999 ms', .999], - ['1 second', .9999], - ['1 second', 1], - ['2 seconds', 2], - ['59.9 seconds', 59.9], - ['59.99 seconds', 59.99], - ['59.99 seconds', 59.999], - ['1 minute', 59.9999], - ['59 seconds', 59.001], - ['59.01 seconds', 59.01], - ['1 minute', 60], - ['1.01 minutes', 61], - ['2 minutes', 120], - ['2.01 minutes', 121], - ['59.99 minutes', 3599.9], - ['59.99 minutes', 3599.99], - ['59.99 minutes', 3599.999], - ['1 hour', 3599.9999], - ['59.98 minutes', 3599.001], - ['59.98 minutes', 3599.01], - ['1 hour', 3600], - ['1 hour', 3601], - ['1 hour', 3601.9], - ['1 hour', 3601.99], - ['1 hour', 3601.999], - ['1 hour', 3601.9999], - ['1.01 hours', 3659.9999], - ['1.01 hours', 3659.001], - ['1.01 hours', 3659.01], - ['2 hours', 7199.9999], - ]; - } + $this->expectException(NoActiveTimerException::class); - /** - * @dataProvider bytesProvider - */ - public function testCanFormatBytesAsString(string $string, float $bytes): void - { - $this->assertEquals($string, Timer::bytesToString($bytes)); - } - - public function bytesProvider(): array - { - return [ - ['0 bytes', 0], - ['1 byte', 1], - ['1023 bytes', 1023], - ['1.00 KB', 1024], - ['1.50 KB', 1.5 * 1024], - ['2.00 MB', 2 * 1048576], - ['2.50 MB', 2.5 * 1048576], - ['3.00 GB', 3 * 1073741824], - ['3.50 GB', 3.5 * 1073741824], - ]; + $this->timer->stop(); } } diff -Nru php-timer-2.1.2/.travis.yml php-timer-5.0.3/.travis.yml --- php-timer-2.1.2/.travis.yml 2019-06-07 04:22:29.000000000 +0000 +++ php-timer-5.0.3/.travis.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -language: php - -php: - - 7.1 - - 7.2 - - 7.3 - - 7.4snapshot - -before_install: - - composer self-update - - composer clear-cache - -install: - - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest - -script: - - ./vendor/bin/phpunit --coverage-clover=coverage.xml - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - email: false