Input buildinfo: https://buildinfos.debian.net/buildinfo-pool/c/ctdopts/ctdopts_1.4-2_all.buildinfo Use metasnap for getting required timestamps New buildinfo file: /tmp/ctdopts-1.4-25z768bwa/ctdopts_1.4-2_all.buildinfo Get source package info: ctdopts=1.4-2 Source URL: http://snapshot.notset.fr/mr/package/ctdopts/1.4-2/srcfiles?fileinfo=1 env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin TMPDIR=/tmp mmdebstrap --arch=amd64 --include=2to3=3.8.6-1 autoconf=2.69-11.1 automake=1:1.16.2-4 autopoint=0.19.8.1-10 autotools-dev=20180224.1 base-files=11 base-passwd=3.5.48 bash=5.1~rc1-2 binutils=2.35.1-2 binutils-common=2.35.1-2 binutils-x86-64-linux-gnu=2.35.1-2 bsdextrautils=2.36-3+b2 bsdutils=1:2.36-3+b1 build-essential=12.8 bzip2=1.0.8-4 coreutils=8.32-4+b1 cpp=4:10.2.0-1 cpp-10=10.2.0-16 dash=0.5.10.2-7 debconf=1.5.74 debhelper=13.2.1 debianutils=4.11.2 dh-autoreconf=19 dh-python=4.20200925 dh-strip-nondeterminism=1.9.0-1 diffutils=1:3.7-3 dpkg=1.20.5 dpkg-dev=1.20.5 dwz=0.13-5 file=1:5.38-5 findutils=4.7.0+git20201010-2 g++=4:10.2.0-1 g++-10=10.2.0-16 gcc=4:10.2.0-1 gcc-10=10.2.0-16 gcc-10-base=10.2.0-16 gettext=0.19.8.1-10 gettext-base=0.19.8.1-10 grep=3.4-1 groff-base=1.22.4-5 gzip=1.10-2 hostname=3.23 init-system-helpers=1.58 intltool-debian=0.35.0+20060710.5 libacl1=2.2.53-8 libarchive-zip-perl=1.68-1 libasan6=10.2.0-16 libatomic1=10.2.0-16 libattr1=1:2.4.48-5 libaudit-common=1:2.8.5-3.1 libaudit1=1:2.8.5-3.1 libbinutils=2.35.1-2 libblkid1=2.36-3+b1 libbz2-1.0=1.0.8-4 libc-bin=2.31-4 libc-dev-bin=2.31-4 libc6=2.31-4 libc6-dev=2.31-4 libcap-ng0=0.7.9-2.2 libcc1-0=10.2.0-16 libcom-err2=1.45.6-1 libcroco3=0.6.13-1 libcrypt-dev=1:4.4.17-1 libcrypt1=1:4.4.17-1 libctf-nobfd0=2.35.1-2 libctf0=2.35.1-2 libdb5.3=5.3.28+dfsg1-0.6 libdebconfclient0=0.255 libdebhelper-perl=13.2.1 libdpkg-perl=1.20.5 libelf1=0.181-1 libexpat1=2.2.10-1 libffi7=3.3-4 libfile-stripnondeterminism-perl=1.9.0-1 libgcc-10-dev=10.2.0-16 libgcc-s1=10.2.0-16 libgcrypt20=1.8.7-2 libgdbm-compat4=1.18.1-5.1 libgdbm6=1.18.1-5.1 libglib2.0-0=2.66.2-1 libgmp10=2:6.2.0+dfsg-6 libgomp1=10.2.0-16 libgpg-error0=1.38-2 libgssapi-krb5-2=1.17-10 libicu67=67.1-4 libisl22=0.22.1-1 libitm1=10.2.0-16 libk5crypto3=1.17-10 libkeyutils1=1.6.1-2 libkrb5-3=1.17-10 libkrb5support0=1.17-10 liblsan0=10.2.0-16 liblz4-1=1.9.2-2 liblzma5=5.2.4-1+b1 libmagic-mgc=1:5.38-5 libmagic1=1:5.38-5 libmount1=2.36-3+b1 libmpc3=1.2.0-1 libmpfr6=4.1.0-3 libncursesw6=6.2+20200918-1 libnsl-dev=1.3.0-2 libnsl2=1.3.0-2 libnss-nis=3.1-4 libnss-nisplus=1.3-4 libpam-modules=1.3.1-5 libpam-modules-bin=1.3.1-5 libpam-runtime=1.3.1-5 libpam0g=1.3.1-5 libpcre2-8-0=10.34-7 libpcre3=2:8.39-13 libperl5.30=5.30.3-4 libpipeline1=1.5.3-1 libpython3-stdlib=3.8.6-1 libpython3.8-minimal=3.8.6-1 libpython3.8-stdlib=3.8.6-1 libquadmath0=10.2.0-16 libreadline8=8.0-4 libseccomp2=2.4.4-1+b1 libselinux1=3.1-2+b1 libsigsegv2=2.12-2 libsmartcols1=2.36-3+b1 libsqlite3-0=3.33.0-1 libssl1.1=1.1.1h-1 libstdc++-10-dev=10.2.0-16 libstdc++6=10.2.0-16 libsub-override-perl=0.09-2 libsystemd0=246.6-2 libtinfo6=6.2+20200918-1 libtirpc-common=1.2.6-3 libtirpc-dev=1.2.6-3 libtirpc3=1.2.6-3 libtool=2.4.6-14 libtsan0=10.2.0-16 libubsan1=10.2.0-16 libuchardet0=0.0.7-1 libudev1=246.6-2 libunistring2=0.9.10-4 libuuid1=2.36-3+b1 libxml2=2.9.10+dfsg-6.2 libzstd1=1.4.5+dfsg-4 linux-libc-dev=5.9.1-1 login=1:4.8.1-1 lsb-base=11.1.0 m4=1.4.18-4 make=4.3-4 man-db=2.9.3-2 mawk=1.3.4.20200120-2 mime-support=3.64 ncurses-base=6.2+20200918-1 ncurses-bin=6.2+20200918-1 patch=2.7.6-6 perl=5.30.3-4 perl-base=5.30.3-4 perl-modules-5.30=5.30.3-4 po-debconf=1.0.21 python3=3.8.6-1 python3-distutils=3.8.6-1 python3-lib2to3=3.8.6-1 python3-minimal=3.8.6-1 python3-pkg-resources=50.3.0-1 python3-setuptools=50.3.0-1 python3-tz=2020.1-2 python3.8=3.8.6-1 python3.8-minimal=3.8.6-1 readline-common=8.0-4 sed=4.7-1 sensible-utils=0.0.12+nmu1 sysvinit-utils=2.96-5 tar=1.30+dfsg-7 tzdata=2020d-1 util-linux=2.36-3+b1 xz-utils=5.2.4-1+b1 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/20210814T212851Z/ bookworm main deb-src http://snapshot.notset.fr/archive/debian/20210814T212851Z/ bookworm main deb http://snapshot.notset.fr/archive/debian/20201116T092020Z/ unstable main deb http://snapshot.notset.fr/archive/debian/20201101T210343Z/ 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 ctdopts=1.4-2 && mkdir -p /build/ctdopts-9aAXRL && dpkg-source --no-check -x /*.dsc /build/ctdopts-9aAXRL/ctdopts-1.4 && chown -R builduser:builduser /build/ctdopts-9aAXRL" --customize-hook=chroot "$1" env --unset=TMPDIR runuser builduser -c "cd /build/ctdopts-9aAXRL/ctdopts-1.4 && env DEB_BUILD_OPTIONS="parallel=4" LC_ALL="C.UTF-8" SOURCE_DATE_EPOCH="1604347591" dpkg-buildpackage -uc -a amd64 --build=all" --customize-hook=sync-out /build/ctdopts-9aAXRL /tmp/ctdopts-1.4-25z768bwa bullseye /dev/null deb http://snapshot.notset.fr/archive/debian/20201101T210343Z 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.cwzvIWHJA2 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.cwzvIWHJA2 Reading package lists... Building dependency tree... util-linux is already the newest version (2.36-3+b1). 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/20201101T210343Z unstable/main amd64 libfakeroot amd64 1.25.3-1 [47.0 kB] Get:2 http://snapshot.notset.fr/archive/debian/20201101T210343Z unstable/main amd64 fakeroot amd64 1.25.3-1 [87.0 kB] debconf: delaying package configuration, since apt-utils is not installed Fetched 134 kB in 0s (726 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 ... 4664 files and directories currently installed.) Preparing to unpack .../libfakeroot_1.25.3-1_amd64.deb ... Unpacking libfakeroot:amd64 (1.25.3-1) ... Selecting previously unselected package fakeroot. Preparing to unpack .../fakeroot_1.25.3-1_amd64.deb ... Unpacking fakeroot (1.25.3-1) ... Setting up libfakeroot:amd64 (1.25.3-1) ... Setting up fakeroot (1.25.3-1) ... update-alternatives: using /usr/bin/fakeroot-sysv to provide /usr/bin/fakeroot (fakeroot) in auto mode Processing triggers for libc-bin (2.31-4) ... 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/20210814T212851Z/ bookworm main deb-src http://snapshot.notset.fr/archive/debian/20210814T212851Z/ bookworm main deb http://snapshot.notset.fr/archive/debian/20201116T092020Z/ unstable main deb http://snapshot.notset.fr/archive/debian/20201101T210343Z/ unstable main' >> /etc/apt/sources.list && apt-get update"' exec /tmp/mmdebstrap.cwzvIWHJA2 Get:1 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm InRelease [81.6 kB] Get:2 http://snapshot.notset.fr/archive/debian/20201116T092020Z unstable InRelease [146 kB] Hit:3 http://snapshot.notset.fr/archive/debian/20201101T210343Z unstable InRelease Ign:4 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main Sources Ign:5 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main amd64 Packages Ign:4 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main Sources Ign:5 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main amd64 Packages Ign:4 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main Sources Ign:5 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main amd64 Packages Get:4 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main Sources [11.4 MB] Get:5 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main amd64 Packages [11.1 MB] Ign:6 http://snapshot.notset.fr/archive/debian/20201116T092020Z unstable/main amd64 Packages Ign:6 http://snapshot.notset.fr/archive/debian/20201116T092020Z unstable/main amd64 Packages Ign:6 http://snapshot.notset.fr/archive/debian/20201116T092020Z unstable/main amd64 Packages Get:6 http://snapshot.notset.fr/archive/debian/20201116T092020Z unstable/main amd64 Packages [11.5 MB] Fetched 34.3 MB in 30s (1152 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.cwzvIWHJA2 I: running --customize-hook in shell: sh -c 'chroot "$1" env sh -c "apt-get source --only-source -d ctdopts=1.4-2 && mkdir -p /build/ctdopts-9aAXRL && dpkg-source --no-check -x /*.dsc /build/ctdopts-9aAXRL/ctdopts-1.4 && chown -R builduser:builduser /build/ctdopts-9aAXRL"' exec /tmp/mmdebstrap.cwzvIWHJA2 Reading package lists... NOTICE: 'ctdopts' packaging is maintained in the 'Git' version control system at: https://salsa.debian.org/med-team/ctdopts.git Please use: git clone https://salsa.debian.org/med-team/ctdopts.git to retrieve the latest (possibly unreleased) updates to the package. Need to get 40.8 kB of source archives. Get:1 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main ctdopts 1.4-2 (dsc) [2058 B] Get:2 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main ctdopts 1.4-2 (tar) [34.9 kB] Get:3 http://snapshot.notset.fr/archive/debian/20210814T212851Z bookworm/main ctdopts 1.4-2 (diff) [3900 B] Fetched 40.8 kB in 0s (377 kB/s) Download complete and in download only mode W: Download is performed unsandboxed as root as file 'ctdopts_1.4-2.dsc' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied) dpkg-source: info: extracting ctdopts in /build/ctdopts-9aAXRL/ctdopts-1.4 dpkg-source: info: unpacking ctdopts_1.4.orig.tar.gz dpkg-source: info: unpacking ctdopts_1.4-2.debian.tar.xz dpkg-source: info: using patch list from debian/patches/series dpkg-source: info: applying 2to3 dpkg-source: info: applying bc082bd2e20c81fdf33cf96f8241f6cce68f2f8d.patch I: running --customize-hook in shell: sh -c 'chroot "$1" env --unset=TMPDIR runuser builduser -c "cd /build/ctdopts-9aAXRL/ctdopts-1.4 && env DEB_BUILD_OPTIONS="parallel=4" LC_ALL="C.UTF-8" SOURCE_DATE_EPOCH="1604347591" dpkg-buildpackage -uc -a amd64 --build=all"' exec /tmp/mmdebstrap.cwzvIWHJA2 dpkg-buildpackage: info: source package ctdopts dpkg-buildpackage: info: source version 1.4-2 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by Andreas Tille dpkg-source --before-build . debian/rules clean dh clean --with python3 --buildsystem=pybuild dh_auto_clean -O--buildsystem=pybuild I: pybuild base:217: python3.8 setup.py clean running clean removing '/build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build' (and everything under it) 'build/bdist.linux-x86_64' does not exist -- can't clean it 'build/scripts-3.8' does not exist -- can't clean it dh_autoreconf_clean -O--buildsystem=pybuild dh_clean -O--buildsystem=pybuild debian/rules binary-indep dh binary-indep --with python3 --buildsystem=pybuild dh_update_autotools_config -i -O--buildsystem=pybuild dh_autoreconf -i -O--buildsystem=pybuild dh_auto_configure -i -O--buildsystem=pybuild I: pybuild base:217: python3.8 setup.py config running config debian/rules override_dh_auto_build make[1]: Entering directory '/build/ctdopts-9aAXRL/ctdopts-1.4' dh_auto_build I: pybuild base:217: /usr/bin/python3 setup.py build running build running build_py creating /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts copying CTDopts/CTDopts.py -> /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts copying CTDopts/__init__.py -> /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts Fixing /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/CTDopts.py /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/__init__.py Skipping optional fixer: buffer Skipping optional fixer: idioms Skipping optional fixer: set_literal Skipping optional fixer: ws_comma Fixing /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/CTDopts.py /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/__init__.py Skipping optional fixer: buffer Skipping optional fixer: idioms Skipping optional fixer: set_literal Skipping optional fixer: ws_comma /usr/lib/python3/dist-packages/setuptools/lib2to3_ex.py:36: SetuptoolsDeprecationWarning: 2to3 support is deprecated. If the project still requires Python 2 support, please migrate to a single-codebase solution or employ an independent conversion process. warnings.warn( # an override, not a PYBUILD directive, as we only need to do this once # not for every Python version 2to3 --write --nobackups --no-diffs --output-dir=debian example.py lib2to3.main: Output in 'debian' will mirror the input directory '' layout. RefactoringTool: Skipping optional fixer: buffer RefactoringTool: Skipping optional fixer: idioms RefactoringTool: Skipping optional fixer: set_literal RefactoringTool: Skipping optional fixer: ws_comma RefactoringTool: Refactored example.py RefactoringTool: Writing converted example.py to debian/example.py. RefactoringTool: Files that were modified: RefactoringTool: example.py make[1]: Leaving directory '/build/ctdopts-9aAXRL/ctdopts-1.4' debian/rules override_dh_auto_test make[1]: Entering directory '/build/ctdopts-9aAXRL/ctdopts-1.4' export PYBUILD_SYSTEM=custom; dh_auto_test I: pybuild base:217: PYTHONPATH=/build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build python3.8 debian/example.py /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/CTDopts.py:1070: UserWarning: Argument restrictions for positive_int violated. Restriction: 0:. Value: -5 warnings.warn('Argument restrictions for %s violated. Restriction: %s. Value: %s' % /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/CTDopts.py:1070: UserWarning: Argument restrictions for output violated. Restriction: *.fastq,*.fastq.gz. Value: warnings.warn('Argument restrictions for %s violated. Restriction: %s. Value: %s' % Model being written to exampleTool.ctd... Model loaded from exampleTool.ctd... For debugging purposes we can output a human readable representation of Parameter objects. Here's the first one: PARAMETER positive_int type: int default: 5 tags: advanced, magic restrictions on numeric range: 0 to None description: A positive integer parameter The following parameters were registered in the model: ['positive_int', 'input_files', 'output', 'this_that', 'param_1', 'param_2', 'param_3'] The same parameters with subgroup information, if they were registered under parameter groups: ['positive_int', 'input_files', 'output', 'this_that', 'subparams:param_1', 'subparams:param_2', 'subparams:subsubparam:param_3'] A dictionary of parameters with default values, returned by CTDModel.get_defaults(): { 'positive_int': 5, 'subparams': { 'param_1': 5.5, 'param_2': [0.0, 2.5, 5.0], 'subsubparam': {'param_3': 2}}, 'this_that': 'this'} As you can see, parameter values are usually stored in nested dictionaries. If you want a flat dictionary, you canget that using CTDopts.flatten_dict(). Flat keys can be either tuples of tree node (subgroup) names down to the parameter... { ('positive_int',): 5, ('subparams', 'param_1'): 5.5, ('subparams', 'param_2'): [0.0, 2.5, 5.0], ('subparams', 'subsubparam', 'param_3'): 2, ('this_that',): 'this'} ...or they can be strings where nesing levels are separated by colons: { 'positive_int': 5, 'subparams:param_1': 5.5, 'subparams:param_2': [0.0, 2.5, 5.0], 'subparams:subsubparam:param_3': 2, 'this_that': 'this'} We can create dictionaries of arguments on our own that we want to validate against the model.CTDopts can read them from argument-storing CTD files or from the command line, but we can just define them in a nested dictionary on our own as well. We start with defining them explicitly. { 'input_files': ['file1.fastq', 'file2.fastq', 'file3.fastq'], 'positive_int': 111, 'subparams': {'param_1': '999.0'}} We can validate these arguments against the model, and get a dictionary with parameter types correctly casted and defaults set. Note that subparams:param_1 was casted from string to a floating point number because that's how it was defined in the model. { 'input_files': ['file1.fastq', 'file2.fastq', 'file3.fastq'], 'positive_int': 111, 'subparams': { 'param_1': 999.0, 'param_2': [0.0, 2.5, 5.0], 'subsubparam': {'param_3': 2}}, 'this_that': 'this'} We can write a CTD file containing these validated argument values. Just call CTDModel.write_ctd() with an extra parameter: the nested argument dictionary containing the actual values. As mentioned earlier, CTDopts can load argument values from CTD files. Feel free to change some values in exampleTool_preset_params.ctd you've just written, and load it back. { 'input_files': ['file1.fastq', 'file2.fastq', 'file3.fastq'], 'output': '', 'positive_int': '111', 'subparams': { 'param_1': '999.0', 'param_2': ['0.0', '2.5', '5.0'], 'subsubparam': {'param_3': '2'}}, 'this_that': 'this'} Notice that all the argument values are strings now. This is because we didn't validate them against the model, just loaded some stuff from a file into a dictionary. If you want to cast them, call CTDModel.validate_args(): { 'input_files': ['file1.fastq', 'file2.fastq', 'file3.fastq'], 'output': '', 'positive_int': 111, 'subparams': { 'param_1': 999.0, 'param_2': [0.0, 2.5, 5.0], 'subsubparam': {'param_3': 2}}, 'this_that': 'this'} Now certain parameters may have restrictions that we might want to validate for as well. Let's set the parameter positive_int to a negative value, and try to validate it with a strictness level enforce_restrictions=1. This will register a warning, but still accept the value. Validation enforcement levels can be 0, 1 or 2 for type-casting, restriction-checking and required argument presence. They can be set with the keywords enforce_type, enforce_restrictions and enforce_required respectively. Let's increase strictness for restriction checking. CTDModel.validate_args() will now raise an exception that we'll catch: Argument restrictions for positive_int failed. Restriction: 0:. Value: -5 One might want to combine arguments loaded from a CTD file with arguments coming from elsewhere, like the command line.In that case, the method CTDopts.override_args(*arg_dicts) creates a combined argument dictionary where argument values are always taken from the rightmost (last) dictionary that has them. Let's override a few parameters: { 'input_files': ['file1.fastq', 'file2.fastq', 'file3.fastq'], 'positive_int': 777, 'subparams': { 'param_1': 999.0, 'param_2': [0.0, 2.5, 5.0], 'subsubparam': {'param_3': 2}}, 'this_that': 'that'} So how to deal with command line arguments? If we have a model, we can look for its arguments. Call CTDModel.parse_cl_args() with either a string of the command line call or a list with the split words. By default, it will assume a '--' prefix before parameter names, but it can be overridden with prefix='-'.Grouped parameters are expected in --group:subgroup:param_x format. { 'input_files': ['a.fastq', 'b.fastq'], 'output': 'out_dir/', 'positive_int': '44', 'subparams': { 'param_1': 5.5, 'param_2': ['5.0', '5.5', '6.0'], 'subsubparam': {'param_3': 2}}, 'this_that': 'this'} Override other parameters with them, and validate it against the model: { 'input_files': ['a.fastq', 'b.fastq'], 'output': 'out_dir/', 'positive_int': 44, 'subparams': { 'param_1': 5.5, 'param_2': [5.0, 5.5, 6.0], 'subsubparam': {'param_3': 2}}, 'this_that': 'this'} One last thing: certain command line directives that are specific to CTD functionality can be parsed for, to help your script performing common tasks. These are CTD argument input, CTD model file writing and CTD argument file writing. CTDopts.parse_cl_directives() can also be customized as to what directives to look for if the defaults --input_ctd, --write_tool_ctd and --write_param_ctd respectively don't satisfy you. { 'input_ctd': 'exampleTool_preset_params.ctd', 'write_param_ctd': 'new_preset_params.ctd', 'write_tool_ctd': None} { 'input_ctd': 'exampleTool_preset_params_2.ctd', 'write_param_ctd': None, 'write_tool_ctd': True} Finally, writing CTDs with logging information, passing a dictionarywith a 'log' keyword, using any or all of the fields shown below. make[1]: Leaving directory '/build/ctdopts-9aAXRL/ctdopts-1.4' create-stamp debian/debhelper-build-stamp dh_testroot -i -O--buildsystem=pybuild dh_prep -i -O--buildsystem=pybuild dh_auto_install -i -O--buildsystem=pybuild I: pybuild base:217: /usr/bin/python3 setup.py install --root /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts running install running build running build_py running install_lib creating /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr creating /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib creating /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8 creating /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages creating /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts copying /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/__init__.py -> /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts creating /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts/__pycache__ copying /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/__pycache__/__init__.cpython-38.pyc -> /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts/__pycache__ copying /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/__pycache__/CTDopts.cpython-38.pyc -> /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts/__pycache__ copying /build/ctdopts-9aAXRL/ctdopts-1.4/.pybuild/cpython3_3.8_CTDopts/build/CTDopts/CTDopts.py -> /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts byte-compiling /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts/__init__.py to __init__.cpython-38.pyc byte-compiling /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts/CTDopts.py to CTDopts.cpython-38.pyc running install_egg_info running egg_info creating CTDopts.egg-info writing CTDopts.egg-info/PKG-INFO writing dependency_links to CTDopts.egg-info/dependency_links.txt writing requirements to CTDopts.egg-info/requires.txt writing top-level names to CTDopts.egg-info/top_level.txt writing manifest file 'CTDopts.egg-info/SOURCES.txt' reading manifest file 'CTDopts.egg-info/SOURCES.txt' writing manifest file 'CTDopts.egg-info/SOURCES.txt' Copying CTDopts.egg-info to /build/ctdopts-9aAXRL/ctdopts-1.4/debian/python3-ctdopts/usr/lib/python3.8/dist-packages/CTDopts-1.4.egg-info Skipping SOURCES.txt running install_scripts dh_install -i -O--buildsystem=pybuild dh_installdocs -i -O--buildsystem=pybuild dh_installchangelogs -i -O--buildsystem=pybuild dh_installexamples -i -O--buildsystem=pybuild dh_python3 -i -O--buildsystem=pybuild dh_installsystemduser -i -O--buildsystem=pybuild dh_perl -i -O--buildsystem=pybuild dh_link -i -O--buildsystem=pybuild dh_strip_nondeterminism -i -O--buildsystem=pybuild dh_compress -i -O--buildsystem=pybuild dh_fixperms -i -O--buildsystem=pybuild dh_missing -i -O--buildsystem=pybuild dh_installdeb -i -O--buildsystem=pybuild dh_gencontrol -i -O--buildsystem=pybuild dh_md5sums -i -O--buildsystem=pybuild dh_builddeb -i -O--buildsystem=pybuild dpkg-deb: building package 'python3-ctdopts' in '../python3-ctdopts_1.4-2_all.deb'. dpkg-genbuildinfo --build=all dpkg-genchanges --build=all >../ctdopts_1.4-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/ctdopts-9aAXRL /tmp/ctdopts-1.4-25z768bwa I: cleaning package lists and apt cache... I: creating tarball... I: done I: removing tempdir /tmp/mmdebstrap.cwzvIWHJA2... I: success in 535.0554 seconds md5: python3-ctdopts_1.4-2_all.deb: OK sha1: python3-ctdopts_1.4-2_all.deb: OK sha256: python3-ctdopts_1.4-2_all.deb: OK Checksums: OK