Input buildinfo: https://buildinfos.debian.net/buildinfo-pool/r/ruby-rufus-scheduler/ruby-rufus-scheduler_3.8.0-2_all.buildinfo Use metasnap for getting required timestamps New buildinfo file: /tmp/ruby-rufus-scheduler-3.8.0-2yd84kjex/ruby-rufus-scheduler_3.8.0-2_all.buildinfo Get source package info: ruby-rufus-scheduler=3.8.0-2 Source URL: http://snapshot.notset.fr/mr/package/ruby-rufus-scheduler/3.8.0-2/srcfiles?fileinfo=1 env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin TMPDIR=/tmp mmdebstrap --arch=amd64 --include=adduser=3.118 autoconf=2.71-2 automake=1:1.16.5-1.1 autopoint=0.21-4 autotools-dev=20180224.1+nmu1 base-files=12 base-passwd=3.5.52 bash=5.1-5 binutils=2.37-10 binutils-common=2.37-10 binutils-x86-64-linux-gnu=2.37-10 bsdextrautils=2.37.2-4 bsdutils=1:2.37.2-4 build-essential=12.9 bzip2=1.0.8-5 ca-certificates=20211016 coreutils=8.32-4.1 cpp=4:11.2.0-2 cpp-11=11.2.0-12 dash=0.5.11+git20210903+057cd650a4ed-3 debconf=1.5.79 debhelper=13.5.2 debianutils=5.5-1 devscripts=2.21.6 dh-autoreconf=20 dh-strip-nondeterminism=1.12.1-1 diffutils=1:3.7-5 dirmngr=2.2.27-2 dpkg=1.20.9 dpkg-dev=1.20.9 dwz=0.14-1 fakeroot=1.26-1 file=1:5.41-2 findutils=4.8.0-1 g++=4:11.2.0-2 g++-11=11.2.0-12 gcc=4:11.2.0-2 gcc-11=11.2.0-12 gcc-11-base=11.2.0-12 gem2deb=1.8 gem2deb-test-runner=1.8 gettext=0.21-4 gettext-base=0.21-4 gnupg=2.2.27-2 gnupg-l10n=2.2.27-2 gnupg-utils=2.2.27-2 gpg=2.2.27-2 gpg-agent=2.2.27-2 gpg-wks-client=2.2.27-2 gpg-wks-server=2.2.27-2 gpgconf=2.2.27-2 gpgsm=2.2.27-2 gpgv=2.2.27-2 grep=3.7-1 groff-base=1.22.4-7 gzip=1.10-4 hostname=3.23 init-system-helpers=1.60 intltool-debian=0.35.0+20060710.5 libacl1=2.3.1-1 libarchive-zip-perl=1.68-1 libasan6=11.2.0-12 libassuan0=2.5.5-1 libatomic1=11.2.0-12 libattr1=1:2.5.1-1 libaudit-common=1:3.0.6-1 libaudit1=1:3.0.6-1+b1 libb-hooks-op-check-perl=0.22-1+b3 libbinutils=2.37-10 libblkid1=2.37.2-4 libbsd0=0.11.3-1 libbz2-1.0=1.0.8-5 libc-bin=2.32-5 libc-dev-bin=2.32-5 libc6=2.32-5 libc6-dev=2.32-5 libcap-ng0=0.7.9-2.2+b1 libcap2=1:2.44-1 libcc1-0=11.2.0-12 libclass-method-modifiers-perl=2.13-1 libclass-xsaccessor-perl=1.19-3+b7 libcom-err2=1.46.4-1 libcrypt-dev=1:4.4.26-1 libcrypt1=1:4.4.26-1 libctf-nobfd0=2.37-10 libctf0=2.37-10 libdb5.3=5.3.28+dfsg1-0.8 libdebconfclient0=0.261 libdebhelper-perl=13.5.2 libdevel-callchecker-perl=0.008-1+b2 libdpkg-perl=1.20.9 libdynaloader-functions-perl=0.003-1.1 libedit2=3.1-20210910-1 libelf1=0.186-1 libencode-locale-perl=1.05-1.1 libexpat1=2.4.1-3 libfakeroot=1.26-1 libffi8=3.4.2-3 libfile-dirlist-perl=0.05-2 libfile-homedir-perl=1.006-1 libfile-listing-perl=6.14-1 libfile-stripnondeterminism-perl=1.12.1-1 libfile-touch-perl=0.12-1 libfile-which-perl=1.23-1 libgcc-11-dev=11.2.0-12 libgcc-s1=11.2.0-12 libgcrypt20=1.9.4-4 libgdbm-compat4=1.22-1 libgdbm6=1.22-1 libgmp-dev=2:6.2.1+dfsg-3 libgmp10=2:6.2.1+dfsg-3 libgmpxx4ldbl=2:6.2.1+dfsg-3 libgnutls30=3.7.2-2 libgomp1=11.2.0-12 libgpg-error0=1.42-3 libgssapi-krb5-2=1.18.3-7 libhogweed6=3.7.3-1 libhtml-parser-perl=3.76-1 libhtml-tagset-perl=3.20-4 libhtml-tree-perl=5.07-2 libhttp-cookies-perl=6.10-1 libhttp-date-perl=6.05-1 libhttp-message-perl=6.35-1 libhttp-negotiate-perl=6.01-1 libicu67=67.1-7 libidn2-0=2.3.2-2 libimport-into-perl=1.002005-1 libio-html-perl=1.004-2 libio-pty-perl=1:1.15-2 libio-socket-ssl-perl=2.072-1 libipc-run-perl=20200505.0-1 libisl23=0.24-2 libitm1=11.2.0-12 libk5crypto3=1.18.3-7 libkeyutils1=1.6.1-2 libkrb5-3=1.18.3-7 libkrb5support0=1.18.3-7 libksba8=1.6.0-2 libldap-2.4-2=2.4.59+dfsg-1 liblsan0=11.2.0-12 liblwp-mediatypes-perl=6.04-1 liblwp-protocol-https-perl=6.10-1 liblz4-1=1.9.3-2 liblzma5=5.2.5-2 libmagic-mgc=1:5.41-2 libmagic1=1:5.41-2 libmd0=1.0.4-1 libmodule-runtime-perl=0.016-1 libmoo-perl=2.005004-3 libmount1=2.37.2-4 libmpc3=1.2.1-1 libmpdec3=2.5.1-2 libmpfr6=4.1.0-3 libncursesw6=6.3-1 libnet-http-perl=6.21-1 libnet-ssleay-perl=1.90-1 libnettle8=3.7.3-1 libnpth0=1.6-3 libnsl-dev=1.3.0-2 libnsl2=1.3.0-2 libp11-kit0=0.24.0-6 libpam-modules=1.4.0-10 libpam-modules-bin=1.4.0-10 libpam-runtime=1.4.0-10 libpam0g=1.4.0-10 libparams-classify-perl=0.015-1+b3 libpcre2-8-0=10.39-3 libpcre3=2:8.39-13 libperl5.32=5.32.1-6 libpipeline1=1.5.4-1 libpython3-stdlib=3.9.8-1 libpython3.9-minimal=3.9.9-1 libpython3.9-stdlib=3.9.9-1 libquadmath0=11.2.0-12 libreadline8=8.1-2 librole-tiny-perl=2.002004-1 libruby2.7=2.7.4-1+b1 libruby3.0=3.0.2-5 libsasl2-2=2.1.27+dfsg2-2 libsasl2-modules-db=2.1.27+dfsg2-2 libseccomp2=2.5.3-2 libselinux1=3.3-1+b1 libsemanage-common=3.3-1 libsemanage2=3.3-1+b1 libsepol2=3.3-1 libsigsegv2=2.13-1 libsmartcols1=2.37.2-4 libsqlite3-0=3.36.0-2 libssl1.1=1.1.1l-1 libstdc++-11-dev=11.2.0-12 libstdc++6=11.2.0-12 libsub-override-perl=0.09-2 libsub-quote-perl=2.006006-1 libsystemd0=249.7-1 libtasn1-6=4.18.0-4 libtimedate-perl=2.3300-2 libtinfo6=6.3-1 libtirpc-common=1.3.2-2 libtirpc-dev=1.3.2-2 libtirpc3=1.3.2-2 libtool=2.4.6-15 libtry-tiny-perl=0.31-1 libtsan0=11.2.0-12 libubsan1=11.2.0-12 libuchardet0=0.0.7-1 libudev1=249.7-1 libunistring2=0.9.10-6 liburi-perl=5.10-1 libuuid1=2.37.2-4 libwww-perl=6.59-1 libwww-robotrules-perl=6.02-1 libxml2=2.9.12+dfsg-5+b1 libyaml-0-2=0.2.2-1 libzstd1=1.4.8+dfsg-3 linux-libc-dev=5.15.5-1 login=1:4.8.1-2 lsb-base=11.1.0 m4=1.4.18-5 make=4.3-4.1 man-db=2.9.4-2 mawk=1.3.4.20200120-2 media-types=4.0.0 ncurses-base=6.3-1 ncurses-bin=6.3-1 netbase=6.3 openssl=1.1.1l-1 passwd=1:4.8.1-2 patch=2.7.6-7 patchutils=0.4.2-1 perl=5.32.1-6 perl-base=5.32.1-6 perl-modules-5.32=5.32.1-6 perl-openssl-defaults=5 pinentry-curses=1.1.0-4 po-debconf=1.0.21+nmu1 python3=3.9.8-1 python3-minimal=3.9.8-1 python3.9=3.9.9-1 python3.9-minimal=3.9.9-1 rake=13.0.3-1 readline-common=8.1-2 rpcsvc-proto=1.4.2-4 ruby=1:2.7.6 ruby-all-dev=1:2.7.6 ruby-chronic=0.10.5-2 ruby-concurrent=1.1.6+dfsg-3 ruby-diff-lcs=1.4.4-1 ruby-et-orbi=1.2.2-1 ruby-fugit=1.5.2-1 ruby-minitest=5.13.0-1 ruby-net-telnet=0.1.1-2 ruby-numerizer=0.2.0-2 ruby-power-assert=1.1.7-2 ruby-raabro=1.4.0-1 ruby-rspec=3.10.0c1e1m2s3-1 ruby-rspec-core=3.10.0c1e1m2s3-1 ruby-rspec-expectations=3.10.0c1e1m2s3-1 ruby-rspec-mocks=3.10.0c1e1m2s3-1 ruby-rspec-support=3.10.0c1e1m2s3-1 ruby-rubygems=3.2.27-3 ruby-test-unit=3.3.9-1 ruby-tzinfo=2.0.4-3 ruby-xmlrpc=0.3.2-1 ruby2.7=2.7.4-1+b1 ruby2.7-dev=2.7.4-1+b1 ruby3.0=3.0.2-5 ruby3.0-dev=3.0.2-5 rubygems-integration=1.18 sed=4.8-1 sensible-utils=0.0.17 sysvinit-utils=3.00-1 tar=1.34+dfsg-1 tzdata=2021e-1 util-linux=2.37.2-4 wdiff=1.2.2-2+b1 xz-utils=5.2.5-2 zlib1g=1:1.2.11.dfsg-2 --variant=apt --aptopt=Acquire::Check-Valid-Until "false" --aptopt=Acquire::http::Dl-Limit "1000"; --aptopt=Acquire::https::Dl-Limit "1000"; --aptopt=Acquire::Retries "5"; --aptopt=APT::Get::allow-downgrades "true"; --keyring=/usr/share/keyrings/ --essential-hook=chroot "$1" sh -c "apt-get --yes install fakeroot util-linux" --essential-hook=copy-in /usr/share/keyrings/debian-archive-bullseye-automatic.gpg /usr/share/keyrings/debian-archive-bullseye-security-automatic.gpg /usr/share/keyrings/debian-archive-bullseye-stable.gpg /usr/share/keyrings/debian-archive-buster-automatic.gpg /usr/share/keyrings/debian-archive-buster-security-automatic.gpg /usr/share/keyrings/debian-archive-buster-stable.gpg /usr/share/keyrings/debian-archive-keyring.gpg /usr/share/keyrings/debian-archive-removed-keys.gpg /usr/share/keyrings/debian-archive-stretch-automatic.gpg /usr/share/keyrings/debian-archive-stretch-security-automatic.gpg /usr/share/keyrings/debian-archive-stretch-stable.gpg /usr/share/keyrings/debian-ports-archive-keyring-removed.gpg /usr/share/keyrings/debian-ports-archive-keyring.gpg /usr/share/keyrings/debian-keyring.gpg /etc/apt/trusted.gpg.d/ --essential-hook=chroot "$1" sh -c "rm /etc/apt/sources.list && echo 'deb http://snapshot.notset.fr/archive/debian/20211210T031943Z/ bookworm main deb-src http://snapshot.notset.fr/archive/debian/20211210T031943Z/ bookworm main deb http://snapshot.notset.fr/archive/debian/20211215T212228Z/ unstable main deb http://snapshot.notset.fr/archive/debian/20211205T210857Z/ unstable main' >> /etc/apt/sources.list && apt-get update" --customize-hook=chroot "$1" useradd --no-create-home -d /nonexistent -p "" builduser -s /bin/bash --customize-hook=chroot "$1" env sh -c "apt-get source --only-source -d ruby-rufus-scheduler=3.8.0-2 && mkdir -p /build/ruby-rufus-scheduler-ruphTJ && dpkg-source --no-check -x /*.dsc /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0 && chown -R builduser:builduser /build/ruby-rufus-scheduler-ruphTJ" --customize-hook=chroot "$1" env --unset=TMPDIR runuser builduser -c "cd /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0 && env DEB_BUILD_OPTIONS="parallel=4" LC_ALL="C.UTF-8" LC_COLLATE="C.UTF-8" SOURCE_DATE_EPOCH="1638956725" dpkg-buildpackage -uc -a amd64 --build=all" --customize-hook=sync-out /build/ruby-rufus-scheduler-ruphTJ /tmp/ruby-rufus-scheduler-3.8.0-2yd84kjex bookworm /dev/null deb http://snapshot.notset.fr/archive/debian/20211205T210857Z unstable main I: automatically chosen mode: root I: chroot architecture amd64 is equal to the host's architecture I: automatically chosen format: tar I: using /tmp/mmdebstrap.P5m9yEj0uq as tempdir I: running apt-get update... I: downloading packages with apt... I: extracting archives... I: installing essential packages... I: running --essential-hook in shell: sh -c 'chroot "$1" sh -c "apt-get --yes install fakeroot util-linux"' exec /tmp/mmdebstrap.P5m9yEj0uq Reading package lists... Building dependency tree... util-linux is already the newest version (2.37.2-4). The following NEW packages will be installed: fakeroot libfakeroot 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Need to get 134 kB of archives. After this operation, 397 kB of additional disk space will be used. Get:1 http://snapshot.notset.fr/archive/debian/20211205T210857Z unstable/main amd64 libfakeroot amd64 1.26-1 [47.3 kB] Get:2 http://snapshot.notset.fr/archive/debian/20211205T210857Z unstable/main amd64 fakeroot amd64 1.26-1 [87.1 kB] debconf: delaying package configuration, since apt-utils is not installed Fetched 134 kB in 0s (984 kB/s) Selecting previously unselected package libfakeroot:amd64. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 4673 files and directories currently installed.) Preparing to unpack .../libfakeroot_1.26-1_amd64.deb ... Unpacking libfakeroot:amd64 (1.26-1) ... Selecting previously unselected package fakeroot. Preparing to unpack .../fakeroot_1.26-1_amd64.deb ... Unpacking fakeroot (1.26-1) ... Setting up libfakeroot:amd64 (1.26-1) ... Setting up fakeroot (1.26-1) ... update-alternatives: using /usr/bin/fakeroot-sysv to provide /usr/bin/fakeroot (fakeroot) in auto mode Processing triggers for libc-bin (2.32-5) ... I: running special hook: copy-in /usr/share/keyrings/debian-archive-bullseye-automatic.gpg /usr/share/keyrings/debian-archive-bullseye-security-automatic.gpg /usr/share/keyrings/debian-archive-bullseye-stable.gpg /usr/share/keyrings/debian-archive-buster-automatic.gpg /usr/share/keyrings/debian-archive-buster-security-automatic.gpg /usr/share/keyrings/debian-archive-buster-stable.gpg /usr/share/keyrings/debian-archive-keyring.gpg /usr/share/keyrings/debian-archive-removed-keys.gpg /usr/share/keyrings/debian-archive-stretch-automatic.gpg /usr/share/keyrings/debian-archive-stretch-security-automatic.gpg /usr/share/keyrings/debian-archive-stretch-stable.gpg /usr/share/keyrings/debian-ports-archive-keyring-removed.gpg /usr/share/keyrings/debian-ports-archive-keyring.gpg /usr/share/keyrings/debian-keyring.gpg /etc/apt/trusted.gpg.d/ I: running --essential-hook in shell: sh -c 'chroot "$1" sh -c "rm /etc/apt/sources.list && echo 'deb http://snapshot.notset.fr/archive/debian/20211210T031943Z/ bookworm main deb-src http://snapshot.notset.fr/archive/debian/20211210T031943Z/ bookworm main deb http://snapshot.notset.fr/archive/debian/20211215T212228Z/ unstable main deb http://snapshot.notset.fr/archive/debian/20211205T210857Z/ unstable main' >> /etc/apt/sources.list && apt-get update"' exec /tmp/mmdebstrap.P5m9yEj0uq Get:1 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm InRelease [129 kB] Get:2 http://snapshot.notset.fr/archive/debian/20211215T212228Z unstable InRelease [165 kB] Hit:3 http://snapshot.notset.fr/archive/debian/20211205T210857Z unstable InRelease Ign:4 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main Sources Ign:5 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main amd64 Packages Ign:4 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main Sources Ign:5 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main amd64 Packages Ign:4 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main Sources Ign:5 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main amd64 Packages Get:4 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main Sources [11.7 MB] Get:5 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main amd64 Packages [11.2 MB] Ign:6 http://snapshot.notset.fr/archive/debian/20211215T212228Z unstable/main amd64 Packages Err:6 http://snapshot.notset.fr/archive/debian/20211215T212228Z unstable/main amd64 Packages 404 Not Found [IP: 10.13.0.253 80] Ign:6 http://snapshot.notset.fr/archive/debian/20211215T212228Z unstable/main amd64 Packages Get:6 http://snapshot.notset.fr/archive/debian/20211215T212228Z unstable/main amd64 Packages [12.0 MB] Fetched 35.3 MB in 29s (1214 kB/s) Reading package lists... I: installing remaining packages inside the chroot... I: running --customize-hook in shell: sh -c 'chroot "$1" useradd --no-create-home -d /nonexistent -p "" builduser -s /bin/bash' exec /tmp/mmdebstrap.P5m9yEj0uq I: running --customize-hook in shell: sh -c 'chroot "$1" env sh -c "apt-get source --only-source -d ruby-rufus-scheduler=3.8.0-2 && mkdir -p /build/ruby-rufus-scheduler-ruphTJ && dpkg-source --no-check -x /*.dsc /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0 && chown -R builduser:builduser /build/ruby-rufus-scheduler-ruphTJ"' exec /tmp/mmdebstrap.P5m9yEj0uq Reading package lists... NOTICE: 'ruby-rufus-scheduler' packaging is maintained in the 'Git' version control system at: https://salsa.debian.org/ruby-team/ruby-rufus-scheduler.git Please use: git clone https://salsa.debian.org/ruby-team/ruby-rufus-scheduler.git to retrieve the latest (possibly unreleased) updates to the package. Need to get 72.3 kB of source archives. Get:1 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main ruby-rufus-scheduler 3.8.0-2 (dsc) [2159 B] Get:2 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main ruby-rufus-scheduler 3.8.0-2 (tar) [64.3 kB] Get:3 http://snapshot.notset.fr/archive/debian/20211210T031943Z bookworm/main ruby-rufus-scheduler 3.8.0-2 (diff) [5780 B] Fetched 72.3 kB in 0s (287 kB/s) Download complete and in download only mode W: Download is performed unsandboxed as root as file 'ruby-rufus-scheduler_3.8.0-2.dsc' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied) dpkg-source: info: extracting ruby-rufus-scheduler in /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0 dpkg-source: info: unpacking ruby-rufus-scheduler_3.8.0.orig.tar.gz dpkg-source: info: unpacking ruby-rufus-scheduler_3.8.0-2.debian.tar.xz dpkg-source: info: using patch list from debian/patches/series dpkg-source: info: applying Modernize-spec-job_spec.rb.patch dpkg-source: info: applying Relax-path-related-tests-for-buildds.patch dpkg-source: info: applying Harden-tests.patch I: running --customize-hook in shell: sh -c 'chroot "$1" env --unset=TMPDIR runuser builduser -c "cd /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0 && env DEB_BUILD_OPTIONS="parallel=4" LC_ALL="C.UTF-8" LC_COLLATE="C.UTF-8" SOURCE_DATE_EPOCH="1638956725" dpkg-buildpackage -uc -a amd64 --build=all"' exec /tmp/mmdebstrap.P5m9yEj0uq dpkg-buildpackage: info: source package ruby-rufus-scheduler dpkg-buildpackage: info: source version 3.8.0-2 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by Daniel Leidert dpkg-source --before-build . debian/rules clean dh clean --buildsystem=ruby --with ruby dh_auto_clean -O--buildsystem=ruby dh_ruby --clean dh_ruby --clean dh_autoreconf_clean -O--buildsystem=ruby dh_clean -O--buildsystem=ruby debian/rules binary-indep dh binary-indep --buildsystem=ruby --with ruby dh_update_autotools_config -i -O--buildsystem=ruby dh_autoreconf -i -O--buildsystem=ruby dh_auto_configure -i -O--buildsystem=ruby dh_ruby --configure dh_auto_build -i -O--buildsystem=ruby dh_ruby --build dh_ruby --build dh_auto_test -i -O--buildsystem=ruby dh_ruby --test create-stamp debian/debhelper-build-stamp dh_testroot -i -O--buildsystem=ruby dh_prep -i -O--buildsystem=ruby dh_auto_install --destdir=debian/ruby-rufus-scheduler/ -i -O--buildsystem=ruby dh_ruby --install /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler dh_ruby --install /usr/bin/ruby2.7 -S gem build --config-file /dev/null --verbose /tmp/d20211216-3911675-moufdb/gemspec Failed to load /dev/null because it doesn't contain valid YAML hash Successfully built RubyGem Name: rufus-scheduler Version: 3.8.0 File: rufus-scheduler-3.8.0.gem /usr/bin/ruby2.7 -S gem install --config-file /dev/null --verbose --local --verbose --no-document --ignore-dependencies --install-dir debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all /tmp/d20211216-3911675-moufdb/rufus-scheduler-3.8.0.gem Failed to load /dev/null because it doesn't contain valid YAML hash /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all/gems/rufus-scheduler-3.8.0/lib/rufus-scheduler.rb /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all/gems/rufus-scheduler-3.8.0/lib/rufus/scheduler.rb /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all/gems/rufus-scheduler-3.8.0/lib/rufus/scheduler/job_array.rb /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all/gems/rufus-scheduler-3.8.0/lib/rufus/scheduler/jobs_core.rb /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all/gems/rufus-scheduler-3.8.0/lib/rufus/scheduler/jobs_one_time.rb /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all/gems/rufus-scheduler-3.8.0/lib/rufus/scheduler/jobs_repeat.rb /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all/gems/rufus-scheduler-3.8.0/lib/rufus/scheduler/locks.rb /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all/gems/rufus-scheduler-3.8.0/lib/rufus/scheduler/util.rb Successfully installed rufus-scheduler-3.8.0 1 gem installed cd debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all rm -rf bin rm -rf build_info rm -rf cache rm -rf doc rm -rf extensions rmdir plugins cd gems/rufus-scheduler-3.8.0 rm -f chmod 644 lib/rufus-scheduler.rb lib/rufus/scheduler.rb lib/rufus/scheduler/job_array.rb lib/rufus/scheduler/jobs_core.rb lib/rufus/scheduler/jobs_one_time.rb lib/rufus/scheduler/jobs_repeat.rb lib/rufus/scheduler/locks.rb lib/rufus/scheduler/util.rb find lib/ -type d -empty -delete cd - cd - dh_installchangelogs -pruby-rufus-scheduler /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/CHANGELOG.md upstream /usr/bin/ruby2.7 /usr/bin/gem2deb-test-runner ┌──────────────────────────────────────────────────────────────────────────────┐ │ Checking Rubygems dependency resolution on ruby2.7 │ └──────────────────────────────────────────────────────────────────────────────┘ GEM_PATH=/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all:/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/2.7.0:/var/lib/gems/2.7.0:/usr/local/lib/ruby/gems/2.7.0:/usr/lib/ruby/gems/2.7.0:/usr/lib/x86_64-linux-gnu/ruby/gems/2.7.0:/usr/share/rubygems-integration/2.7.0:/usr/share/rubygems-integration/all:/usr/lib/x86_64-linux-gnu/rubygems-integration/2.7.0 ruby2.7 -e gem\ \"rufus-scheduler\" ┌──────────────────────────────────────────────────────────────────────────────┐ │ Run tests for ruby2.7 from debian/ruby-tests.rake │ └──────────────────────────────────────────────────────────────────────────────┘ RUBYLIB=. GEM_PATH=/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all:/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/2.7.0:/var/lib/gems/2.7.0:/usr/local/lib/ruby/gems/2.7.0:/usr/lib/ruby/gems/2.7.0:/usr/lib/x86_64-linux-gnu/ruby/gems/2.7.0:/usr/share/rubygems-integration/2.7.0:/usr/share/rubygems-integration/all:/usr/lib/x86_64-linux-gnu/rubygems-integration/2.7.0 ruby2.7 -S rake -f debian/ruby-tests.rake /usr/bin/ruby2.7 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.10.3/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.10.1/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.10.1/exe/rspec --pattern ./spec/\*\*/\*_spec.rb --format documentation /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/spec/spec_helper.rb RUBY_VERSION => "2.7.4" RUBY_PLATFORM => "x86_64-linux-gnu" ******************************************************************************** ENV['TZ'] => nil Time.now.zone => "UTC" Time.now.strftime('%z') => "+0000" EtOrbi::VERSION => "1.2.2" EtOrbi::EoTime.now.zone => # EtOrbi::EoTime.now.strftime('%z') => "+0000" EtOrbi::EoTime.local_tzone => # EtOrbi::EoTime.local_tzone.name => "Etc/UTC" ******************************************************************************** basics Time.new accepts a timezone final argument Time.local works as expected Rufus::Scheduler error in block intercepts the error and describes it on $stderr error in callable intercepts the error and describes it on $stderr Rufus::Scheduler#stderr= lets divert error information to custom files error information contains information about the error, the job and the scheduler Rufus::Scheduler#on_error(&block) intercepts all StandardError instances Rufus::Scheduler::JobArray #push pushes jobs pushes and remove duplicates Rufus::Scheduler::AtJob #unschedule unschedules the job #scheduled_at returns the Time at which the job got scheduled #time returns the time at which the job will trigger #previous_time returns the previous #time #next_times returns the next n times returns an empty array if it already triggered Rufus::Scheduler::CronJob normal triggers near the zero second first_at/in does not trigger before first_at is reached triggers for the first time at first_at scheduling the cron itself does not sit scheduling and blocking... overlap, gh-304 does not trash start times (cron min) does not trash start times (cron sec) #next_time returns the next trigger time returns the next trigger time (first_at => Time) #next_times returns the next n times takes first_at/in into account #resume discard_past: true discards discard_past: false triggers the past Rufus::Scheduler::EveryJob triggers as expected lets its @next_time change in-flight summer time triggers correctly through a DST transition first_at/in triggers for the first time at first_at triggers for the first time at first_in triggers once at first then repeatedly after the assigned time #first_at= alters @next_time #previous_time returns the previous #time #next_times returns the next n times takes first_at/in into account #resume discard_past: true skips the skipped times skips the skipped times skips the skipped times discard_past: false triggers the skipped times triggers the skipped times triggers the skipped times Rufus::Scheduler::InJob #next_times returns the next n times returns an empty array if it already triggered Rufus::Scheduler::IntervalJob #interval returns the scheduled interval first_at/in triggers for the first time at first_at #first_at= alters @next_time #next_times returns the next n times takes first_at/in into account Rufus::Scheduler::RepeatJob #pause pauses the job #paused? returns true if the job is paused returns false if the job is not paused #resume resumes a paused job has no effect on a not paused job :times => i lets a job unschedule itself after i times is OK when passed a nil instead of an integer raises when passed something else than nil or an integer :first/:first_in/:first_at => point in time accepts a Time instance accepts a time string only lets the job trigger after the :first raises on points in the past :first_time => :now/:immediately/0 schedules the first execution immediately (:first => :now) schedules the first execution immediately (:first_in => 0) schedules the first execution immediately (:first_in => "0s") :first/:first_in/:first_at => duration accepts a duration string accepts a duration in seconds (integer) raises if the argument cannot be used #first_at= can be used to set first_at directly :last/:last_in/:last_at => point in time accepts a Time instance unschedules the job after the last_at time accepts a time string raises on a point in the past :last/:last_in/:last_at => duration accepts a duration string accepts a duration in seconds (integer) raises if the argument is worthless #last_at= can be used to set last_at directly #count starts at 0 keeps track of how many times the job fired #trigger_off_schedule calls the job flags the job as running Rufus::Scheduler::Job #last_time returns nil if the job never fired returns the last time the job fired #threads returns an empty list when the job is not running returns an empty list after the job terminated lists the threads the job currently runs in #kill has no effect if the job is not running makes the threads vacant #running? returns false when the job is not running in any thread returns true when the job is running in at least one thread #scheduled? returns true when the job is scheduled returns false when the job is not scheduled returns true for repeat jobs that are running returns false if job is unscheduled #call calls the job (like it were a proc) #call(true) calls the job and let the scheduler handle errors #call(false) calls the job and let errors slip through job-local variables can be set at job scheduling time is accessible to pre, post, and around hooks before first run #[]= sets a job-local variable #[] returns nil if there is no such entry returns the value of a job-local variable #key? returns true if there is an entry with the given key #has_key? returns true if there is an entry with the given key #keys returns the array of keys of the job-local variables #values returns the array of values of the job-local variables #entries returns the array of entry pairs of the job-local variables #name returns the job name #location returns the job location in code returns the right location for a callable instance job returns the right location for a callable class job #locals returns the locals hash, as is :tag / :tags => [ t0, t1 ] accepts one tag accepts an array of tags turns tags into strings blocking: true runs the job in the same thread as the scheduler thread default one thread per job behaviour runs the job in a dedicated thread :allow_overlapping / :allow_overlap / :overlap default (overlap: true) lets a job overlap itself when overlap: false prevents a job from overlapping itself :mutex mutex: "mutex_name" prevents concurrent executions mutex: mutex_instance prevents concurrent executions mutex: [ array_of_mutex_names_or_instances ] prevents concurrent executions timeout: duration_or_point_in_time interrupts the job it is stashed to (duration) interrupts the job it is stashed to (point in time) starts timing when the job enters successfully all its mutexes emits the timeout information to $stderr (default #on_error) does not prevent a repeat job from recurring name: / n: sets the job name work time #last_work_time starts at 0 keeps track of how long the work was upon last trigger #mean_work_time starts at 0 gathers work times and computes the mean one time job #determine_id returns unique ids repeat job #determine_id returns unique ids Rufus::Scheduler custom locks does not trigger when #confirm_lock returns false Rufus::Scheduler::FileLock :scheduler_lock => Rufus::Scheduler::FileLock.new(path) writes down a .rufus-scheduler.lock file "flocks" the lock file Rufus::Scheduler :lockfile => ".rufus-scheduler.lock" writes down a .rufus-scheduler.lock file "flocks" the lock file prevents newer schedulers from starting releases the lockfile when shutting down Rufus::Scheduler when running multiple schedulers side-by-side only starts if it can acquire a scheduler lock only triggers jobs when it can acquire a trigger lock Rufus::Scheduler .parse parses duration strings parses datetimes parses datetimes with timezones parses datetimes with named timezones parses datetimes (with the local timezone implicitly) parses cronlines raises on unparseable input uses Chronic if present passes options to Chronic .parse_duration parses duration strings calls #to_s on its input raises on wrong duration strings returns nil on unreadable duration when no_error: true .parse_cron parses a cron string fails on non cron string returns nil on cron string when no_error: true .to_duration turns integers into duration strings ignores seconds and milliseconds if :drop_seconds => true displays months if :months => true turns floats into duration strings .to_duration_hash turns 0 into {:s=>0} turns 60 into {:m=>1} turns 0.128 into {:s=>0.128} turns 60.127 into {:m=>1, :s=>0.127} turns 61.127 into {:m=>1, :s=>1.127} turns 61.127 into {:m=>1} ({:drop_seconds=>true}) Rufus::Scheduler #at raises if the block to schedule is missing returns a job id returns a job if :job => true adds a job triggers a job removes the job after execution accepts a Time instance accepts a time string accepts a time string with a delta timezone accepts a time string with a named timezone accepts a Chronic string (if Chronic is present) accepts a Chronic string and Chronic options (if Chronic present) accepts an ActiveSupport time thinggy (PENDING: Not yet implemented) #schedule_at returns a job Rufus::Scheduler #cron schedules accepts a CronLine instance is not slow handling frequent cron durations is not slow handling non-frequent cron durations fails if the job frequency is higher than the scheduler frequency fails if the cron line is invalid #schedule_cron returns a CronJob instance accepts a CronLine instance Rufus::Scheduler #every adds a job triggers a job (2 times) does not remove the job after execution raises on negative frequencies raises on zero frequencies does not reschedule if the job was unscheduled raises if the job frequency is higher than the scheduler frequency #schedule_every accepts a duration string Rufus::Scheduler #in adds a job triggers a job removes the job after execution #schedule_in accepts a number accepts a duration string accepts an ActiveSupport .from_now thinggy (PENDING: Not yet implemented) Rufus::Scheduler #interval adds a job triggers a job (2 times) triggers, but reschedules after the trigger execution does not reschedule if the job was unscheduled raises on negative intervals raises on zero intervals #schedule_interval accepts a duration string Rufus::Scheduler #schedule leaves the schedule option hash untouched (2 args) leaves the schedule option hash untouched (3 args) accepts a CronLine instance #at leaves the schedule option hash untouched (2 args) leaves the schedule option hash untouched (3 args) Rufus::Scheduler #initialize starts the scheduler thread sets :name and :rufus_scheduler in the scheduler thread local vars accepts a frequency: 2 (int) option accepts a frequency: "2h1m" option accepts a thread_name: option accepts a max_work_threads: option accepts a discard_past: option a schedule method passes the job to its block when it triggers passes the trigger time as second block argument accepts a callable object instead of a block accepts a callable obj instead of a block (#call with no args) accepts a class as callable raises if the scheduler is shutting down #in / #at accepts point in time and duration indifferently (#in) accepts point in time and duration indifferently (#at) #schedule accepts a duration and schedules an InJob accepts a point in time and schedules an AtJob accepts a cron string and schedules a CronJob #repeat accepts a duration and schedules an EveryJob accepts a cron string and schedules a CronJob #unschedule(job_or_work_id) accepts job ids accepts jobs carefully unschedules repeat jobs #uptime returns the uptime as a float #uptime_s returns the uptime as a human readable string #join joins the scheduler thread #join(limit) joins the scheduler thread times out #job(job_id) returns nil if there is no corresponding Job instance returns the corresponding Job instance #threads just lists the main thread (scheduler thread) when no job is scheduled lists all the threads a scheduler uses #work_threads(:all | :vacant) returns an empty array when the scheduler has not yet done anything lists the [vacant] work threads in the pool #work_threads(:active) returns [] when there are no jobs running returns the list of threads of the running jobs does not return threads from other schedulers #max_work_threads returns the max job thread count #max_work_threads= sets the max job thread count #running_jobs returns [] when there are no running jobs returns a list of running Job instances does not return twice the same job #running_jobs(:tag/:tags => x) returns a list of running jobs filtered by tag #occurrences(time0, time1) returns a { job => [ times ] } of job occurrences returns a [ [ time, job ], ... ] of job occurrences when :timeline respects :first_at for repeat jobs respects :times for repeat jobs #timeline returns a [ [ time, job ], ... ] of job occurrences should not lock when running timeline with a :first_at specified #shutdown blanks the uptime shuts the scheduler down has a #stop alias #shutdown(:wait) shuts down and blocks until all the jobs ended their current runs does not mind being called from a scheduler job (gh-304) #shutdown(wait: n) waits no more than n seconds does not mind being called from a scheduler job (gh-304) #shutdown(:kill) kills all the jobs and then shuts down does not mind being called from a scheduler job (gh-304) #pause pauses the scheduler #resume works discard_past: by default discards the past false prevents discarding the past #paused? returns true if the scheduler is paused returns false if the scheduler is not paused #down? returns true when the scheduler is down returns false when the scheduler is up #up? returns true when the scheduler is up #jobs is empty at the beginning returns the list of scheduled jobs returns all the jobs (even those pending reschedule) does not return unscheduled jobs #jobs(:tag / :tags => x) returns [] when there are no jobs with the corresponding tag returns the jobs with the corresponding tag #every_jobs returns EveryJob instances #at_jobs returns AtJob instances #in_jobs returns InJob instances #cron_jobs returns CronJob instances #interval_jobs returns IntervalJob instances #on_pre_trigger is called right before a job triggers accepts the job and the triggerTime as argument when it returns false prevents the job from triggering #on_post_trigger is called right after a job triggers #around_trigger functions normally if no around_trigger is defined wraps the job does not block (runs in job thread) .singleton / .s returns a singleton instance of the scheduler accepts initialization parameters Rufus::Scheduler thread pool starts with an empty thread pool does not cross the max_work_threads threshold does not cross the max_work_threads threshold (overlap: false) does not execute unscheduled jobs Pending: (Failures listed here are expected and do not affect your suite's status) 1) Rufus::Scheduler#at accepts an ActiveSupport time thinggy # Not yet implemented # ./spec/schedule_at_spec.rb:149 2) Rufus::Scheduler#schedule_in accepts an ActiveSupport .from_now thinggy # Not yet implemented # ./spec/schedule_in_spec.rb:73 Finished in 7 minutes 18 seconds (files took 0.65126 seconds to load) 308 examples, 0 failures, 2 pending /usr/bin/ruby3.0 /usr/bin/gem2deb-test-runner ┌──────────────────────────────────────────────────────────────────────────────┐ │ Checking Rubygems dependency resolution on ruby3.0 │ └──────────────────────────────────────────────────────────────────────────────┘ GEM_PATH=/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all:/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/3.0.0:/var/lib/gems/3.0.0:/usr/local/lib/ruby/gems/3.0.0:/usr/lib/ruby/gems/3.0.0:/usr/lib/x86_64-linux-gnu/ruby/gems/3.0.0:/usr/share/rubygems-integration/3.0.0:/usr/share/rubygems-integration/all:/usr/lib/x86_64-linux-gnu/rubygems-integration/3.0.0 ruby3.0 -e gem\ \"rufus-scheduler\" ┌──────────────────────────────────────────────────────────────────────────────┐ │ Run tests for ruby3.0 from debian/ruby-tests.rake │ └──────────────────────────────────────────────────────────────────────────────┘ RUBYLIB=. GEM_PATH=/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/ruby-rufus-scheduler/usr/share/rubygems-integration/all:/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/3.0.0:/var/lib/gems/3.0.0:/usr/local/lib/ruby/gems/3.0.0:/usr/lib/ruby/gems/3.0.0:/usr/lib/x86_64-linux-gnu/ruby/gems/3.0.0:/usr/share/rubygems-integration/3.0.0:/usr/share/rubygems-integration/all:/usr/lib/x86_64-linux-gnu/rubygems-integration/3.0.0 ruby3.0 -S rake -f debian/ruby-tests.rake /usr/bin/ruby3.0 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.10.3/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.10.1/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.10.1/exe/rspec --pattern ./spec/\*\*/\*_spec.rb --format documentation /build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0/spec/spec_helper.rb RUBY_VERSION => "3.0.2" RUBY_PLATFORM => "x86_64-linux-gnu" ******************************************************************************** ENV['TZ'] => nil Time.now.zone => "UTC" Time.now.strftime('%z') => "+0000" EtOrbi::VERSION => "1.2.2" EtOrbi::EoTime.now.zone => # EtOrbi::EoTime.now.strftime('%z') => "+0000" EtOrbi::EoTime.local_tzone => # EtOrbi::EoTime.local_tzone.name => "Etc/UTC" ******************************************************************************** basics Time.new accepts a timezone final argument Time.local works as expected Rufus::Scheduler error in block intercepts the error and describes it on $stderr error in callable intercepts the error and describes it on $stderr Rufus::Scheduler#stderr= lets divert error information to custom files error information contains information about the error, the job and the scheduler Rufus::Scheduler#on_error(&block) intercepts all StandardError instances Rufus::Scheduler::JobArray #push pushes jobs pushes and remove duplicates Rufus::Scheduler::AtJob #unschedule unschedules the job #scheduled_at returns the Time at which the job got scheduled #time returns the time at which the job will trigger #previous_time returns the previous #time #next_times returns the next n times returns an empty array if it already triggered Rufus::Scheduler::CronJob normal triggers near the zero second first_at/in does not trigger before first_at is reached triggers for the first time at first_at scheduling the cron itself does not sit scheduling and blocking... overlap, gh-304 does not trash start times (cron min) does not trash start times (cron sec) #next_time returns the next trigger time returns the next trigger time (first_at => Time) #next_times returns the next n times takes first_at/in into account #resume discard_past: true discards discard_past: false triggers the past Rufus::Scheduler::EveryJob triggers as expected lets its @next_time change in-flight summer time triggers correctly through a DST transition first_at/in triggers for the first time at first_at triggers for the first time at first_in triggers once at first then repeatedly after the assigned time #first_at= alters @next_time #previous_time returns the previous #time #next_times returns the next n times takes first_at/in into account #resume discard_past: true skips the skipped times skips the skipped times skips the skipped times discard_past: false triggers the skipped times triggers the skipped times triggers the skipped times Rufus::Scheduler::InJob #next_times returns the next n times returns an empty array if it already triggered Rufus::Scheduler::IntervalJob #interval returns the scheduled interval first_at/in triggers for the first time at first_at #first_at= alters @next_time #next_times returns the next n times takes first_at/in into account Rufus::Scheduler::RepeatJob #pause pauses the job #paused? returns true if the job is paused returns false if the job is not paused #resume resumes a paused job has no effect on a not paused job :times => i lets a job unschedule itself after i times is OK when passed a nil instead of an integer raises when passed something else than nil or an integer :first/:first_in/:first_at => point in time accepts a Time instance accepts a time string only lets the job trigger after the :first raises on points in the past :first_time => :now/:immediately/0 schedules the first execution immediately (:first => :now) schedules the first execution immediately (:first_in => 0) schedules the first execution immediately (:first_in => "0s") :first/:first_in/:first_at => duration accepts a duration string accepts a duration in seconds (integer) raises if the argument cannot be used #first_at= can be used to set first_at directly :last/:last_in/:last_at => point in time accepts a Time instance unschedules the job after the last_at time accepts a time string raises on a point in the past :last/:last_in/:last_at => duration accepts a duration string accepts a duration in seconds (integer) raises if the argument is worthless #last_at= can be used to set last_at directly #count starts at 0 keeps track of how many times the job fired #trigger_off_schedule calls the job flags the job as running Rufus::Scheduler::Job #last_time returns nil if the job never fired returns the last time the job fired #threads returns an empty list when the job is not running returns an empty list after the job terminated lists the threads the job currently runs in #kill has no effect if the job is not running makes the threads vacant #running? returns false when the job is not running in any thread returns true when the job is running in at least one thread #scheduled? returns true when the job is scheduled returns false when the job is not scheduled returns true for repeat jobs that are running returns false if job is unscheduled #call calls the job (like it were a proc) #call(true) calls the job and let the scheduler handle errors #call(false) calls the job and let errors slip through job-local variables can be set at job scheduling time is accessible to pre, post, and around hooks before first run #[]= sets a job-local variable #[] returns nil if there is no such entry returns the value of a job-local variable #key? returns true if there is an entry with the given key #has_key? returns true if there is an entry with the given key #keys returns the array of keys of the job-local variables #values returns the array of values of the job-local variables #entries returns the array of entry pairs of the job-local variables #name returns the job name #location returns the job location in code returns the right location for a callable instance job returns the right location for a callable class job #locals returns the locals hash, as is :tag / :tags => [ t0, t1 ] accepts one tag accepts an array of tags turns tags into strings blocking: true runs the job in the same thread as the scheduler thread default one thread per job behaviour runs the job in a dedicated thread :allow_overlapping / :allow_overlap / :overlap default (overlap: true) lets a job overlap itself when overlap: false prevents a job from overlapping itself :mutex mutex: "mutex_name" prevents concurrent executions mutex: mutex_instance prevents concurrent executions mutex: [ array_of_mutex_names_or_instances ] prevents concurrent executions timeout: duration_or_point_in_time interrupts the job it is stashed to (duration) interrupts the job it is stashed to (point in time) starts timing when the job enters successfully all its mutexes emits the timeout information to $stderr (default #on_error) does not prevent a repeat job from recurring name: / n: sets the job name work time #last_work_time starts at 0 keeps track of how long the work was upon last trigger #mean_work_time starts at 0 gathers work times and computes the mean one time job #determine_id returns unique ids repeat job #determine_id returns unique ids Rufus::Scheduler custom locks does not trigger when #confirm_lock returns false Rufus::Scheduler::FileLock :scheduler_lock => Rufus::Scheduler::FileLock.new(path) writes down a .rufus-scheduler.lock file "flocks" the lock file Rufus::Scheduler :lockfile => ".rufus-scheduler.lock" writes down a .rufus-scheduler.lock file "flocks" the lock file prevents newer schedulers from starting releases the lockfile when shutting down Rufus::Scheduler when running multiple schedulers side-by-side only starts if it can acquire a scheduler lock only triggers jobs when it can acquire a trigger lock Rufus::Scheduler .parse parses duration strings parses datetimes parses datetimes with timezones parses datetimes with named timezones parses datetimes (with the local timezone implicitly) parses cronlines raises on unparseable input uses Chronic if present passes options to Chronic .parse_duration parses duration strings calls #to_s on its input raises on wrong duration strings returns nil on unreadable duration when no_error: true .parse_cron parses a cron string fails on non cron string returns nil on cron string when no_error: true .to_duration turns integers into duration strings ignores seconds and milliseconds if :drop_seconds => true displays months if :months => true turns floats into duration strings .to_duration_hash turns 0 into {:s=>0} turns 60 into {:m=>1} turns 0.128 into {:s=>0.128} turns 60.127 into {:m=>1, :s=>0.127} turns 61.127 into {:m=>1, :s=>1.127} turns 61.127 into {:m=>1} ({:drop_seconds=>true}) Rufus::Scheduler #at raises if the block to schedule is missing returns a job id returns a job if :job => true adds a job triggers a job removes the job after execution accepts a Time instance accepts a time string accepts a time string with a delta timezone accepts a time string with a named timezone accepts a Chronic string (if Chronic is present) accepts a Chronic string and Chronic options (if Chronic present) accepts an ActiveSupport time thinggy (PENDING: Not yet implemented) #schedule_at returns a job Rufus::Scheduler #cron schedules accepts a CronLine instance is not slow handling frequent cron durations is not slow handling non-frequent cron durations fails if the job frequency is higher than the scheduler frequency fails if the cron line is invalid #schedule_cron returns a CronJob instance accepts a CronLine instance Rufus::Scheduler #every adds a job triggers a job (2 times) does not remove the job after execution raises on negative frequencies raises on zero frequencies does not reschedule if the job was unscheduled raises if the job frequency is higher than the scheduler frequency #schedule_every accepts a duration string Rufus::Scheduler #in adds a job triggers a job removes the job after execution #schedule_in accepts a number accepts a duration string accepts an ActiveSupport .from_now thinggy (PENDING: Not yet implemented) Rufus::Scheduler #interval adds a job triggers a job (2 times) triggers, but reschedules after the trigger execution does not reschedule if the job was unscheduled raises on negative intervals raises on zero intervals #schedule_interval accepts a duration string Rufus::Scheduler #schedule leaves the schedule option hash untouched (2 args) leaves the schedule option hash untouched (3 args) accepts a CronLine instance #at leaves the schedule option hash untouched (2 args) leaves the schedule option hash untouched (3 args) Rufus::Scheduler #initialize starts the scheduler thread sets :name and :rufus_scheduler in the scheduler thread local vars accepts a frequency: 2 (int) option accepts a frequency: "2h1m" option accepts a thread_name: option accepts a max_work_threads: option accepts a discard_past: option a schedule method passes the job to its block when it triggers passes the trigger time as second block argument accepts a callable object instead of a block accepts a callable obj instead of a block (#call with no args) accepts a class as callable raises if the scheduler is shutting down #in / #at accepts point in time and duration indifferently (#in) accepts point in time and duration indifferently (#at) #schedule accepts a duration and schedules an InJob accepts a point in time and schedules an AtJob accepts a cron string and schedules a CronJob #repeat accepts a duration and schedules an EveryJob accepts a cron string and schedules a CronJob #unschedule(job_or_work_id) accepts job ids accepts jobs carefully unschedules repeat jobs #uptime returns the uptime as a float #uptime_s returns the uptime as a human readable string #join joins the scheduler thread #join(limit) joins the scheduler thread times out #job(job_id) returns nil if there is no corresponding Job instance returns the corresponding Job instance #threads just lists the main thread (scheduler thread) when no job is scheduled lists all the threads a scheduler uses #work_threads(:all | :vacant) returns an empty array when the scheduler has not yet done anything lists the [vacant] work threads in the pool #work_threads(:active) returns [] when there are no jobs running returns the list of threads of the running jobs does not return threads from other schedulers #max_work_threads returns the max job thread count #max_work_threads= sets the max job thread count #running_jobs returns [] when there are no running jobs returns a list of running Job instances does not return twice the same job #running_jobs(:tag/:tags => x) returns a list of running jobs filtered by tag #occurrences(time0, time1) returns a { job => [ times ] } of job occurrences returns a [ [ time, job ], ... ] of job occurrences when :timeline respects :first_at for repeat jobs respects :times for repeat jobs #timeline returns a [ [ time, job ], ... ] of job occurrences should not lock when running timeline with a :first_at specified #shutdown blanks the uptime shuts the scheduler down has a #stop alias #shutdown(:wait) shuts down and blocks until all the jobs ended their current runs does not mind being called from a scheduler job (gh-304) #shutdown(wait: n) waits no more than n seconds does not mind being called from a scheduler job (gh-304) #shutdown(:kill) kills all the jobs and then shuts down does not mind being called from a scheduler job (gh-304) #pause pauses the scheduler #resume works discard_past: by default discards the past false prevents discarding the past #paused? returns true if the scheduler is paused returns false if the scheduler is not paused #down? returns true when the scheduler is down returns false when the scheduler is up #up? returns true when the scheduler is up #jobs is empty at the beginning returns the list of scheduled jobs returns all the jobs (even those pending reschedule) does not return unscheduled jobs #jobs(:tag / :tags => x) returns [] when there are no jobs with the corresponding tag returns the jobs with the corresponding tag #every_jobs returns EveryJob instances #at_jobs returns AtJob instances #in_jobs returns InJob instances #cron_jobs returns CronJob instances #interval_jobs returns IntervalJob instances #on_pre_trigger is called right before a job triggers accepts the job and the triggerTime as argument when it returns false prevents the job from triggering #on_post_trigger is called right after a job triggers #around_trigger functions normally if no around_trigger is defined wraps the job does not block (runs in job thread) .singleton / .s returns a singleton instance of the scheduler accepts initialization parameters Rufus::Scheduler thread pool starts with an empty thread pool does not cross the max_work_threads threshold does not cross the max_work_threads threshold (overlap: false) does not execute unscheduled jobs Pending: (Failures listed here are expected and do not affect your suite's status) 1) Rufus::Scheduler#at accepts an ActiveSupport time thinggy # Not yet implemented # ./spec/schedule_at_spec.rb:149 2) Rufus::Scheduler#schedule_in accepts an ActiveSupport .from_now thinggy # Not yet implemented # ./spec/schedule_in_spec.rb:73 Finished in 6 minutes 50 seconds (files took 0.72746 seconds to load) 308 examples, 0 failures, 2 pending ┌──────────────────────────────────────────────────────────────────────────────┐ │ dh_ruby --install finished │ └──────────────────────────────────────────────────────────────────────────────┘ dh_installdocs -i -O--buildsystem=ruby dh_ruby_fixdocs -i -O--buildsystem=ruby debian/rules override_dh_installchangelogs make[1]: Entering directory '/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0' dh_installchangelogs CHANGELOG.md -O--buildsystem=ruby make[1]: Leaving directory '/build/ruby-rufus-scheduler-ruphTJ/ruby-rufus-scheduler-3.8.0' dh_installsystemduser -i -O--buildsystem=ruby dh_perl -i -O--buildsystem=ruby dh_link -i -O--buildsystem=ruby dh_strip_nondeterminism -i -O--buildsystem=ruby dh_compress -X.rb -i -O--buildsystem=ruby dh_fixperms -i -O--buildsystem=ruby dh_missing -i -O--buildsystem=ruby dh_ruby_fixdepends -i -O--buildsystem=ruby dh_installdeb -i -O--buildsystem=ruby dh_gencontrol -i -O--buildsystem=ruby dpkg-gencontrol: warning: Depends field of package ruby-rufus-scheduler: substitution variable ${shlibs:Depends} used, but is not defined dh_md5sums -i -O--buildsystem=ruby dh_builddeb -i -O--buildsystem=ruby dpkg-deb: building package 'ruby-rufus-scheduler' in '../ruby-rufus-scheduler_3.8.0-2_all.deb'. dpkg-genbuildinfo --build=all dpkg-genchanges --build=all >../ruby-rufus-scheduler_3.8.0-2_all.changes dpkg-genchanges: info: binary-only arch-indep upload (source code and arch-specific packages not included) dpkg-source --after-build . dpkg-buildpackage: info: binary-only upload (no source included) I: running special hook: sync-out /build/ruby-rufus-scheduler-ruphTJ /tmp/ruby-rufus-scheduler-3.8.0-2yd84kjex I: cleaning package lists and apt cache... I: creating tarball... I: done I: removing tempdir /tmp/mmdebstrap.P5m9yEj0uq... I: success in 3181.3944 seconds md5: ruby-rufus-scheduler_3.8.0-2_all.deb: OK sha1: ruby-rufus-scheduler_3.8.0-2_all.deb: OK sha256: ruby-rufus-scheduler_3.8.0-2_all.deb: OK Checksums: OK