Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-yamllint for openSUSE:Factory checked in at 2023-12-17 21:31:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-yamllint (Old) and /work/SRC/openSUSE:Factory/.python-yamllint.new.25432 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-yamllint" Sun Dec 17 21:31:43 2023 rev:18 rq:1133548 version:1.33.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-yamllint/python-yamllint.changes 2023-06-01 17:21:14.550772887 +0200 +++ /work/SRC/openSUSE:Factory/.python-yamllint.new.25432/python-yamllint.changes 2023-12-17 21:34:15.861812603 +0100 @@ -1,0 +2,9 @@ +Fri Dec 15 22:11:00 UTC 2023 - Dirk Müller <dmuel...@suse.com> + +- update to 1.33.0: + * Add support for Python 3.12, drop support for Python 3.7 + * Rule ``document-end``: fix spurious "missing document end" + * Rule ``empty-values``: add ``forbid-in-block-sequences`` + option + +------------------------------------------------------------------- Old: ---- yamllint-1.32.0.tar.gz New: ---- yamllint-1.33.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-yamllint.spec ++++++ --- /var/tmp/diff_new_pack.KmqliQ/_old 2023-12-17 21:34:16.353830479 +0100 +++ /var/tmp/diff_new_pack.KmqliQ/_new 2023-12-17 21:34:16.353830479 +0100 @@ -18,23 +18,19 @@ %{?sle15_python_module_pythons} Name: python-yamllint -Version: 1.32.0 +Version: 1.33.0 Release: 0 Summary: A linter for YAML files License: GPL-3.0-only Group: Development/Languages/Python URL: https://github.com/adrienverge/yamllint Source: https://files.pythonhosted.org/packages/source/y/yamllint/yamllint-%{version}.tar.gz -BuildRequires: %{python_module base >= 3.6} +BuildRequires: %{python_module base >= 3.8} BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-PyYAML Requires: python-pathspec >= 0.5.3 -%if 0%{python_version_nodots} < 38 -# boo#1151703, See below -Requires: python-setuptools -%endif Requires(post): update-alternatives Requires(postun):update-alternatives BuildArch: noarch ++++++ yamllint-1.32.0.tar.gz -> yamllint-1.33.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/CHANGELOG.rst new/yamllint-1.33.0/CHANGELOG.rst --- old/yamllint-1.32.0/CHANGELOG.rst 2023-05-22 18:01:32.000000000 +0200 +++ new/yamllint-1.33.0/CHANGELOG.rst 2023-11-09 10:32:03.000000000 +0100 @@ -1,6 +1,13 @@ Changelog ========= +1.33.0 (2023-11-09) +------------------- + +- Add support for Python 3.12, drop support for Python 3.7 +- Rule ``document-end``: fix spurious "missing document end" +- Rule ``empty-values``: add ``forbid-in-block-sequences`` option + 1.32.0 (2023-05-22) ------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/PKG-INFO new/yamllint-1.33.0/PKG-INFO --- old/yamllint-1.32.0/PKG-INFO 2023-05-22 18:03:07.044988400 +0200 +++ new/yamllint-1.33.0/PKG-INFO 2023-11-09 10:34:59.056179000 +0100 @@ -1,9 +1,9 @@ Metadata-Version: 2.1 Name: yamllint -Version: 1.32.0 +Version: 1.33.0 Summary: A linter for YAML files. Author: Adrien Vergé -License: GPL-3.0-only +License: GPL-3.0-or-later Project-URL: homepage, https://github.com/adrienverge/yamllint Project-URL: repository, https://github.com/adrienverge/yamllint Project-URL: documentation, https://yamllint.readthedocs.io @@ -17,10 +17,17 @@ Classifier: Topic :: Software Development :: Debuggers Classifier: Topic :: Software Development :: Quality Assurance Classifier: Topic :: Software Development :: Testing -Requires-Python: >=3.7 +Requires-Python: >=3.8 Description-Content-Type: text/x-rst -Provides-Extra: dev License-File: LICENSE +Requires-Dist: pathspec>=0.5.3 +Requires-Dist: pyyaml +Provides-Extra: dev +Requires-Dist: doc8; extra == "dev" +Requires-Dist: flake8; extra == "dev" +Requires-Dist: flake8-import-order; extra == "dev" +Requires-Dist: rstcheck[sphinx]; extra == "dev" +Requires-Dist: sphinx; extra == "dev" yamllint ======== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/pyproject.toml new/yamllint-1.33.0/pyproject.toml --- old/yamllint-1.32.0/pyproject.toml 2023-05-06 10:13:45.000000000 +0200 +++ new/yamllint-1.33.0/pyproject.toml 2023-09-14 16:20:09.000000000 +0200 @@ -2,8 +2,8 @@ name = "yamllint" description = "A linter for YAML files." readme = {file = "README.rst", content-type = "text/x-rst"} -requires-python = ">=3.7" -license = {text = "GPL-3.0-only"} +requires-python = ">=3.8" +license = {text = "GPL-3.0-or-later"} authors = [{name = "Adrien Vergé"}] keywords = ["yaml", "lint", "linter", "syntax", "checker"] classifiers = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/tests/rules/test_document_end.py new/yamllint-1.33.0/tests/rules/test_document_end.py --- old/yamllint-1.32.0/tests/rules/test_document_end.py 2022-06-20 18:34:21.000000000 +0200 +++ new/yamllint-1.33.0/tests/rules/test_document_end.py 2023-06-27 11:20:04.000000000 +0200 @@ -71,3 +71,22 @@ '---\n' 'third: document\n' '...\n', conf, problem=(6, 1)) + + def test_directives(self): + conf = 'document-end: {present: true}' + self.check('%YAML 1.2\n' + '---\n' + 'document: end\n' + '...\n', conf) + self.check('%YAML 1.2\n' + '%TAG ! tag:clarkevans.com,2002:\n' + '---\n' + 'document: end\n' + '...\n', conf) + self.check('---\n' + 'first: document\n' + '...\n' + '%YAML 1.2\n' + '---\n' + 'second: document\n' + '...\n', conf) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/tests/rules/test_empty_values.py new/yamllint-1.33.0/tests/rules/test_empty_values.py --- old/yamllint-1.32.0/tests/rules/test_empty_values.py 2022-06-20 18:34:21.000000000 +0200 +++ new/yamllint-1.33.0/tests/rules/test_empty_values.py 2023-11-09 10:29:12.000000000 +0100 @@ -42,7 +42,8 @@ def test_in_block_mappings_disabled(self): conf = ('empty-values: {forbid-in-block-mappings: false,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'foo:\n', conf) self.check('---\n' @@ -51,7 +52,8 @@ def test_in_block_mappings_single_line(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'implicitly-null:\n', conf, problem1=(2, 17)) self.check('---\n' @@ -63,7 +65,8 @@ def test_in_block_mappings_all_lines(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'foo:\n' 'bar:\n' @@ -72,14 +75,16 @@ def test_in_block_mappings_explicit_end_of_document(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'foo:\n' '...\n', conf, problem1=(2, 5)) def test_in_block_mappings_not_end_of_document(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'foo:\n' 'bar:\n' @@ -87,7 +92,8 @@ def test_in_block_mappings_different_level(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'foo:\n' ' bar:\n' @@ -95,7 +101,8 @@ def test_in_block_mappings_empty_flow_mapping(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n' + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n' 'braces: disable\n' 'commas: disable\n') self.check('---\n' @@ -107,14 +114,16 @@ def test_in_block_mappings_empty_block_sequence(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'foo:\n' ' -\n', conf) def test_in_block_mappings_not_empty_or_explicit_null(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'foo:\n' ' bar:\n' @@ -137,7 +146,8 @@ def test_in_block_mappings_various_explicit_null(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n') + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') self.check('---\n' 'null-alias: ~\n', conf) self.check('---\n' @@ -147,7 +157,8 @@ def test_in_block_mappings_comments(self): conf = ('empty-values: {forbid-in-block-mappings: true,\n' - ' forbid-in-flow-mappings: false}\n' + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n' 'comments: disable\n') self.check('---\n' 'empty: # comment\n' @@ -158,7 +169,8 @@ def test_in_flow_mappings_disabled(self): conf = ('empty-values: {forbid-in-block-mappings: false,\n' - ' forbid-in-flow-mappings: false}\n' + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n' 'braces: disable\n' 'commas: disable\n') self.check('---\n' @@ -175,7 +187,8 @@ def test_in_flow_mappings_single_line(self): conf = ('empty-values: {forbid-in-block-mappings: false,\n' - ' forbid-in-flow-mappings: true}\n' + ' forbid-in-flow-mappings: true,\n' + ' forbid-in-block-sequences: false}\n' 'braces: disable\n' 'commas: disable\n') self.check('---\n' @@ -201,7 +214,8 @@ def test_in_flow_mappings_multi_line(self): conf = ('empty-values: {forbid-in-block-mappings: false,\n' - ' forbid-in-flow-mappings: true}\n' + ' forbid-in-flow-mappings: true,\n' + ' forbid-in-block-sequences: false}\n' 'braces: disable\n' 'commas: disable\n') self.check('---\n' @@ -226,7 +240,8 @@ def test_in_flow_mappings_various_explicit_null(self): conf = ('empty-values: {forbid-in-block-mappings: false,\n' - ' forbid-in-flow-mappings: true}\n' + ' forbid-in-flow-mappings: true,\n' + ' forbid-in-block-sequences: false}\n' 'braces: disable\n' 'commas: disable\n') self.check('---\n' @@ -240,7 +255,8 @@ def test_in_flow_mappings_comments(self): conf = ('empty-values: {forbid-in-block-mappings: false,\n' - ' forbid-in-flow-mappings: true}\n' + ' forbid-in-flow-mappings: true,\n' + ' forbid-in-block-sequences: false}\n' 'braces: disable\n' 'commas: disable\n' 'comments: disable\n') @@ -258,3 +274,95 @@ problem1=(4, 7), problem2=(7, 9), problem3=(10, 5)) + + def test_in_block_sequences_disabled(self): + conf = ('empty-values: {forbid-in-block-mappings: false,\n' + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: false}\n') + self.check('---\n' + 'foo:\n' + ' - bar\n' + ' -\n', conf) + self.check('---\n' + 'foo:\n' + ' -\n', conf) + + def test_in_block_sequences_primative_item(self): + conf = ('empty-values: {forbid-in-block-mappings: false,\n' + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: true}\n') + self.check('---\n' + 'foo:\n' + ' -\n', conf, + problem=(3, 4)) + self.check('---\n' + 'foo:\n' + ' - bar\n' + ' -\n', conf, + problem=(4, 4)) + self.check('---\n' + 'foo:\n' + ' - 1\n' + ' - 2\n' + ' -\n', conf, + problem=(5, 4)) + self.check('---\n' + 'foo:\n' + ' - true\n', conf) + + def test_in_block_sequences_complex_objects(self): + conf = ('empty-values: {forbid-in-block-mappings: false,\n' + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: true}\n') + self.check('---\n' + 'foo:\n' + ' - a: 1\n', conf) + self.check('---\n' + 'foo:\n' + ' - a: 1\n' + ' -\n', conf, + problem=(4, 4)) + self.check('---\n' + 'foo:\n' + ' - a: 1\n' + ' b: 2\n' + ' -\n', conf, + problem=(5, 4)) + self.check('---\n' + 'foo:\n' + ' - a: 1\n' + ' - b: 2\n' + ' -\n', conf, + problem=(5, 4)) + self.check('---\n' + 'foo:\n' + ' - - a\n' + ' - b: 2\n' + ' -\n', conf, + problem=(5, 6)) + self.check('---\n' + 'foo:\n' + ' - - a\n' + ' - b: 2\n' + ' -\n', conf, + problem=(5, 4)) + + def test_in_block_sequences_various_explicit_null(self): + conf = ('empty-values: {forbid-in-block-mappings: false,\n' + ' forbid-in-flow-mappings: false,\n' + ' forbid-in-block-sequences: true}\n') + self.check('---\n' + 'foo:\n' + ' - null\n', conf) + self.check('---\n' + '- null\n', conf) + self.check('---\n' + 'foo:\n' + ' - bar: null\n' + ' - null\n', conf) + self.check('---\n' + '- null\n' + '- null\n', conf) + self.check('---\n' + '- - null\n' + ' - null\n', conf) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/tests/test_cli.py new/yamllint-1.33.0/tests/test_cli.py --- old/yamllint-1.32.0/tests/test_cli.py 2023-05-22 18:00:04.000000000 +0200 +++ new/yamllint-1.33.0/tests/test_cli.py 2023-10-06 09:19:49.000000000 +0200 @@ -65,7 +65,7 @@ class CommandLineTestCase(unittest.TestCase): @classmethod def setUpClass(cls): - super(CommandLineTestCase, cls).setUpClass() + super().setUpClass() cls.wd = build_temp_workspace({ # .yaml file at root @@ -97,7 +97,7 @@ '- hétérogénéité\n' '# 19.99 â¬\n' '- ãæ©ã御座ãã¾ãã\n' - '# اÙØ£ÙبÙجÙدÙÙÙÙØ© اÙعÙرÙبÙÙÙÙØ©\n').encode('utf-8'), + '# اÙØ£ÙبÙجÙدÙÙÙÙØ© اÙعÙرÙبÙÙÙÙØ©\n').encode(), # dos line endings yaml 'dos.yml': '---\r\n' 'dos: true', @@ -112,7 +112,7 @@ @classmethod def tearDownClass(cls): - super(CommandLineTestCase, cls).tearDownClass() + super().tearDownClass() shutil.rmtree(cls.wd) @@ -286,8 +286,8 @@ with RunContext(self) as ctx: cli.run(('-d', 'default', '-f', 'parsable', path)) - expected_out = ('%s:1:1: [warning] missing document start "---" ' - '(document-start)\n' % path) + expected_out = (f'{path}:1:1: [warning] missing document start "---" ' + f'(document-start)\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (0, expected_out, '')) @@ -424,9 +424,9 @@ cli.run(('-f', 'parsable', path)) self.assertEqual(ctx.returncode, 1) self.assertEqual(ctx.stdout, ( - '%s:2:4: [error] trailing spaces (trailing-spaces)\n' - '%s:3:4: [error] no new line character at the end of file ' - '(new-line-at-end-of-file)\n' % (path, path))) + f'{path}:2:4: [error] trailing spaces (trailing-spaces)\n' + f'{path}:3:4: [error] no new line character at the end of file ' + f'(new-line-at-end-of-file)\n')) self.assertEqual(ctx.stderr, '') def test_run_one_warning(self): @@ -476,8 +476,8 @@ cli.run(['-f', 'parsable'] + items) self.assertEqual((ctx.returncode, ctx.stderr), (1, '')) self.assertEqual(ctx.stdout, ( - '%s:3:1: [error] duplication of key "key" in mapping ' - '(key-duplicates)\n') % path) + f'{path}:3:1: [error] duplication of key "key" in mapping ' + f'(key-duplicates)\n')) def test_run_piped_output_nocolor(self): path = os.path.join(self.wd, 'a.yaml') @@ -486,11 +486,11 @@ cli.run((path, )) self.assertEqual((ctx.returncode, ctx.stderr), (1, '')) self.assertEqual(ctx.stdout, ( - '%s\n' - ' 2:4 error trailing spaces (trailing-spaces)\n' - ' 3:4 error no new line character at the end of file ' - '(new-line-at-end-of-file)\n' - '\n' % path)) + f'{path}\n' + f' 2:4 error trailing spaces (trailing-spaces)\n' + f' 3:4 error no new line character at the end of file ' + f'(new-line-at-end-of-file)\n' + f'\n')) def test_run_default_format_output_in_tty(self): path = os.path.join(self.wd, 'a.yaml') @@ -517,13 +517,13 @@ output.close() self.assertEqual(out, ( - '\033[4m%s\033[0m\n' - ' \033[2m2:4\033[0m \033[31merror\033[0m ' - 'trailing spaces \033[2m(trailing-spaces)\033[0m\n' - ' \033[2m3:4\033[0m \033[31merror\033[0m ' - 'no new line character at the end of file ' - '\033[2m(new-line-at-end-of-file)\033[0m\n' - '\n' % path)) + f'\033[4m{path}\033[0m\n' + f' \033[2m2:4\033[0m \033[31merror\033[0m ' + f'trailing spaces \033[2m(trailing-spaces)\033[0m\n' + f' \033[2m3:4\033[0m \033[31merror\033[0m ' + f'no new line character at the end of file ' + f'\033[2m(new-line-at-end-of-file)\033[0m\n' + f'\n')) def test_run_default_format_output_without_tty(self): path = os.path.join(self.wd, 'a.yaml') @@ -531,11 +531,11 @@ with RunContext(self) as ctx: cli.run((path, )) expected_out = ( - '%s\n' - ' 2:4 error trailing spaces (trailing-spaces)\n' - ' 3:4 error no new line character at the end of file ' - '(new-line-at-end-of-file)\n' - '\n' % path) + f'{path}\n' + f' 2:4 error trailing spaces (trailing-spaces)\n' + f' 3:4 error no new line character at the end of file ' + f'(new-line-at-end-of-file)\n' + f'\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) @@ -545,11 +545,11 @@ with RunContext(self) as ctx: cli.run((path, '--format', 'auto')) expected_out = ( - '%s\n' - ' 2:4 error trailing spaces (trailing-spaces)\n' - ' 3:4 error no new line character at the end of file ' - '(new-line-at-end-of-file)\n' - '\n' % path) + f'{path}\n' + f' 2:4 error trailing spaces (trailing-spaces)\n' + f' 3:4 error no new line character at the end of file ' + f'(new-line-at-end-of-file)\n' + f'\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) @@ -559,13 +559,13 @@ with RunContext(self) as ctx: cli.run((path, '--format', 'colored')) expected_out = ( - '\033[4m%s\033[0m\n' - ' \033[2m2:4\033[0m \033[31merror\033[0m ' - 'trailing spaces \033[2m(trailing-spaces)\033[0m\n' - ' \033[2m3:4\033[0m \033[31merror\033[0m ' - 'no new line character at the end of file ' - '\033[2m(new-line-at-end-of-file)\033[0m\n' - '\n' % path) + f'\033[4m{path}\033[0m\n' + f' \033[2m2:4\033[0m \033[31merror\033[0m ' + f'trailing spaces \033[2m(trailing-spaces)\033[0m\n' + f' \033[2m3:4\033[0m \033[31merror\033[0m ' + f'no new line character at the end of file ' + f'\033[2m(new-line-at-end-of-file)\033[0m\n' + f'\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) @@ -575,10 +575,10 @@ with RunContext(self) as ctx: cli.run((path, '--format', 'colored')) expected_out = ( - '\033[4m%s\033[0m\n' - ' \033[2m1:1\033[0m \033[33mwarning\033[0m ' - 'missing document start "---" \033[2m(document-start)\033[0m\n' - '\n' % path) + f'\033[4m{path}\033[0m\n' + f' \033[2m1:1\033[0m \033[33mwarning\033[0m ' + f'missing document start "---" \033[2m(document-start)\033[0m\n' + f'\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (0, expected_out, '')) @@ -588,13 +588,12 @@ with RunContext(self) as ctx: cli.run((path, '--format', 'github')) expected_out = ( - '::group::%s\n' - '::error file=%s,line=2,col=4::2:4 [trailing-spaces] trailing' - ' spaces\n' - '::error file=%s,line=3,col=4::3:4 [new-line-at-end-of-file] no' - ' new line character at the end of file\n' - '::endgroup::\n\n' - % (path, path, path)) + f'::group::{path}\n' + f'::error file={path},line=2,col=4::2:4 [trailing-spaces] trailing' + f' spaces\n' + f'::error file={path},line=3,col=4::3:4 [new-line-at-end-of-file]' + f' no new line character at the end of file\n' + f'::endgroup::\n\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) @@ -608,13 +607,12 @@ os.environ['GITHUB_WORKFLOW'] = 'something' cli.run((path, )) expected_out = ( - '::group::%s\n' - '::error file=%s,line=2,col=4::2:4 [trailing-spaces] trailing' - ' spaces\n' - '::error file=%s,line=3,col=4::3:4 [new-line-at-end-of-file] no' - ' new line character at the end of file\n' - '::endgroup::\n\n' - % (path, path, path)) + f'::group::{path}\n' + f'::error file={path},line=2,col=4::2:4 [trailing-spaces] trailing' + f' spaces\n' + f'::error file={path},line=3,col=4::3:4 [new-line-at-end-of-file]' + f' no new line character at the end of file\n' + f'::endgroup::\n\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) @@ -640,11 +638,11 @@ with RunContext(self) as ctx: cli.run((path, '--no-warnings', '-f', 'auto')) expected_out = ( - '%s\n' - ' 2:4 error trailing spaces (trailing-spaces)\n' - ' 3:4 error no new line character at the end of file ' - '(new-line-at-end-of-file)\n' - '\n' % path) + f'{path}\n' + f' 2:4 error trailing spaces (trailing-spaces)\n' + f' 3:4 error no new line character at the end of file ' + f'(new-line-at-end-of-file)\n' + f'\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) @@ -671,10 +669,10 @@ with RunContext(self) as ctx: cli.run(('-d', 'rules:\n new-lines:\n type: unix', path)) expected_out = ( - '%s\n' - ' 1:4 error wrong new line character: expected \\n' - ' (new-lines)\n' - '\n' % path) + f'{path}\n' + f' 1:4 error wrong new line character: expected \\n' + f' (new-lines)\n' + f'\n') self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/tests/test_spec_examples.py new/yamllint-1.33.0/tests/test_spec_examples.py --- old/yamllint-1.32.0/tests/test_spec_examples.py 2022-11-06 11:49:08.000000000 +0100 +++ new/yamllint-1.33.0/tests/test_spec_examples.py 2023-10-06 09:19:49.000000000 +0200 @@ -39,7 +39,7 @@ # text = text.replace('\u21d4', '') # byte order mark # text = text.replace('\u2192', '\t') # right arrow # text = text.replace('\u00b0', '') # empty scalar -# with open('tests/yaml-1.2-spec-examples/%s' % id, 'w', +# with open(f'tests/yaml-1.2-spec-examples/{id}', 'w', # encoding='utf-8') as g: # g.write(text) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/__init__.py new/yamllint-1.33.0/yamllint/__init__.py --- old/yamllint-1.32.0/yamllint/__init__.py 2023-05-22 18:00:15.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/__init__.py 2023-11-09 10:29:45.000000000 +0100 @@ -21,7 +21,7 @@ APP_NAME = 'yamllint' -APP_VERSION = '1.32.0' +APP_VERSION = '1.33.0' APP_DESCRIPTION = __doc__ __author__ = 'Adrien Vergé' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/cli.py new/yamllint-1.33.0/yamllint/cli.py --- old/yamllint-1.32.0/yamllint/cli.py 2023-05-22 18:00:04.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/cli.py 2023-10-06 09:19:49.000000000 +0200 @@ -49,52 +49,41 @@ class Format: @staticmethod def parsable(problem, filename): - return ('%(file)s:%(line)s:%(column)s: [%(level)s] %(message)s' % - {'file': filename, - 'line': problem.line, - 'column': problem.column, - 'level': problem.level, - 'message': problem.message}) + return (f'{filename}:{problem.line}:{problem.column}: ' + f'[{problem.level}] {problem.message}') @staticmethod def standard(problem, filename): - line = ' %d:%d' % (problem.line, problem.column) + line = f' {problem.line}:{problem.column}' line += max(12 - len(line), 0) * ' ' line += problem.level line += max(21 - len(line), 0) * ' ' line += problem.desc if problem.rule: - line += ' (%s)' % problem.rule + line += f' ({problem.rule})' return line @staticmethod def standard_color(problem, filename): - line = ' \033[2m%d:%d\033[0m' % (problem.line, problem.column) + line = f' \033[2m{problem.line}:{problem.column}\033[0m' line += max(20 - len(line), 0) * ' ' if problem.level == 'warning': - line += '\033[33m%s\033[0m' % problem.level + line += f'\033[33m{problem.level}\033[0m' else: - line += '\033[31m%s\033[0m' % problem.level + line += f'\033[31m{problem.level}\033[0m' line += max(38 - len(line), 0) * ' ' line += problem.desc if problem.rule: - line += ' \033[2m(%s)\033[0m' % problem.rule + line += f' \033[2m({problem.rule})\033[0m' return line @staticmethod def github(problem, filename): - line = '::' - line += problem.level - line += ' file=' + filename + ',' - line += 'line=' + format(problem.line) + ',' - line += 'col=' + format(problem.column) - line += '::' - line += format(problem.line) - line += ':' - line += format(problem.column) - line += ' ' + line = f'::{problem.level} file={format(filename)},' \ + f'line={format(problem.line)},col={format(problem.column)}' \ + f'::{format(problem.line)}:{format(problem.column)} ' if problem.rule: - line += '[' + problem.rule + '] ' + line += f'[{problem.rule}] ' line += problem.desc return line @@ -118,12 +107,12 @@ print(Format.parsable(problem, file)) elif args_format == 'github': if first: - print('::group::%s' % file) + print(f'::group::{file}') first = False print(Format.github(problem, file)) elif args_format == 'colored': if first: - print('\033[4m%s\033[0m' % file) + print(f'\033[4m{file}\033[0m') first = False print(Format.standard_color(problem, file)) else: @@ -184,7 +173,7 @@ action='store_true', help='output only error level problems') parser.add_argument('-v', '--version', action='version', - version='{} {}'.format(APP_NAME, APP_VERSION)) + version=f'{APP_NAME} {APP_VERSION}') args = parser.parse_args(argv) @@ -202,7 +191,7 @@ try: if args.config_data is not None: if args.config_data != '' and ':' not in args.config_data: - args.config_data = 'extends: ' + args.config_data + args.config_data = f'extends: {args.config_data}' conf = YamlLintConfig(content=args.config_data) elif args.config_file is not None: conf = YamlLintConfig(file=args.config_file) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/config.py new/yamllint-1.33.0/yamllint/config.py --- old/yamllint-1.32.0/yamllint/config.py 2023-04-13 19:27:24.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/config.py 2023-10-06 09:19:49.000000000 +0200 @@ -76,7 +76,7 @@ try: conf = yaml.safe_load(raw_content) except Exception as e: - raise YamlLintConfigError('invalid config: %s' % e) + raise YamlLintConfigError(f'invalid config: {e}') if not isinstance(conf, dict): raise YamlLintConfigError('invalid config: not a dict') @@ -95,7 +95,7 @@ try: self.extend(base) except Exception as e: - raise YamlLintConfigError('invalid config: %s' % e) + raise YamlLintConfigError(f'invalid config: {e}') if 'ignore' in conf and 'ignore-from-file' in conf: raise YamlLintConfigError( @@ -143,7 +143,7 @@ try: rule = yamllint.rules.get(id) except Exception as e: - raise YamlLintConfigError('invalid config: %s' % e) + raise YamlLintConfigError(f'invalid config: {e}') self.rules[id] = validate_rule_conf(rule, self.rules[id]) @@ -179,16 +179,16 @@ continue if optkey not in options: raise YamlLintConfigError( - 'invalid config: unknown option "%s" for rule "%s"' % - (optkey, rule.ID)) + f'invalid config: unknown option "{optkey}" for rule ' + f'"{rule.ID}"') # Example: CONF = {option: (bool, 'mixed')} # â {option: true} â {option: mixed} if isinstance(options[optkey], tuple): if (conf[optkey] not in options[optkey] and type(conf[optkey]) not in options[optkey]): raise YamlLintConfigError( - 'invalid config: option "%s" of "%s" should be in %s' - % (optkey, rule.ID, options[optkey])) + f'invalid config: option "{optkey}" of "{rule.ID}" ' + f'should be in {options[optkey]}') # Example: CONF = {option: ['flag1', 'flag2', int]} # â {option: [flag1]} â {option: [42, flag1, flag2]} elif isinstance(options[optkey], list): @@ -197,16 +197,15 @@ type(flag) not in options[optkey] for flag in conf[optkey])): raise YamlLintConfigError( - ('invalid config: option "%s" of "%s" should only ' - 'contain values in %s') - % (optkey, rule.ID, str(options[optkey]))) + f'invalid config: option "{optkey}" of "{rule.ID}" ' + f'should only contain values in {options[optkey]}') # Example: CONF = {option: int} # â {option: 42} else: if not isinstance(conf[optkey], options[optkey]): raise YamlLintConfigError( - 'invalid config: option "%s" of "%s" should be %s' - % (optkey, rule.ID, options[optkey].__name__)) + f'invalid config: option "{optkey}" of "{rule.ID}" ' + f'should be {options[optkey].__name__}') for optkey in options: if optkey not in conf: conf[optkey] = options_default[optkey] @@ -214,12 +213,11 @@ if hasattr(rule, 'VALIDATE'): res = rule.VALIDATE(conf) if res: - raise YamlLintConfigError('invalid config: %s: %s' % - (rule.ID, res)) + raise YamlLintConfigError(f'invalid config: {rule.ID}: {res}') else: - raise YamlLintConfigError(('invalid config: rule "%s": should be ' - 'either "enable", "disable" or a dict') - % rule.ID) + raise YamlLintConfigError( + f'invalid config: rule "{rule.ID}": should be either "enable", ' + f'"disable" or a dict') return conf @@ -228,7 +226,7 @@ # Is it a standard conf shipped with yamllint... if '/' not in name: std_conf = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'conf', name + '.yaml') + 'conf', f'{name}.yaml') if os.path.isfile(std_conf): return std_conf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/linter.py new/yamllint-1.33.0/yamllint/linter.py --- old/yamllint-1.32.0/yamllint/linter.py 2023-03-19 11:18:44.000000000 +0100 +++ new/yamllint-1.33.0/yamllint/linter.py 2023-10-06 09:19:49.000000000 +0200 @@ -50,7 +50,7 @@ @property def message(self): if self.rule is not None: - return '{} ({})'.format(self.desc, self.rule) + return f'{self.desc} ({self.rule})' return self.desc def __eq__(self, other): @@ -63,7 +63,7 @@ (self.line == other.line and self.column < other.column)) def __repr__(self): - return '%d:%d: %s' % (self.line, self.column, self.message) + return f'{self.line}:{self.column}: {self.message}' def get_cosmetic_problems(buffer, conf, filepath): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/__init__.py new/yamllint-1.33.0/yamllint/rules/__init__.py --- old/yamllint-1.32.0/yamllint/rules/__init__.py 2023-04-04 17:57:30.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/rules/__init__.py 2023-10-06 09:19:49.000000000 +0200 @@ -68,6 +68,6 @@ def get(id): if id not in _RULES: - raise ValueError('no such rule: "%s"' % id) + raise ValueError(f'no such rule: "{id}"') return _RULES[id] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/document_end.py new/yamllint-1.33.0/yamllint/rules/document_end.py --- old/yamllint-1.32.0/yamllint/rules/document_end.py 2022-06-20 18:34:21.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/rules/document_end.py 2023-06-27 11:20:04.000000000 +0200 @@ -99,11 +99,13 @@ prev_is_end_or_stream_start = isinstance( prev, (yaml.DocumentEndToken, yaml.StreamStartToken) ) + prev_is_directive = isinstance(prev, yaml.DirectiveToken) if is_stream_end and not prev_is_end_or_stream_start: yield LintProblem(token.start_mark.line, 1, 'missing document end "..."') - elif is_start and not prev_is_end_or_stream_start: + elif is_start and not (prev_is_end_or_stream_start + or prev_is_directive): yield LintProblem(token.start_mark.line + 1, 1, 'missing document end "..."') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/empty_lines.py new/yamllint-1.33.0/yamllint/rules/empty_lines.py --- old/yamllint-1.32.0/yamllint/rules/empty_lines.py 2022-06-20 18:34:21.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/rules/empty_lines.py 2023-10-06 09:19:49.000000000 +0200 @@ -113,5 +113,5 @@ max = conf['max-end'] if blank_lines > max: - yield LintProblem(line.line_no, 1, 'too many blank lines (%d > %d)' - % (blank_lines, max)) + yield LintProblem(line.line_no, 1, + f'too many blank lines ({blank_lines} > {max})') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/empty_values.py new/yamllint-1.33.0/yamllint/rules/empty_values.py --- old/yamllint-1.32.0/yamllint/rules/empty_values.py 2022-06-20 18:34:21.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/rules/empty_values.py 2023-11-09 10:29:12.000000000 +0100 @@ -21,6 +21,7 @@ * Use ``forbid-in-block-mappings`` to prevent empty values in block mappings. * Use ``forbid-in-flow-mappings`` to prevent empty values in flow mappings. +* Use ``forbid-in-block-sequences`` to prevent empty values in block sequences. .. rubric:: Default values (when enabled) @@ -30,6 +31,7 @@ empty-values: forbid-in-block-mappings: true forbid-in-flow-mappings: true + forbid-in-block-sequences: true .. rubric:: Examples @@ -72,6 +74,31 @@ {a: 1, b:, c: 3} +#. With ``empty-values: {forbid-in-block-sequences: true}`` + + the following code snippet would **PASS**: + :: + + some-sequence: + - string item + + :: + + some-sequence: + - null + + the following code snippets would **FAIL**: + :: + + some-sequence: + - + + :: + + some-sequence: + - string item + - + """ import yaml @@ -82,9 +109,11 @@ ID = 'empty-values' TYPE = 'token' CONF = {'forbid-in-block-mappings': bool, - 'forbid-in-flow-mappings': bool} + 'forbid-in-flow-mappings': bool, + 'forbid-in-block-sequences': bool} DEFAULT = {'forbid-in-block-mappings': True, - 'forbid-in-flow-mappings': True} + 'forbid-in-flow-mappings': True, + 'forbid-in-block-sequences': True} def check(conf, token, prev, next, nextnext, context): @@ -102,3 +131,10 @@ yield LintProblem(token.start_mark.line + 1, token.end_mark.column + 1, 'empty value in flow mapping') + + if conf['forbid-in-block-sequences']: + if isinstance(token, yaml.BlockEntryToken) and isinstance(next, ( + yaml.KeyToken, yaml.BlockEndToken, yaml.BlockEntryToken)): + yield LintProblem(token.start_mark.line + 1, + token.end_mark.column + 1, + 'empty value in block sequence') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/indentation.py new/yamllint-1.33.0/yamllint/rules/indentation.py --- old/yamllint-1.32.0/yamllint/rules/indentation.py 2022-11-06 11:49:08.000000000 +0100 +++ new/yamllint-1.33.0/yamllint/rules/indentation.py 2023-10-06 09:19:49.000000000 +0200 @@ -227,7 +227,7 @@ self.implicit_block_seq = False def __repr__(self): - return '%s:%d' % (labels[self.type], self.indent) + return f'{labels[self.type]}:{self.indent}' def check_scalar_indentation(conf, token, context): @@ -303,8 +303,8 @@ if indent != expected_indent: yield LintProblem(line_no, indent + 1, - 'wrong indentation: expected %d but found %d' % - (expected_indent, indent)) + f'wrong indentation: expected {expected_indent}' + f'but found {indent}') def _check(conf, token, prev, next, nextnext, context): @@ -342,11 +342,11 @@ if found_indentation != expected: if expected < 0: - message = 'wrong indentation: expected at least %d' % \ - (found_indentation + 1) + message = f'wrong indentation: expected at least ' \ + f'{found_indentation + 1}' else: - message = 'wrong indentation: expected %d but found %d' % \ - (expected, found_indentation) + message = f'wrong indentation: expected {expected} but ' \ + f'found {found_indentation}' yield LintProblem(token.start_mark.line + 1, found_indentation + 1, message) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/key_duplicates.py new/yamllint-1.33.0/yamllint/rules/key_duplicates.py --- old/yamllint-1.32.0/yamllint/rules/key_duplicates.py 2022-08-06 15:23:31.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/rules/key_duplicates.py 2023-10-06 09:19:49.000000000 +0200 @@ -95,6 +95,6 @@ next.value != '<<'): yield LintProblem( next.start_mark.line + 1, next.start_mark.column + 1, - 'duplication of key "%s" in mapping' % next.value) + f'duplication of key "{next.value}" in mapping') else: context['stack'][-1].keys.append(next.value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/key_ordering.py new/yamllint-1.33.0/yamllint/rules/key_ordering.py --- old/yamllint-1.32.0/yamllint/rules/key_ordering.py 2022-10-24 14:29:39.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/rules/key_ordering.py 2023-10-06 09:19:49.000000000 +0200 @@ -122,6 +122,6 @@ for key in context['stack'][-1].keys): yield LintProblem( next.start_mark.line + 1, next.start_mark.column + 1, - 'wrong ordering of key "%s" in mapping' % next.value) + f'wrong ordering of key "{next.value}" in mapping') else: context['stack'][-1].keys.append(next.value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/octal_values.py new/yamllint-1.33.0/yamllint/rules/octal_values.py --- old/yamllint-1.32.0/yamllint/rules/octal_values.py 2022-08-06 15:23:31.000000000 +0200 +++ new/yamllint-1.33.0/yamllint/rules/octal_values.py 2023-10-06 09:19:49.000000000 +0200 @@ -99,8 +99,7 @@ IS_OCTAL_NUMBER_PATTERN.match(val[1:])): yield LintProblem( token.start_mark.line + 1, token.end_mark.column + 1, - 'forbidden implicit octal value "%s"' % - token.value) + f'forbidden implicit octal value "{token.value}"') if conf['forbid-explicit-octal']: if isinstance(token, yaml.tokens.ScalarToken): @@ -110,5 +109,4 @@ IS_OCTAL_NUMBER_PATTERN.match(val[2:])): yield LintProblem( token.start_mark.line + 1, token.end_mark.column + 1, - 'forbidden explicit octal value "%s"' % - token.value) + f'forbidden explicit octal value "{token.value}"') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/quoted_strings.py new/yamllint-1.33.0/yamllint/rules/quoted_strings.py --- old/yamllint-1.32.0/yamllint/rules/quoted_strings.py 2022-11-06 11:49:08.000000000 +0100 +++ new/yamllint-1.33.0/yamllint/rules/quoted_strings.py 2023-10-06 09:19:49.000000000 +0200 @@ -176,7 +176,7 @@ |[-+]?0[0-7_]+ |[-+]?(?:0|[1-9][0-9_]*) |[-+]?0x[0-9a-fA-F_]+ - |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), + |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.VERBOSE), list('-+0123456789')) @@ -240,7 +240,7 @@ if (token.style is None or not (_quote_match(quote_type, token.style) or (conf['allow-quoted-quotes'] and _has_quoted_quotes(token)))): - msg = "string value is not quoted with %s quotes" % quote_type + msg = f"string value is not quoted with {quote_type} quotes" elif conf['required'] is False: @@ -249,7 +249,7 @@ not _quote_match(quote_type, token.style) and not (conf['allow-quoted-quotes'] and _has_quoted_quotes(token))): - msg = "string value is not quoted with %s quotes" % quote_type + msg = f"string value is not quoted with {quote_type} quotes" elif not token.style: is_extra_required = any(re.search(r, token.value) @@ -267,14 +267,14 @@ is_extra_allowed = any(re.search(r, token.value) for r in conf['extra-allowed']) if not (is_extra_required or is_extra_allowed): - msg = "string value is redundantly quoted with %s quotes" % ( - quote_type) + msg = f"string value is redundantly quoted with " \ + f"{quote_type} quotes" # But when used need to match config elif (token.style and not _quote_match(quote_type, token.style) and not (conf['allow-quoted-quotes'] and _has_quoted_quotes(token))): - msg = "string value is not quoted with %s quotes" % quote_type + msg = f"string value is not quoted with {quote_type} quotes" elif not token.style: is_extra_required = len(conf['extra-required']) and any( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint/rules/truthy.py new/yamllint-1.33.0/yamllint/rules/truthy.py --- old/yamllint-1.32.0/yamllint/rules/truthy.py 2023-01-09 18:04:01.000000000 +0100 +++ new/yamllint-1.33.0/yamllint/rules/truthy.py 2023-10-04 17:53:25.000000000 +0200 @@ -136,7 +136,7 @@ ID = 'truthy' TYPE = 'token' -CONF = {'allowed-values': list(TRUTHY), 'check-keys': bool} +CONF = {'allowed-values': TRUTHY.copy(), 'check-keys': bool} DEFAULT = {'allowed-values': ['true', 'false'], 'check-keys': True} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.32.0/yamllint.egg-info/PKG-INFO new/yamllint-1.33.0/yamllint.egg-info/PKG-INFO --- old/yamllint-1.32.0/yamllint.egg-info/PKG-INFO 2023-05-22 18:03:06.000000000 +0200 +++ new/yamllint-1.33.0/yamllint.egg-info/PKG-INFO 2023-11-09 10:34:59.000000000 +0100 @@ -1,9 +1,9 @@ Metadata-Version: 2.1 Name: yamllint -Version: 1.32.0 +Version: 1.33.0 Summary: A linter for YAML files. Author: Adrien Vergé -License: GPL-3.0-only +License: GPL-3.0-or-later Project-URL: homepage, https://github.com/adrienverge/yamllint Project-URL: repository, https://github.com/adrienverge/yamllint Project-URL: documentation, https://yamllint.readthedocs.io @@ -17,10 +17,17 @@ Classifier: Topic :: Software Development :: Debuggers Classifier: Topic :: Software Development :: Quality Assurance Classifier: Topic :: Software Development :: Testing -Requires-Python: >=3.7 +Requires-Python: >=3.8 Description-Content-Type: text/x-rst -Provides-Extra: dev License-File: LICENSE +Requires-Dist: pathspec>=0.5.3 +Requires-Dist: pyyaml +Provides-Extra: dev +Requires-Dist: doc8; extra == "dev" +Requires-Dist: flake8; extra == "dev" +Requires-Dist: flake8-import-order; extra == "dev" +Requires-Dist: rstcheck[sphinx]; extra == "dev" +Requires-Dist: sphinx; extra == "dev" yamllint ========