Source: python-configargparse Version: 1.7-1 Severity: normal User: [email protected] Usertags: python3.13 Forwarded: https://github.com/bw2/ConfigArgParse/issues/294
This package failed build from source when test-built against a version of python3-defaults that includes 3.13 as a supported version. To reproduce this issue, build against python3-defaults (python3-all-dev etc.) from Debian experimental. What's new in Python 3.13: https://docs.python.org/3.13/whatsnew/3.13.html Log snippet: dh_auto_test -O--buildsystem=pybuild I: pybuild base:311: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_configargparse/build; python3.13 -m pytest tests ============================= test session starts ============================== platform linux -- Python 3.13.0rc2, pytest-8.3.3, pluggy-1.5.0 rootdir: /<<PKGBUILDDIR>> plugins: typeguard-4.3.0 collected 50 items tests/test_configargparse.py ...FF........F...........F........F........ [ 86%] ....... [100%] =================================== FAILURES =================================== _______________________ TestBasicUseCases.testBasicCase2 _______________________ self = <tests.test_configargparse.TestBasicUseCases testMethod=testBasicCase2> use_groups = False def testBasicCase2(self, use_groups=False): ## Test command line, config file and env var values default_config_file = tempfile.NamedTemporaryFile(mode="w", delete=False) default_config_file.flush() p = self.initParser(default_config_files=['/etc/settings.ini', '/home/jeff/.user_settings', default_config_file.name]) p.add_arg('vcf', nargs='+', help='Variant file(s)') if not use_groups: self.add_arg('--genome', help='Path to genome file', required=True) self.add_arg('-v', dest='verbose', action='store_true') self.add_arg('-g', '--my-cfg-file', required=True, is_config_file=True) self.add_arg('-d', '--dbsnp', env_var='DBSNP_PATH') self.add_arg('-f', '--format', choices=["BED", "MAF", "VCF", "WIG", "R"], dest="fmt", metavar="FRMT", env_var="OUTPUT_FORMAT", default="BED") else: g = p.add_argument_group(title="g1") g.add_arg('--genome', help='Path to genome file', required=True) g.add_arg('-v', dest='verbose', action='store_true') g.add_arg('-g', '--my-cfg-file', required=True, is_config_file=True) g = p.add_argument_group(title="g2") g.add_arg('-d', '--dbsnp', env_var='DBSNP_PATH') g.add_arg('-f', '--format', choices=["BED", "MAF", "VCF", "WIG", "R"], dest="fmt", metavar="FRMT", env_var="OUTPUT_FORMAT", default="BED") # make sure required args are enforced self.assertParseArgsRaises("too few arg" if sys.version_info.major < 3 else "the following arguments are required: vcf, -g/--my-cfg-file", args="--genome hg19") self.assertParseArgsRaises("Unable to open config file: file.txt. Error: No such file or director", args="-g file.txt") # check values after setting args on command line config_file2 = tempfile.NamedTemporaryFile(mode="w", delete=False) config_file2.flush() ns = self.parse(args="--genome hg19 -g %s bla.vcf " % config_file2.name) self.assertEqual(ns.genome, "hg19") self.assertEqual(ns.verbose, False) self.assertIsNone(ns.dbsnp) self.assertEqual(ns.fmt, "BED") self.assertListEqual(ns.vcf, ["bla.vcf"]) self.assertRegex(self.format_values(), 'Command Line Args: --genome hg19 -g [^\\s]+ bla.vcf\n' 'Defaults:\n' ' --format: \\s+ BED\n') # check precedence: args > env > config > default using the --format arg default_config_file.write("--format MAF") default_config_file.flush() ns = self.parse(args="--genome hg19 -g %s f.vcf " % config_file2.name) self.assertEqual(ns.fmt, "MAF") self.assertRegex(self.format_values(), 'Command Line Args: --genome hg19 -g [^\\s]+ f.vcf\n' 'Config File \\([^\\s]+\\):\n' ' --format: \\s+ MAF\n') config_file2.write("--format VCF") config_file2.flush() ns = self.parse(args="--genome hg19 -g %s f.vcf " % config_file2.name) self.assertEqual(ns.fmt, "VCF") self.assertRegex(self.format_values(), 'Command Line Args: --genome hg19 -g [^\\s]+ f.vcf\n' 'Config File \\([^\\s]+\\):\n' ' --format: \\s+ VCF\n') ns = self.parse(env_vars={"OUTPUT_FORMAT":"R", "DBSNP_PATH":"/a/b.vcf"}, args="--genome hg19 -g %s f.vcf " % config_file2.name) self.assertEqual(ns.fmt, "R") self.assertEqual(ns.dbsnp, "/a/b.vcf") self.assertRegex(self.format_values(), 'Command Line Args: --genome hg19 -g [^\\s]+ f.vcf\n' 'Environment Variables:\n' ' DBSNP_PATH: \\s+ /a/b.vcf\n' ' OUTPUT_FORMAT: \\s+ R\n') ns = self.parse(env_vars={"OUTPUT_FORMAT":"R", "DBSNP_PATH":"/a/b.vcf", "ANOTHER_VAR":"something"}, args="--genome hg19 -g %s --format WIG f.vcf" % config_file2.name) self.assertEqual(ns.fmt, "WIG") self.assertEqual(ns.dbsnp, "/a/b.vcf") self.assertRegex(self.format_values(), 'Command Line Args: --genome hg19 -g [^\\s]+ --format WIG f.vcf\n' 'Environment Variables:\n' ' DBSNP_PATH: \\s+ /a/b.vcf\n') if not use_groups: > self.assertRegex(self.format_help(), 'usage: .* \\[-h\\] --genome GENOME \\[-v\\] -g MY_CFG_FILE\n?' '\\s+\\[-d DBSNP\\]\\s+\\[-f FRMT\\]\\s+vcf \\[vcf ...\\]\n\n' 'positional arguments:\n' ' vcf \\s+ Variant file\\(s\\)\n\n' '%s:\n' ' -h, --help \\s+ show this help message and exit\n' ' --genome GENOME \\s+ Path to genome file\n' ' -v\n' ' -g MY_CFG_FILE, --my-cfg-file MY_CFG_FILE\n' ' -d DBSNP, --dbsnp DBSNP\\s+\\[env var: DBSNP_PATH\\]\n' ' -f FRMT, --format FRMT\\s+\\[env var: OUTPUT_FORMAT\\]\n\n'%OPTIONAL_ARGS_STRING + 7*r'(.+\s*)') E AssertionError: Regex didn't match: 'usage: .* \\[-h\\] --genome GENOME \\[-v\\] -g MY_CFG_FILE\n?\\s+\\[-d DBSNP\\]\\s+\\[-f FRMT\\]\\s+vcf \\[vcf ...\\]\n\npositional arguments:\n vcf \\s+ Variant file\\(s\\)\n\noptions:\n -h, --help \\s+ show this help message and exit\n --genome GENOME \\s+ Path to genome file\n -v\n -g MY_CFG_FILE, --my-cfg-file MY_CFG_FILE\n -d DBSNP, --dbsnp DBSNP\\s+\\[env var: DBSNP_PATH\\]\n -f FRMT, --format FRMT\\s+\\[env var: OUTPUT_FORMAT\\]\n\n(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)' not found in "usage: __main__.py [-h] --genome GENOME [-v] -g MY_CFG_FILE [-d DBSNP]\n [-f FRMT]\n vcf [vcf ...]\n\npositional arguments:\n vcf Variant file(s)\n\noptions:\n -h, --help show this help message and exit\n --genome GENOME Path to genome file\n -v\n -g, --my-cfg-file MY_CFG_FILE\n -d, --dbsnp DBSNP [env var: DBSNP_PATH]\n -f, --format FRMT [env var: OUTPUT_FORMAT]\n\nArgs that start with '--' can also be set in a config file (/etc/settings.ini\nor /home/jeff/.user_settings or /tmp/tmpg77vec4j or specified via -g). Config\nfile syntax allows: key=value, flag=true, stuff=[a,b,c] (for details, see\nsyntax at https://goo.gl/R74nmi). In general, command-line values override\nenvironment variables which override config file values which override\ndefaults.\n" tests/test_configargparse.py:265: AssertionError _________________ TestBasicUseCases.testBasicCase2_WithGroups __________________ self = <tests.test_configargparse.TestBasicUseCases testMethod=testBasicCase2_WithGroups> def testBasicCase2_WithGroups(self): > self.testBasicCase2(use_groups=True) tests/test_configargparse.py:305: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_configargparse.py:279: in testBasicCase2 self.assertRegex(self.format_help(), E AssertionError: Regex didn't match: 'usage: .* \\[-h\\] --genome GENOME \\[-v\\] -g MY_CFG_FILE\n?\\s+\\[-d DBSNP\\]\\s+\\[-f FRMT\\]\\s+vcf \\[vcf ...\\]\n\npositional arguments:\n vcf \\s+ Variant file\\(s\\)\n\noptions:\n -h, --help \\s+ show this help message and exit\n\ng1:\n --genome GENOME \\s+ Path to genome file\n -v\n -g MY_CFG_FILE, --my-cfg-file MY_CFG_FILE\n\ng2:\n -d DBSNP, --dbsnp DBSNP\\s+\\[env var: DBSNP_PATH\\]\n -f FRMT, --format FRMT\\s+\\[env var: OUTPUT_FORMAT\\]\n\n(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)' not found in "usage: __main__.py [-h] --genome GENOME [-v] -g MY_CFG_FILE [-d DBSNP]\n [-f FRMT]\n vcf [vcf ...]\n\npositional arguments:\n vcf Variant file(s)\n\noptions:\n -h, --help show this help message and exit\n\ng1:\n --genome GENOME Path to genome file\n -v\n -g, --my-cfg-file MY_CFG_FILE\n\ng2:\n -d, --dbsnp DBSNP [env var: DBSNP_PATH]\n -f, --format FRMT [env var: OUTPUT_FORMAT]\n\nArgs that start with '--' can also be set in a config file (/etc/settings.ini\nor /home/jeff/.user_settings or /tmp/tmp9olocjab or specified via -g). Config\nfile syntax allows: key=value, flag=true, stuff=[a,b,c] (for details, see\nsyntax at https://goo.gl/R74nmi). In general, command-line values override\nenvironment variables which override config file values which override\ndefaults.\n" _________________ TestBasicUseCases.testMutuallyExclusiveArgs __________________ self = <tests.test_configargparse.TestBasicUseCases testMethod=testMutuallyExclusiveArgs> def testMutuallyExclusiveArgs(self): config_file = tempfile.NamedTemporaryFile(mode="w", delete=False) p = self.parser g = p.add_argument_group(title="group1") g.add_arg('--genome', help='Path to genome file', required=True) g.add_arg('-v', dest='verbose', action='store_true') g = p.add_mutually_exclusive_group(required=True) g.add_arg('-f1', '--type1-cfg-file', is_config_file=True) g.add_arg('-f2', '--type2-cfg-file', is_config_file=True) g = p.add_mutually_exclusive_group(required=True) g.add_arg('-f', '--format', choices=["BED", "MAF", "VCF", "WIG", "R"], dest="fmt", metavar="FRMT", env_var="OUTPUT_FORMAT", default="BED") g.add_arg('-b', '--bam', dest='fmt', action="store_const", const="BAM", env_var='BAM_FORMAT') ns = self.parse(args="--genome hg19 -f1 %s --bam" % config_file.name) self.assertEqual(ns.genome, "hg19") self.assertEqual(ns.verbose, False) self.assertEqual(ns.fmt, "BAM") ns = self.parse(env_vars={"BAM_FORMAT" : "true"}, args="--genome hg19 -f1 %s" % config_file.name) self.assertEqual(ns.genome, "hg19") self.assertEqual(ns.verbose, False) self.assertEqual(ns.fmt, "BAM") self.assertRegex(self.format_values(), 'Command Line Args: --genome hg19 -f1 [^\\s]+\n' 'Environment Variables:\n' ' BAM_FORMAT: \\s+ true\n' 'Defaults:\n' ' --format: \\s+ BED\n') > self.assertRegex(self.format_help(), r'usage: .* \[-h\] --genome GENOME \[-v\]\s+ \(-f1 TYPE1_CFG_FILE \|' ' \\s*-f2 TYPE2_CFG_FILE\\)\\s+\\(-f FRMT \\| -b\\)\n\n' '%s:\n' ' -h, --help show this help message and exit\n' ' -f1 TYPE1_CFG_FILE, --type1-cfg-file TYPE1_CFG_FILE\n' ' -f2 TYPE2_CFG_FILE, --type2-cfg-file TYPE2_CFG_FILE\n' ' -f FRMT, --format FRMT\\s+\\[env var: OUTPUT_FORMAT\\]\n' ' -b, --bam\\s+\\[env var: BAM_FORMAT\\]\n\n' 'group1:\n' ' --genome GENOME Path to genome file\n' ' -v\n\n'%OPTIONAL_ARGS_STRING + 5*r'(.+\s*)') E AssertionError: Regex didn't match: 'usage: .* \\[-h\\] --genome GENOME \\[-v\\]\\s+ \\(-f1 TYPE1_CFG_FILE \\| \\s*-f2 TYPE2_CFG_FILE\\)\\s+\\(-f FRMT \\| -b\\)\n\noptions:\n -h, --help show this help message and exit\n -f1 TYPE1_CFG_FILE, --type1-cfg-file TYPE1_CFG_FILE\n -f2 TYPE2_CFG_FILE, --type2-cfg-file TYPE2_CFG_FILE\n -f FRMT, --format FRMT\\s+\\[env var: OUTPUT_FORMAT\\]\n -b, --bam\\s+\\[env var: BAM_FORMAT\\]\n\ngroup1:\n --genome GENOME Path to genome file\n -v\n\n(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)' not found in "usage: __main__.py [-h] --genome GENOME [-v] (-f1 TYPE1_CFG_FILE |\n -f2 TYPE2_CFG_FILE) (-f FRMT | -b)\n\noptions:\n -h, --help show this help message and exit\n -f1, --type1-cfg-file TYPE1_CFG_FILE\n -f2, --type2-cfg-file TYPE2_CFG_FILE\n -f, --format FRMT [env var: OUTPUT_FORMAT]\n -b, --bam [env var: BAM_FORMAT]\n\ngroup1:\n --genome GENOME Path to genome file\n -v\n\nArgs that start with '--' can also be set in a config file (specified via -f1\nor -f2). Config file syntax allows: key=value, flag=true, stuff=[a,b,c] (for\ndetails, see syntax at https://goo.gl/R74nmi). In general, command-line values\noverride environment variables which override config file values which\noverride defaults.\n" tests/test_configargparse.py:385: AssertionError ___________________ TestMisc.testConstructor_ConfigFileArgs ____________________ self = <tests.test_configargparse.TestMisc testMethod=testConstructor_ConfigFileArgs> def testConstructor_ConfigFileArgs(self): # Test constructor args: # args_for_setting_config_path # config_arg_is_required # config_arg_help_message temp_cfg = tempfile.NamedTemporaryFile(mode="w", delete=False) temp_cfg.write("genome=hg19") temp_cfg.flush() self.initParser(args_for_setting_config_path=["-c", "--config"], config_arg_is_required = True, config_arg_help_message = "my config file", default_config_files=[temp_cfg.name]) self.add_arg('--genome', help='Path to genome file', required=True) self.assertParseArgsRaises("argument -c/--config is required" if sys.version_info.major < 3 else "arguments are required: -c/--config", args="") temp_cfg2 = tempfile.NamedTemporaryFile(mode="w", delete=False) ns = self.parse("-c " + temp_cfg2.name) self.assertEqual(ns.genome, "hg19") # temp_cfg2 config file should override default config file values temp_cfg2.write("genome=hg20") temp_cfg2.flush() ns = self.parse("-c " + temp_cfg2.name) self.assertEqual(ns.genome, "hg20") > self.assertRegex(self.format_help(), 'usage: .* \\[-h\\] -c CONFIG_FILE --genome GENOME\n\n' '%s:\n' ' -h, --help\\s+ show this help message and exit\n' ' -c CONFIG_FILE, --config CONFIG_FILE\\s+ my config file\n' ' --genome GENOME\\s+ Path to genome file\n\n'%OPTIONAL_ARGS_STRING + 5*r'(.+\s*)') E AssertionError: Regex didn't match: 'usage: .* \\[-h\\] -c CONFIG_FILE --genome GENOME\n\noptions:\n -h, --help\\s+ show this help message and exit\n -c CONFIG_FILE, --config CONFIG_FILE\\s+ my config file\n --genome GENOME\\s+ Path to genome file\n\n(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)(.+\\s*)' not found in "usage: __main__.py [-h] -c CONFIG_FILE --genome GENOME\n\noptions:\n -h, --help show this help message and exit\n -c, --config CONFIG_FILE\n my config file\n --genome GENOME Path to genome file\n\nArgs that start with '--' can also be set in a config file (/tmp/tmp4ehhi602\nor specified via -c). Config file syntax allows: key=value, flag=true,\nstuff=[a,b,c] (for details, see syntax at https://goo.gl/R74nmi). In general,\ncommand-line values override config file values which override defaults.\n" tests/test_configargparse.py:874: AssertionError ___________________________ TestMisc.test_FormatHelp ___________________________ self = <tests.test_configargparse.TestMisc testMethod=test_FormatHelp> def test_FormatHelp(self): self.initParser(args_for_setting_config_path=["-c", "--config"], config_arg_is_required = True, config_arg_help_message = "my config file", default_config_files=["~/.myconfig"], args_for_writing_out_config_file=["-w", "--write-config"], ) self.add_arg('--arg1', help='Arg1 help text', required=True) self.add_arg('--flag', help='Flag help text', action="store_true") > self.assertRegex(self.format_help(), r'usage: .* \[-h\] -c CONFIG_FILE\s+' r'\[-w CONFIG_OUTPUT_PATH\]\s* --arg1\s+ARG1\s*\[--flag\]\s*' '%s:\\s*' '-h, --help \\s* show this help message and exit ' r'-c CONFIG_FILE, --config CONFIG_FILE\s+my config file ' r'-w CONFIG_OUTPUT_PATH, --write-config CONFIG_OUTPUT_PATH takes ' r'the current command line args and writes them ' r'out to a config file at the given path, then exits ' r'--arg1 ARG1 Arg1 help text ' r'--flag Flag help text ' 'Args that start with \'--\' can also be set in a ' r'config file \(~/.myconfig or specified via -c\). ' r'Config file syntax allows: key=value, flag=true, stuff=\[a,b,c\] ' r'\(for details, see syntax at https://goo.gl/R74nmi\). ' r'In general, command-line values override config file values ' r'which override defaults. '.replace(' ', '\s*') % OPTIONAL_ARGS_STRING ) E AssertionError: Regex didn't match: "usage:\\s*.*\\s*\\[-h\\]\\s*-c\\s*CONFIG_FILE\\s+\\[-w\\s*CONFIG_OUTPUT_PATH\\]\\s*\\s*--arg1\\s+ARG1\\s*\\[--flag\\]\\s*options:\\s*-h,\\s*--help\\s*\\s*\\s*show\\s*this\\s*help\\s*message\\s*and\\s*exit\\s*-c\\s*CONFIG_FILE,\\s*--config\\s*CONFIG_FILE\\s+my\\s*config\\s*file\\s*-w\\s*CONFIG_OUTPUT_PATH,\\s*--write-config\\s*CONFIG_OUTPUT_PATH\\s*takes\\s*the\\s*current\\s*command\\s*line\\s*args\\s*and\\s*writes\\s*them\\s*out\\s*to\\s*a\\s*config\\s*file\\s*at\\s*the\\s*given\\s*path,\\s*then\\s*exits\\s*--arg1\\s*ARG1\\s*Arg1\\s*help\\s*text\\s*--flag\\s*Flag\\s*help\\s*text\\s*Args\\s*that\\s*start\\s*with\\s*'--'\\s*can\\s*also\\s*be\\s*set\\s*in\\s*a\\s*config\\s*file\\s*\\(~/.myconfig\\s*or\\s*specified\\s*via\\s*-c\\).\\s*Config\\s*file\\s*syntax\\s*allows:\\s*key=value,\\s*flag=true,\\s*stuff=\\[a,b,c\\]\\s*\\(for\\s*details,\\s*see\\s*syntax\\s*at\\s*https://goo.gl/R74nmi\\).\\s*In\\s*general,\\s*command-line\\s*values\\s*override\\s*config\\s*file\\s*values\\s*which\\s*override\\s*defaults.\\s*" not found in "usage: __main__.py [-h] -c CONFIG_FILE [-w CONFIG_OUTPUT_PATH] --arg1 ARG1\n [--flag]\n\noptions:\n -h, --help show this help message and exit\n -c, --config CONFIG_FILE\n my config file\n -w, --write-config CONFIG_OUTPUT_PATH\n takes the current command line args and writes them\n out to a config file at the given path, then exits\n --arg1 ARG1 Arg1 help text\n --flag Flag help text\n\nArgs that start with '--' can also be set in a config file (~/.myconfig or\nspecified via -c). Config file syntax allows: key=value, flag=true,\nstuff=[a,b,c] (for details, see syntax at https://goo.gl/R74nmi). In general,\ncommand-line values override config file values which override defaults.\n" tests/test_configargparse.py:933: AssertionError =============================== warnings summary =============================== tests/test_configargparse.py:949 /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_configargparse/build/tests/test_configargparse.py:949: SyntaxWarning: invalid escape sequence '\s' r'which override defaults. '.replace(' ', '\s*') % OPTIONAL_ARGS_STRING -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/test_configargparse.py::TestBasicUseCases::testBasicCase2 - Asse... FAILED tests/test_configargparse.py::TestBasicUseCases::testBasicCase2_WithGroups FAILED tests/test_configargparse.py::TestBasicUseCases::testMutuallyExclusiveArgs FAILED tests/test_configargparse.py::TestMisc::testConstructor_ConfigFileArgs FAILED tests/test_configargparse.py::TestMisc::test_FormatHelp - AssertionErr... =================== 5 failed, 45 passed, 1 warning in 0.28s ==================== E: pybuild pybuild:389: test: plugin distutils failed with: exit code=1: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_configargparse/build; python3.13 -m pytest tests I: pybuild base:311: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.12_configargparse/build; python3.12 -m pytest tests ============================= test session starts ============================== platform linux -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0 rootdir: /<<PKGBUILDDIR>> plugins: typeguard-4.3.0 collected 50 items tests/test_configargparse.py ........................................... [ 86%] ....... [100%] =============================== warnings summary =============================== tests/test_configargparse.py:949 /<<PKGBUILDDIR>>/.pybuild/cpython3_3.12_configargparse/build/tests/test_configargparse.py:949: SyntaxWarning: invalid escape sequence '\s' r'which override defaults. '.replace(' ', '\s*') % OPTIONAL_ARGS_STRING -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ======================== 50 passed, 1 warning in 0.14s ========================= dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.13 3.12" returned exit code 13 make: *** [debian/rules:7: binary] Error 25 dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 -------------------------------------------------------------------------------- Build finished at 2024-09-18T23:43:38Z If required, the full build log is available here (for the next 30 days): https://debusine.debian.net/artifact/781940/ This bug has been filed at "normal" severity, as we haven't started the transition to add 3.13 as a supported version, yet. This will be raised to RC as soon as that happens, hopefully well before trixie. Thanks, Stefano

