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 2022-04-13 22:15:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-yamllint (Old) and /work/SRC/openSUSE:Factory/.python-yamllint.new.1900 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-yamllint" Wed Apr 13 22:15:28 2022 rev:12 rq:969174 version:1.26.3 Changes: -------- --- /work/SRC/openSUSE:Factory/python-yamllint/python-yamllint.changes 2020-07-21 15:54:30.652596834 +0200 +++ /work/SRC/openSUSE:Factory/.python-yamllint.new.1900/python-yamllint.changes 2022-04-13 22:15:29.552201748 +0200 @@ -1,0 +2,117 @@ +Sun Apr 10 11:26:51 UTC 2022 - Sebastian Wagner <sebix+novell....@sebix.at> + +- Update to version 1.26.3: + - Restore setuptools requirement for Python < 3.8 + This reverts commit 8f68248 "Remove runtime dep 'setuptools' for Python + < 3.8". It looks like removing setuptools induces problems on some + systems, see for example the linked discussion. + Fixes https://github.com/adrienverge/yamllint/issues/380. +- Update to version 1.26.2: + - setup: update python_requires to comply with PEP 345/440 + According to PEP 345 Requires-Python + (https://www.python.org/dev/peps/pep-0345/#requires-python), the value + of this field must be a valid Version Specifier + (https://www.python.org/dev/peps/pep-0345/#version-specifiers). Which + in turn expects this to comply with PEP 440 + (https://www.python.org/dev/peps/pep-0440/). + While not an issue for those that directly use `pip`, this will cause + issues for `poetry` users in the next release (if their current stance + is maintained). Discussion of the issue and there stance can be found + here: https://github.com/python-poetry/poetry/issues/4095. +- Update to version 1.26.1: + - line_length: skip all hash signs starting comment + - Remove runtime dep 'setuptools' for Python < 3.8 + > In recent versions of setuptools and Python, console-script entry + points are using stdlib importlib by default, thus setuptools is no + longer needed as a runtime dependency. + https://github.com/pypa/setuptools/pull/2197 + https://github.com/pypa/setuptools/blob/main/CHANGES.rst#v4730 + https://docs.python.org/3/library/importlib.metadata.html +- Update to version 1.26.0: + - quoted-strings: Fix explicit octal recognition + PyYAML implements YAML spec version 1.1, not 1.2. Hence, values starting + with `0o` are not considered as numbers: they are just strings, so they + need quotes when `quoted-strings: {required: true}`. + >>> import yaml + >>> yaml.resolver.Resolver().resolve(yaml.nodes.ScalarNode, '100', (True, False)) + 'tag:yaml.org,2002:int' + >>> yaml.resolver.Resolver().resolve(yaml.nodes.ScalarNode, '0100', (True, False)) + 'tag:yaml.org,2002:int' + >>> yaml.resolver.Resolver().resolve(yaml.nodes.ScalarNode, '0o100', (True, False)) + 'tag:yaml.org,2002:str' + Let's try to prevent that. + Fixes https://github.com/adrienverge/yamllint/issues/351. + - End support for Python 2 + As planned and advertized, yamllint drops support for Python 2 on 2021. + - Allow only non-empty brackets/braces + We'd like to disallow brackets and braces in our YAML, but there's a + catch: the only way to describe an empty array or hash in YAML is to + supply an empty one (`[]` or `{}`). Otherwise, the value will be null. + This commit adds a `non-empty` option to `forbid` for brackets and + braces. When it is set, all flow and sequence mappings will cause errors + _except_ for empty ones. + - Add support for Python 3.9, drop Python 3.4 + Add support for Python 3.9 since it was officially released in October + and drop support for Python 3.4 since it is end-of-life (EOL). + - docs: Add configuration for integration with Arcanist +- Update to version 1.25.0: + - gitignore: Add /.eggs + Quick PR to ignore the `/.eggs` folder, which appears to be generated every + time the `python setup.py test` command is run. + The content of the `./.eggs/README.txt` file: + > This directory contains eggs that were downloaded by setuptools to build, + > test, and run plug-ins. + > + > This directory caches those eggs to prevent repeated downloads. + > + > However, it is safe to delete this directory. + - directives: Fix DOS lines messing with rule IDs + Fixes #325 + The linter allows a directive to contain trailing whitespace characters like + +, but does not trim them before iterating on the rules. As a result, the last + rule in the list contains the trailing whitespace characters and never matches + any existing rule. + I added the necessary trimming, as well as a test with 2 checks to go along + with it. + - Auto-change output format if GitHub Actions detected + - Add support for GitHub Annotations output format + Support the format used by GitHub Actions to annotate pull + requests with linter failures + - fix: add runtime dependency to setuptools + yamllint depends on pkg_resources.load_entry_point from setuptools to + make its command working, so this runtime dependency to setuptools is + necessary to be listed. + - Add 'forbid' configurations to the braces and brackets rules + Add 'forbid' configuration parameters to the braces and brackets rules + to allow users to forbid the use of flow style collections, flow + mappings and flow sequences. + - quoted-strings: Fix detecting strings with hashtag as requiring quotes + - octal-values: Prevent detection of 8 and 9 as octal values + - docs: Make 'yaml-file' config documentation clearer + Related to https://github.com/adrienverge/yamllint/issues/311. + - enhancement: add some metadata to provide extra info in its PyPI page + Add some metadata (project_urls) to provide extra info in its PyPI page. + Signed-off-by: Satoru SATOH <satoru.sa...@gmail.com> + - Move setuptools' packaging configuration from setup.py to setup.cfg + Move setuptools' packaging configuration from setup.py to setup.cfg to + simplify setup.py and make its packaging more dedeclarative. + Signed-off-by: Satoru SATOH <satoru.sa...@gmail.com> + - docs: Add Python API usage example + Fixes: #297 + - commas: Fix example in documentation + Error in the example snippet, it would NOT pass otherwise actually: + ``` + $ cat test.yml + strange var: + [10, 20,30, {x: 1, y: 2}] + $ yamllint -d "{extends: default, rules: {commas: {min-spaces-after: 1, max-spaces-after: 1}}}" test.yml + test.yml + 1:1 warning missing document start "---" (document-start) + 2:11 error too few spaces after comma (commas) + ``` + - docs: Add default values to rules with options + - CI: Add build environment without UTF-8 locales to travis-ci + Preventing regressions like #285 + +------------------------------------------------------------------- Old: ---- yamllint-1.24.2.tar.gz New: ---- yamllint-1.26.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-yamllint.spec ++++++ --- /var/tmp/diff_new_pack.EMcRKn/_old 2022-04-13 22:15:30.144202278 +0200 +++ /var/tmp/diff_new_pack.EMcRKn/_new 2022-04-13 22:15:30.152202286 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-yamllint # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-yamllint -Version: 1.24.2 +Version: 1.26.3 Release: 0 Summary: A linter for YAML files License: GPL-3.0-only @@ -31,7 +31,7 @@ Requires: python-PyYAML Requires: python-pathspec >= 0.5.3 Requires(post): update-alternatives -Requires(postun): update-alternatives +Requires(postun):update-alternatives BuildArch: noarch # SECTION test requirements BuildRequires: %{python_module PyYAML} ++++++ yamllint-1.24.2.tar.gz -> yamllint-1.26.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/PKG-INFO new/yamllint-1.26.3/PKG-INFO --- old/yamllint-1.24.2/PKG-INFO 2020-07-16 09:35:38.630434000 +0200 +++ new/yamllint-1.26.3/PKG-INFO 2021-08-21 19:26:45.874583700 +0200 @@ -1,10 +1,14 @@ Metadata-Version: 1.2 Name: yamllint -Version: 1.24.2 +Version: 1.26.3 Summary: A linter for YAML files. Home-page: https://github.com/adrienverge/yamllint Author: Adrien Verg?? License: GPLv3 +Project-URL: Documentation, https://yamllint.readthedocs.io +Project-URL: Download, https://pypi.org/project/yamllint/#files +Project-URL: Bug Tracker, https://github.com/adrienverge/yamllint/issues +Project-URL: Source Code, https://github.com/adrienverge/yamllint Description: A linter for YAML files. yamllint does not only check for syntax validity, but for weirdnesses like key @@ -16,16 +20,14 @@ Classifier: Environment :: Console Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3) -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Debuggers Classifier: Topic :: Software Development :: Quality Assurance Classifier: Topic :: Software Development :: Testing -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Python: >=3.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/README.rst new/yamllint-1.26.3/README.rst --- old/yamllint-1.24.2/README.rst 2020-04-10 16:31:09.000000000 +0200 +++ new/yamllint-1.26.3/README.rst 2021-01-27 08:53:04.000000000 +0100 @@ -19,11 +19,7 @@ :target: https://yamllint.readthedocs.io/en/latest/?badge=latest :alt: Documentation status -Written in Python (compatible with Python 2 & 3). - -??? Python 2 upstream support stopped on January 1, 2020. yamllint will keep -best-effort support for Python 2.7 until January 1, 2021. Passed that date, -yamllint will drop all Python 2-related code. +Written in Python (compatible with Python 3 only). Documentation ------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/docs/configuration.rst new/yamllint-1.26.3/docs/configuration.rst --- old/yamllint-1.24.2/docs/configuration.rst 2020-07-16 09:34:22.000000000 +0200 +++ new/yamllint-1.26.3/docs/configuration.rst 2020-09-27 10:11:38.000000000 +0200 @@ -123,8 +123,8 @@ YAML files extensions --------------------- -To configure what yamllint should consider as YAML files, set ``yaml-files`` -configuration option. The default is: +To configure what yamllint should consider as YAML files when listing +directories, set ``yaml-files`` configuration option. The default is: .. code-block:: yaml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/docs/development.rst new/yamllint-1.26.3/docs/development.rst --- old/yamllint-1.24.2/docs/development.rst 2016-01-24 18:07:07.000000000 +0100 +++ new/yamllint-1.26.3/docs/development.rst 2020-10-08 09:20:53.000000000 +0200 @@ -2,7 +2,17 @@ =========== yamllint provides both a script and a Python module. The latter can be used to -write your own linting tools: +write your own linting tools. + +Basic example of running the linter from Python: + +.. code-block:: python + + import yamllint + + yaml_config = yamllint.config.YamlLintConfig("extends: default") + for p in yamllint.linter.run("example.yaml", yaml_config): + print(p.desc, p.line, p.rule) .. automodule:: yamllint.linter :members: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/docs/integration.rst new/yamllint-1.26.3/docs/integration.rst --- old/yamllint-1.24.2/docs/integration.rst 2019-10-15 16:18:58.000000000 +0200 +++ new/yamllint-1.26.3/docs/integration.rst 2020-11-04 14:55:55.000000000 +0100 @@ -17,3 +17,56 @@ hooks: - id: yamllint args: [-c=/path/to/.yamllint] + +Integration with GitHub Actions +------------------------------- + +yamllint auto-detects when it's running inside of `GitHub +Actions<https://github.com/features/actions>` and automatically uses the suited +output format to decorate code with linting errors automatically. You can also +force the GitHub Actions output with ``yamllint --format github``. + +An example workflow using GitHub Actions: + +.. code:: yaml + + --- + name: yamllint test + + on: push + + jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.8 + + - name: Install yamllint + run: pip install yamllint + + - name: Lint YAML files + run: yamllint . + +Integration with Arcanist +------------------------- + +You can configure yamllint to run on ``arc lint``. Here is an example +``.arclint`` file that makes use of this configuration. + +.. code:: json + + { + "linters": { + "yamllint": { + "type": "script-and-regex", + "script-and-regex.script": "yamllint", + "script-and-regex.regex": "/^(?P<line>\\d+):(?P<offset>\\d+) +(?P<severity>warning|error) +(?P<message>.*) +\\((?P<name>.*)\\)$/m", + "include": "(\\.(yml|yaml)$)" + } + } + } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/setup.cfg new/yamllint-1.26.3/setup.cfg --- old/yamllint-1.24.2/setup.cfg 2020-07-16 09:35:38.630434000 +0200 +++ new/yamllint-1.26.3/setup.cfg 2021-08-21 19:26:45.875584000 +0200 @@ -12,6 +12,60 @@ build-dir = docs/_build warning-is-error = 1 +[metadata] +keywords = + yaml + lint + linter + syntax + checker +url = https://github.com/adrienverge/yamllint +classifiers = + Development Status :: 5 - Production/Stable + Environment :: Console + Intended Audience :: Developers + License :: OSI Approved :: GNU General Public License v3 (GPLv3) + Programming Language :: Python :: 3 + Programming Language :: Python :: 3.5 + Programming Language :: Python :: 3.6 + Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + Topic :: Software Development + Topic :: Software Development :: Debuggers + Topic :: Software Development :: Quality Assurance + Topic :: Software Development :: Testing +project_urls = + Documentation = https://yamllint.readthedocs.io + Download = https://pypi.org/project/yamllint/#files + Bug Tracker = https://github.com/adrienverge/yamllint/issues + Source Code = https://github.com/adrienverge/yamllint + +[options] +packages = find: +python_requires = >=3.5 +include_package_data = True +install_requires = + pathspec >= 0.5.3 + pyyaml + setuptools +test_suite = tests + +[options.packages.find] +exclude = + tests + tests.* + +[options.package_data] +yamllint = conf/*.yaml + +[options.entry_points] +console_scripts = + yamllint = yamllint.cli:run + +[coverage:run] +relative_files = True + [egg_info] tag_build = tag_date = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/setup.py new/yamllint-1.26.3/setup.py --- old/yamllint-1.24.2/setup.py 2020-05-03 16:22:34.000000000 +0200 +++ new/yamllint-1.26.3/setup.py 2020-09-27 10:11:38.000000000 +0200 @@ -14,7 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -from setuptools import find_packages, setup +from setuptools import setup from yamllint import (__author__, __license__, APP_NAME, APP_VERSION, APP_DESCRIPTION) @@ -27,31 +27,4 @@ description=APP_DESCRIPTION.split('\n')[0], long_description=APP_DESCRIPTION, license=__license__, - keywords=['yaml', 'lint', 'linter', 'syntax', 'checker'], - url='https://github.com/adrienverge/yamllint', - python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*', - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Console', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Topic :: Software Development', - 'Topic :: Software Development :: Debuggers', - 'Topic :: Software Development :: Quality Assurance', - 'Topic :: Software Development :: Testing', - ], - - packages=find_packages(exclude=['tests', 'tests.*']), - entry_points={'console_scripts': ['yamllint=yamllint.cli:run']}, - package_data={'yamllint': ['conf/*.yaml']}, - install_requires=['pathspec >=0.5.3', 'pyyaml'], - test_suite='tests', ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/common.py new/yamllint-1.26.3/tests/common.py --- old/yamllint-1.24.2/tests/common.py 2020-03-24 08:58:23.000000000 +0100 +++ new/yamllint-1.26.3/tests/common.py 2020-07-20 13:57:15.000000000 +0200 @@ -57,7 +57,7 @@ tempdir = tempfile.mkdtemp(prefix='yamllint-tests-') for path, content in files.items(): - path = os.path.join(tempdir, path) + path = os.path.join(tempdir, path).encode('utf-8') if not os.path.exists(os.path.dirname(path)): os.makedirs(os.path.dirname(path)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/rules/test_braces.py new/yamllint-1.26.3/tests/rules/test_braces.py --- old/yamllint-1.24.2/tests/rules/test_braces.py 2017-07-04 21:36:19.000000000 +0200 +++ new/yamllint-1.26.3/tests/rules/test_braces.py 2021-01-27 08:53:04.000000000 +0100 @@ -31,6 +31,60 @@ 'dict6: { a: 1, b, c: 3 }\n' 'dict7: { a: 1, b, c: 3 }\n', conf) + def test_forbid(self): + conf = ('braces:\n' + ' forbid: false\n') + self.check('---\n' + 'dict: {}\n', conf) + self.check('---\n' + 'dict: {a}\n', conf) + self.check('---\n' + 'dict: {a: 1}\n', conf) + self.check('---\n' + 'dict: {\n' + ' a: 1\n' + '}\n', conf) + + conf = ('braces:\n' + ' forbid: true\n') + self.check('---\n' + 'dict:\n' + ' a: 1\n', conf) + self.check('---\n' + 'dict: {}\n', conf, problem=(2, 8)) + self.check('---\n' + 'dict: {a}\n', conf, problem=(2, 8)) + self.check('---\n' + 'dict: {a: 1}\n', conf, problem=(2, 8)) + self.check('---\n' + 'dict: {\n' + ' a: 1\n' + '}\n', conf, problem=(2, 8)) + + conf = ('braces:\n' + ' forbid: non-empty\n') + self.check('---\n' + 'dict:\n' + ' a: 1\n', conf) + self.check('---\n' + 'dict: {}\n', conf) + self.check('---\n' + 'dict: {\n' + '}\n', conf) + self.check('---\n' + 'dict: {\n' + '# commented: value\n' + '# another: value2\n' + '}\n', conf) + self.check('---\n' + 'dict: {a}\n', conf, problem=(2, 8)) + self.check('---\n' + 'dict: {a: 1}\n', conf, problem=(2, 8)) + self.check('---\n' + 'dict: {\n' + ' a: 1\n' + '}\n', conf, problem=(2, 8)) + def test_min_spaces(self): conf = ('braces:\n' ' max-spaces-inside: -1\n' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/rules/test_brackets.py new/yamllint-1.26.3/tests/rules/test_brackets.py --- old/yamllint-1.24.2/tests/rules/test_brackets.py 2017-07-04 21:36:19.000000000 +0200 +++ new/yamllint-1.26.3/tests/rules/test_brackets.py 2021-01-27 08:53:04.000000000 +0100 @@ -31,6 +31,58 @@ 'array6: [ a, b, c ]\n' 'array7: [ a, b, c ]\n', conf) + def test_forbid(self): + conf = ('brackets:\n' + ' forbid: false\n') + self.check('---\n' + 'array: []\n', conf) + self.check('---\n' + 'array: [a, b]\n', conf) + self.check('---\n' + 'array: [\n' + ' a,\n' + ' b\n' + ']\n', conf) + + conf = ('brackets:\n' + ' forbid: true\n') + self.check('---\n' + 'array:\n' + ' - a\n' + ' - b\n', conf) + self.check('---\n' + 'array: []\n', conf, problem=(2, 9)) + self.check('---\n' + 'array: [a, b]\n', conf, problem=(2, 9)) + self.check('---\n' + 'array: [\n' + ' a,\n' + ' b\n' + ']\n', conf, problem=(2, 9)) + + conf = ('brackets:\n' + ' forbid: non-empty\n') + self.check('---\n' + 'array:\n' + ' - a\n' + ' - b\n', conf) + self.check('---\n' + 'array: []\n', conf) + self.check('---\n' + 'array: [\n\n' + ']\n', conf) + self.check('---\n' + 'array: [\n' + '# a comment\n' + ']\n', conf) + self.check('---\n' + 'array: [a, b]\n', conf, problem=(2, 9)) + self.check('---\n' + 'array: [\n' + ' a,\n' + ' b\n' + ']\n', conf, problem=(2, 9)) + def test_min_spaces(self): conf = ('brackets:\n' ' max-spaces-inside: -1\n' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/rules/test_line_length.py new/yamllint-1.26.3/tests/rules/test_line_length.py --- old/yamllint-1.24.2/tests/rules/test_line_length.py 2019-04-09 16:48:10.000000000 +0200 +++ new/yamllint-1.26.3/tests/rules/test_line_length.py 2021-04-06 15:22:52.000000000 +0200 @@ -14,9 +14,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -import sys -import unittest - from tests.common import RuleTestCase @@ -119,6 +116,27 @@ 'long_line: http://localhost/very/very/long/url\n' '...\n', conf, problem=(2, 21)) + conf = 'line-length: {max: 20, allow-non-breakable-words: true}' + self.check('---\n' + '# http://www.verylongurlurlurlurlurlurlurlurl.com\n' + 'key:\n' + ' subkey: value\n', conf) + self.check('---\n' + '## http://www.verylongurlurlurlurlurlurlurlurl.com\n' + 'key:\n' + ' subkey: value\n', conf) + self.check('---\n' + '# # http://www.verylongurlurlurlurlurlurlurlurl.com\n' + 'key:\n' + ' subkey: value\n', conf, + problem=(2, 21)) + self.check('---\n' + '#A http://www.verylongurlurlurlurlurlurlurlurl.com\n' + 'key:\n' + ' subkey: value\n', conf, + problem1=(2, 2, 'comments'), + problem2=(2, 21, 'line-length')) + conf = ('line-length: {max: 20, allow-non-breakable-words: true}\n' 'trailing-spaces: disable') self.check('---\n' @@ -159,7 +177,6 @@ ' {% this line is' + 99 * ' really' + ' long %}\n', conf, problem=(3, 81)) - @unittest.skipIf(sys.version_info < (3, 0), 'Python 2 not supported') def test_unicode(self): conf = 'line-length: {max: 53}' self.check('---\n' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/rules/test_octal_values.py new/yamllint-1.26.3/tests/rules/test_octal_values.py --- old/yamllint-1.24.2/tests/rules/test_octal_values.py 2019-10-15 16:18:58.000000000 +0200 +++ new/yamllint-1.26.3/tests/rules/test_octal_values.py 2020-09-27 10:11:38.000000000 +0200 @@ -50,6 +50,8 @@ ' - 0.10\n' ' - .01\n' ' - 0e3\n', conf) + self.check('with-decimal-digits: 012345678', conf) + self.check('with-decimal-digits: 012345679', conf) def test_explicit_octal_values(self): conf = ('octal-values:\n' @@ -74,3 +76,5 @@ ' - .01\n' ' - 0e3\n', conf) self.check('user-city: "010"', conf) + self.check('with-decimal-digits: 0o012345678', conf) + self.check('with-decimal-digits: 0o012345679', conf) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/rules/test_quoted_strings.py new/yamllint-1.26.3/tests/rules/test_quoted_strings.py --- old/yamllint-1.24.2/tests/rules/test_quoted_strings.py 2020-07-15 11:38:48.000000000 +0200 +++ new/yamllint-1.26.3/tests/rules/test_quoted_strings.py 2021-01-27 08:53:04.000000000 +0100 @@ -330,7 +330,8 @@ '- "%wheel ALL=(ALL) NOPASSWD: ALL"\n' '- \'"quoted"\'\n' '- "\'foo\' == \'bar\'"\n' - '- "\'Mac\' in ansible_facts.product_name"\n', + '- "\'Mac\' in ansible_facts.product_name"\n' + '- \'foo # bar\'\n', conf) self.check('---\n' 'k1: ""\n' @@ -435,3 +436,21 @@ '- foo bar\n' '- "foo bar"\n', conf, problem1=(3, 3), problem2=(7, 3), problem3=(11, 3)) + + def test_octal_values(self): + conf = 'quoted-strings: {required: true}\n' + + self.check('---\n' + '- 100\n' + '- 0100\n' + '- 0o100\n' + '- 777\n' + '- 0777\n' + '- 0o777\n' + '- 800\n' + '- 0800\n' + '- 0o800\n' + '- "0800"\n' + '- "0o800"\n', + conf, + problem1=(9, 3), problem2=(10, 3)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/test_cli.py new/yamllint-1.26.3/tests/test_cli.py --- old/yamllint-1.24.2/tests/test_cli.py 2020-07-16 09:34:22.000000000 +0200 +++ new/yamllint-1.26.3/tests/test_cli.py 2021-04-06 15:22:52.000000000 +0200 @@ -14,10 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -try: - from cStringIO import StringIO -except ImportError: - from io import StringIO +from io import StringIO import fcntl import locale import os @@ -56,6 +53,16 @@ return self._raises_ctx.exception.code +# Check system's UTF-8 availability +def utf8_available(): + try: + locale.setlocale(locale.LC_ALL, 'C.UTF-8') + locale.setlocale(locale.LC_ALL, (None, None)) + return True + except locale.Error: + return False + + class CommandLineTestCase(unittest.TestCase): @classmethod def setUpClass(cls): @@ -86,7 +93,7 @@ 'no-yaml.json': '---\n' 'key: value\n', # non-ASCII chars - 'non-ascii/????????????????/utf-8': ( + u'non-ascii/????????????????/utf-8': ( u'---\n' u'- h??t??rog??n??it??\n' u'# 19.99 ???\n' @@ -110,6 +117,8 @@ shutil.rmtree(cls.wd) + @unittest.skipIf(not utf8_available() and sys.version_info < (3, 7), + 'UTF-8 paths not supported') def test_find_files_recursively(self): conf = config.YamlLintConfig('extends: default') self.assertEqual( @@ -234,19 +243,19 @@ cli.run(()) self.assertNotEqual(ctx.returncode, 0) self.assertEqual(ctx.stdout, '') - self.assertRegexpMatches(ctx.stderr, r'^usage') + self.assertRegex(ctx.stderr, r'^usage') with RunContext(self) as ctx: cli.run(('--unknown-arg', )) self.assertNotEqual(ctx.returncode, 0) self.assertEqual(ctx.stdout, '') - self.assertRegexpMatches(ctx.stderr, r'^usage') + self.assertRegex(ctx.stderr, r'^usage') with RunContext(self) as ctx: cli.run(('-c', './conf.yaml', '-d', 'relaxed', 'file')) self.assertNotEqual(ctx.returncode, 0) self.assertEqual(ctx.stdout, '') - self.assertRegexpMatches( + self.assertRegex( ctx.stderr.splitlines()[-1], r'^yamllint: error: argument -d\/--config-data: ' r'not allowed with argument -c\/--config-file$' @@ -257,21 +266,21 @@ cli.run(('-', 'file')) self.assertNotEqual(ctx.returncode, 0) self.assertEqual(ctx.stdout, '') - self.assertRegexpMatches(ctx.stderr, r'^usage') + self.assertRegex(ctx.stderr, r'^usage') def test_run_with_bad_config(self): with RunContext(self) as ctx: cli.run(('-d', 'rules: {a: b}', 'file')) self.assertEqual(ctx.returncode, -1) self.assertEqual(ctx.stdout, '') - self.assertRegexpMatches(ctx.stderr, r'^invalid config: no such rule') + self.assertRegex(ctx.stderr, r'^invalid config: no such rule') def test_run_with_empty_config(self): with RunContext(self) as ctx: cli.run(('-d', '', 'file')) self.assertEqual(ctx.returncode, -1) self.assertEqual(ctx.stdout, '') - self.assertRegexpMatches(ctx.stderr, r'^invalid config: not a dict') + self.assertRegex(ctx.stderr, r'^invalid config: not a dict') def test_run_with_config_file(self): with open(os.path.join(self.wd, 'config'), 'w') as f: @@ -288,6 +297,7 @@ cli.run(('-c', f.name, os.path.join(self.wd, 'a.yaml'))) self.assertEqual(ctx.returncode, 1) + @unittest.skipIf(os.environ.get('GITHUB_RUN_ID'), '$HOME not overridable') def test_run_with_user_global_config_file(self): home = os.path.join(self.wd, 'fake-home') dir = os.path.join(home, '.config', 'yamllint') @@ -374,7 +384,7 @@ with RunContext(self) as ctx: cli.run(('--version', )) self.assertEqual(ctx.returncode, 0) - self.assertRegexpMatches(ctx.stdout + ctx.stderr, r'yamllint \d+\.\d+') + self.assertRegex(ctx.stdout + ctx.stderr, r'yamllint \d+\.\d+') def test_run_non_existing_file(self): path = os.path.join(self.wd, 'i-do-not-exist.yaml') @@ -383,7 +393,7 @@ cli.run(('-f', 'parsable', path)) self.assertEqual(ctx.returncode, -1) self.assertEqual(ctx.stdout, '') - self.assertRegexpMatches(ctx.stderr, r'No such file or directory') + self.assertRegex(ctx.stderr, r'No such file or directory') def test_run_one_problem_file(self): path = os.path.join(self.wd, 'a.yaml') @@ -425,17 +435,12 @@ cli.run(('-f', 'parsable', path)) self.assertEqual((ctx.returncode, ctx.stdout, ctx.stderr), (0, '', '')) + @unittest.skipIf(not utf8_available(), 'C.UTF-8 not available') def test_run_non_ascii_file(self): - path = os.path.join(self.wd, 'non-ascii', '????????????????', 'utf-8') - - # Make sure the default localization conditions on this "system" - # support UTF-8 encoding. - try: - locale.setlocale(locale.LC_ALL, (None, 'UTF-8')) - except locale.Error: - self.skipTest('no UTF-8 locale available') + locale.setlocale(locale.LC_ALL, 'C.UTF-8') self.addCleanup(locale.setlocale, locale.LC_ALL, (None, None)) + path = os.path.join(self.wd, 'non-ascii', '????????????????', 'utf-8') with RunContext(self) as ctx: cli.run(('-f', 'parsable', path)) self.assertEqual((ctx.returncode, ctx.stdout, ctx.stderr), (0, '', '')) @@ -542,6 +547,38 @@ self.assertEqual( (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) + def test_run_format_github(self): + path = os.path.join(self.wd, 'a.yaml') + + with RunContext(self) as ctx: + cli.run((path, '--format', 'github')) + expected_out = ( + '::error file=%s,line=2,col=4::[trailing-spaces] trailing' + ' spaces\n' + '::error file=%s,line=3,col=4::[new-line-at-end-of-file] no' + ' new line character at the end of file\n' + % (path, path)) + self.assertEqual( + (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) + + def test_github_actions_detection(self): + path = os.path.join(self.wd, 'a.yaml') + self.addCleanup(os.environ.__delitem__, 'GITHUB_ACTIONS') + self.addCleanup(os.environ.__delitem__, 'GITHUB_WORKFLOW') + + with RunContext(self) as ctx: + os.environ['GITHUB_ACTIONS'] = 'something' + os.environ['GITHUB_WORKFLOW'] = 'something' + cli.run((path, )) + expected_out = ( + '::error file=%s,line=2,col=4::[trailing-spaces] trailing' + ' spaces\n' + '::error file=%s,line=3,col=4::[new-line-at-end-of-file] no' + ' new line character at the end of file\n' + % (path, path)) + self.assertEqual( + (ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, '')) + def test_run_read_from_stdin(self): # prepares stdin with an invalid yaml string so that we can check # for its specific error, and be assured that stdin was read diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/test_config.py new/yamllint-1.26.3/tests/test_config.py --- old/yamllint-1.24.2/tests/test_config.py 2019-08-27 09:46:03.000000000 +0200 +++ new/yamllint-1.26.3/tests/test_config.py 2021-01-27 08:53:04.000000000 +0100 @@ -14,10 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -try: - from cStringIO import StringIO -except ImportError: - from io import StringIO +from io import StringIO import os import shutil import sys @@ -48,7 +45,7 @@ config.YamlLintConfig('not: valid: yaml') def test_unknown_rule(self): - with self.assertRaisesRegexp( + with self.assertRaisesRegex( config.YamlLintConfigError, 'invalid config: no such rule: "this-one-does-not-exist"'): config.YamlLintConfig('rules:\n' @@ -67,7 +64,7 @@ self.assertEqual(c.rules['colons']['max-spaces-after'], 1) def test_unknown_option(self): - with self.assertRaisesRegexp( + with self.assertRaisesRegex( config.YamlLintConfigError, 'invalid config: unknown option "abcdef" for rule "colons"'): config.YamlLintConfig('rules:\n' @@ -105,7 +102,7 @@ self.assertEqual(c.rules['indentation']['check-multi-line-strings'], False) - with self.assertRaisesRegexp( + with self.assertRaisesRegex( config.YamlLintConfigError, 'invalid config: option "indent-sequences" of "indentation" ' 'should be in '): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/test_module.py new/yamllint-1.26.3/tests/test_module.py --- old/yamllint-1.24.2/tests/test_module.py 2018-11-26 19:20:01.000000000 +0100 +++ new/yamllint-1.26.3/tests/test_module.py 2021-01-27 08:53:04.000000000 +0100 @@ -47,16 +47,15 @@ subprocess.check_output([PYTHON, '-m', 'yamllint'], stderr=subprocess.STDOUT) self.assertEqual(ctx.exception.returncode, 2) - self.assertRegexpMatches(ctx.exception.output.decode(), - r'^usage: yamllint') + self.assertRegex(ctx.exception.output.decode(), r'^usage: yamllint') def test_run_module_on_bad_dir(self): with self.assertRaises(subprocess.CalledProcessError) as ctx: subprocess.check_output([PYTHON, '-m', 'yamllint', '/does/not/exist'], stderr=subprocess.STDOUT) - self.assertRegexpMatches(ctx.exception.output.decode(), - r'No such file or directory') + self.assertRegex(ctx.exception.output.decode(), + r'No such file or directory') def test_run_module_on_file(self): out = subprocess.check_output( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/tests/test_yamllint_directives.py new/yamllint-1.26.3/tests/test_yamllint_directives.py --- old/yamllint-1.24.2/tests/test_yamllint_directives.py 2019-12-12 09:07:45.000000000 +0100 +++ new/yamllint-1.26.3/tests/test_yamllint_directives.py 2020-09-27 10:11:38.000000000 +0200 @@ -232,6 +232,34 @@ problem1=(3, 18, 'trailing-spaces'), problem2=(4, 8, 'colons')) + def test_disable_directive_with_rules_and_dos_lines(self): + conf = self.conf + 'new-lines: {type: dos}\n' + self.check('---\r\n' + '- [valid , YAML]\r\n' + '# yamllint disable rule:trailing-spaces\r\n' + '- trailing spaces \r\n' + '- bad : colon\r\n' + '- [valid , YAML]\r\n' + '# yamllint enable rule:trailing-spaces\r\n' + '- bad : colon and spaces \r\n' + '- [valid , YAML]\r\n', + conf, + problem1=(5, 8, 'colons'), + problem2=(8, 7, 'colons'), + problem3=(8, 26, 'trailing-spaces')) + self.check('---\r\n' + '- [valid , YAML]\r\n' + '- trailing spaces \r\n' + '- bad : colon\r\n' + '- [valid , YAML]\r\n' + '# yamllint disable-line rule:colons\r\n' + '- bad : colon and spaces \r\n' + '- [valid , YAML]\r\n', + conf, + problem1=(3, 18, 'trailing-spaces'), + problem2=(4, 8, 'colons'), + problem3=(7, 26, 'trailing-spaces')) + def test_directive_on_last_line(self): conf = 'new-line-at-end-of-file: {}' self.check('---\n' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/__init__.py new/yamllint-1.26.3/yamllint/__init__.py --- old/yamllint-1.24.2/yamllint/__init__.py 2020-07-16 09:34:41.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/__init__.py 2021-08-21 19:26:11.000000000 +0200 @@ -22,7 +22,7 @@ APP_NAME = 'yamllint' -APP_VERSION = '1.24.2' +APP_VERSION = '1.26.3' APP_DESCRIPTION = __doc__ __author__ = u'Adrien Verg??' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/cli.py new/yamllint-1.26.3/yamllint/cli.py --- old/yamllint-1.24.2/yamllint/cli.py 2020-07-16 09:34:22.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/cli.py 2020-09-27 10:11:38.000000000 +0200 @@ -85,6 +85,19 @@ line += ' \033[2m(%s)\033[0m' % problem.rule 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 += '::' + if problem.rule: + line += '[' + problem.rule + '] ' + line += problem.desc + return line + def show_problems(problems, file, args_format, no_warn): max_level = 0 @@ -96,6 +109,10 @@ continue if args_format == 'parsable': print(Format.parsable(problem, file)) + elif args_format == 'github' or (args_format == 'auto' and + 'GITHUB_ACTIONS' in os.environ and + 'GITHUB_WORKFLOW' in os.environ): + print(Format.github(problem, file)) elif args_format == 'colored' or \ (args_format == 'auto' and supports_color()): if first: @@ -131,7 +148,8 @@ action='store', help='custom configuration (as YAML source)') parser.add_argument('-f', '--format', - choices=('parsable', 'standard', 'colored', 'auto'), + choices=('parsable', 'standard', 'colored', 'github', + 'auto'), default='auto', help='format for parsing output') parser.add_argument('-s', '--strict', action='store_true', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/linter.py new/yamllint-1.26.3/yamllint/linter.py --- old/yamllint-1.24.2/yamllint/linter.py 2020-05-07 12:31:09.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/linter.py 2021-01-27 08:53:04.000000000 +0100 @@ -87,7 +87,8 @@ return # this certainly wasn't a yamllint directive comment if re.match(r'^# yamllint disable( rule:\S+)*\s*$', comment): - rules = [item[5:] for item in comment[18:].split(' ')][1:] + items = comment[18:].rstrip().split(' ') + rules = [item[5:] for item in items][1:] if len(rules) == 0: self.rules = self.all_rules.copy() else: @@ -96,7 +97,8 @@ self.rules.add(id) elif re.match(r'^# yamllint enable( rule:\S+)*\s*$', comment): - rules = [item[5:] for item in comment[17:].split(' ')][1:] + items = comment[17:].rstrip().split(' ') + rules = [item[5:] for item in items][1:] if len(rules) == 0: self.rules.clear() else: @@ -114,7 +116,8 @@ return # this certainly wasn't a yamllint directive comment if re.match(r'^# yamllint disable-line( rule:\S+)*\s*$', comment): - rules = [item[5:] for item in comment[23:].split(' ')][1:] + items = comment[23:].rstrip().split(' ') + rules = [item[5:] for item in items][1:] if len(rules) == 0: self.rules = self.all_rules.copy() else: @@ -230,7 +233,7 @@ if conf.is_file_ignored(filepath): return () - if isinstance(input, (type(b''), type(u''))): # compat with Python 2 & 3 + if isinstance(input, (bytes, str)): return _run(input, conf, filepath) elif hasattr(input, 'read'): # Python 2's file or Python 3's io.IOBase # We need to have everything in memory to parse correctly diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/braces.py new/yamllint-1.26.3/yamllint/rules/braces.py --- old/yamllint-1.24.2/yamllint/rules/braces.py 2019-01-10 10:01:44.000000000 +0100 +++ new/yamllint-1.26.3/yamllint/rules/braces.py 2021-01-27 08:53:04.000000000 +0100 @@ -15,10 +15,15 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. """ -Use this rule to control the number of spaces inside braces (``{`` and ``}``). +Use this rule to control the use of flow mappings or number of spaces inside +braces (``{`` and ``}``). .. rubric:: Options +* ``forbid`` is used to forbid the use of flow mappings which are denoted by + surrounding braces (``{`` and ``}``). Use ``true`` to forbid the use of flow + mappings completely. Use ``non-empty`` to forbid the use of all flow + mappings except for empty ones. * ``min-spaces-inside`` defines the minimal number of spaces required inside braces. * ``max-spaces-inside`` defines the maximal number of spaces allowed inside @@ -28,8 +33,46 @@ * ``max-spaces-inside-empty`` defines the maximal number of spaces allowed inside empty braces. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + braces: + forbid: false + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + .. rubric:: Examples +#. With ``braces: {forbid: true}`` + + the following code snippet would **PASS**: + :: + + object: + key1: 4 + key2: 8 + + the following code snippet would **FAIL**: + :: + + object: { key1: 4, key2: 8 } + +#. With ``braces: {forbid: non-empty}`` + + the following code snippet would **PASS**: + :: + + object: {} + + the following code snippet would **FAIL**: + :: + + object: { key1: 4, key2: 8 } + #. With ``braces: {min-spaces-inside: 0, max-spaces-inside: 0}`` the following code snippet would **PASS**: @@ -92,23 +135,39 @@ import yaml +from yamllint.linter import LintProblem from yamllint.rules.common import spaces_after, spaces_before ID = 'braces' TYPE = 'token' -CONF = {'min-spaces-inside': int, +CONF = {'forbid': (bool, 'non-empty'), + 'min-spaces-inside': int, 'max-spaces-inside': int, 'min-spaces-inside-empty': int, 'max-spaces-inside-empty': int} -DEFAULT = {'min-spaces-inside': 0, +DEFAULT = {'forbid': False, + 'min-spaces-inside': 0, 'max-spaces-inside': 0, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1} def check(conf, token, prev, next, nextnext, context): - if (isinstance(token, yaml.FlowMappingStartToken) and + if (conf['forbid'] is True and + isinstance(token, yaml.FlowMappingStartToken)): + yield LintProblem(token.start_mark.line + 1, + token.end_mark.column + 1, + 'forbidden flow mapping') + + elif (conf['forbid'] == 'non-empty' and + isinstance(token, yaml.FlowMappingStartToken) and + not isinstance(next, yaml.FlowMappingEndToken)): + yield LintProblem(token.start_mark.line + 1, + token.end_mark.column + 1, + 'forbidden flow mapping') + + elif (isinstance(token, yaml.FlowMappingStartToken) and isinstance(next, yaml.FlowMappingEndToken)): problem = spaces_after(token, prev, next, min=(conf['min-spaces-inside-empty'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/brackets.py new/yamllint-1.26.3/yamllint/rules/brackets.py --- old/yamllint-1.24.2/yamllint/rules/brackets.py 2019-01-10 10:01:44.000000000 +0100 +++ new/yamllint-1.26.3/yamllint/rules/brackets.py 2021-01-27 08:53:04.000000000 +0100 @@ -15,11 +15,15 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. """ -Use this rule to control the number of spaces inside brackets (``[`` and -``]``). +Use this rule to control the use of flow sequences or the number of spaces +inside brackets (``[`` and ``]``). .. rubric:: Options +* ``forbid`` is used to forbid the use of flow sequences which are denoted by + surrounding brackets (``[`` and ``]``). Use ``true`` to forbid the use of + flow sequences completely. Use ``non-empty`` to forbid the use of all flow + sequences except for empty ones. * ``min-spaces-inside`` defines the minimal number of spaces required inside brackets. * ``max-spaces-inside`` defines the maximal number of spaces allowed inside @@ -29,8 +33,47 @@ * ``max-spaces-inside-empty`` defines the maximal number of spaces allowed inside empty brackets. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + brackets: + forbid: false + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + .. rubric:: Examples +#. With ``brackets: {forbid: true}`` + + the following code snippet would **PASS**: + :: + + object: + - 1 + - 2 + - abc + + the following code snippet would **FAIL**: + :: + + object: [ 1, 2, abc ] + +#. With ``brackets: {forbid: non-empty}`` + + the following code snippet would **PASS**: + :: + + object: [] + + the following code snippet would **FAIL**: + :: + + object: [ 1, 2, abc ] + #. With ``brackets: {min-spaces-inside: 0, max-spaces-inside: 0}`` the following code snippet would **PASS**: @@ -93,23 +136,39 @@ import yaml +from yamllint.linter import LintProblem from yamllint.rules.common import spaces_after, spaces_before ID = 'brackets' TYPE = 'token' -CONF = {'min-spaces-inside': int, +CONF = {'forbid': (bool, 'non-empty'), + 'min-spaces-inside': int, 'max-spaces-inside': int, 'min-spaces-inside-empty': int, 'max-spaces-inside-empty': int} -DEFAULT = {'min-spaces-inside': 0, +DEFAULT = {'forbid': False, + 'min-spaces-inside': 0, 'max-spaces-inside': 0, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1} def check(conf, token, prev, next, nextnext, context): - if (isinstance(token, yaml.FlowSequenceStartToken) and + if (conf['forbid'] is True and + isinstance(token, yaml.FlowSequenceStartToken)): + yield LintProblem(token.start_mark.line + 1, + token.end_mark.column + 1, + 'forbidden flow sequence') + + elif (conf['forbid'] == 'non-empty' and + isinstance(token, yaml.FlowSequenceStartToken) and + not isinstance(next, yaml.FlowSequenceEndToken)): + yield LintProblem(token.start_mark.line + 1, + token.end_mark.column + 1, + 'forbidden flow sequence') + + elif (isinstance(token, yaml.FlowSequenceStartToken) and isinstance(next, yaml.FlowSequenceEndToken)): problem = spaces_after(token, prev, next, min=(conf['min-spaces-inside-empty'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/colons.py new/yamllint-1.26.3/yamllint/rules/colons.py --- old/yamllint-1.24.2/yamllint/rules/colons.py 2019-06-06 09:52:15.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/colons.py 2020-09-02 18:18:24.000000000 +0200 @@ -24,6 +24,15 @@ * ``max-spaces-after`` defines the maximal number of spaces allowed after colons (use ``-1`` to disable). +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + colons: + max-spaces-before: 0 + max-spaces-after: 1 + .. rubric:: Examples #. With ``colons: {max-spaces-before: 0, max-spaces-after: 1}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/commas.py new/yamllint-1.26.3/yamllint/rules/commas.py --- old/yamllint-1.24.2/yamllint/rules/commas.py 2019-01-10 10:01:44.000000000 +0100 +++ new/yamllint-1.26.3/yamllint/rules/commas.py 2020-09-02 18:18:24.000000000 +0200 @@ -26,6 +26,16 @@ * ``max-spaces-after`` defines the maximal number of spaces allowed after commas (use ``-1`` to disable). +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + commas: + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + .. rubric:: Examples #. With ``commas: {max-spaces-before: 0}`` @@ -66,7 +76,7 @@ :: strange var: - [10, 20,30, {x: 1, y: 2}] + [10, 20, 30, {x: 1, y: 2}] the following code snippet would **FAIL**: :: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/comments.py new/yamllint-1.26.3/yamllint/rules/comments.py --- old/yamllint-1.24.2/yamllint/rules/comments.py 2020-05-03 16:22:34.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/comments.py 2020-09-02 18:18:24.000000000 +0200 @@ -28,6 +28,16 @@ content. It defines the minimal required number of spaces between a comment and its preceding content. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + comments: + require-starting-space: true + ignore-shebangs: true + min-spaces-from-content: 2 + .. rubric:: Examples #. With ``comments: {require-starting-space: true}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/document_end.py new/yamllint-1.26.3/yamllint/rules/document_end.py --- old/yamllint-1.24.2/yamllint/rules/document_end.py 2019-01-10 10:01:44.000000000 +0100 +++ new/yamllint-1.26.3/yamllint/rules/document_end.py 2020-09-02 18:18:24.000000000 +0200 @@ -22,6 +22,14 @@ * Set ``present`` to ``true`` when the document end marker is required, or to ``false`` when it is forbidden. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + document-end: + present: true + .. rubric:: Examples #. With ``document-end: {present: true}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/document_start.py new/yamllint-1.26.3/yamllint/rules/document_start.py --- old/yamllint-1.24.2/yamllint/rules/document_start.py 2019-01-10 10:01:44.000000000 +0100 +++ new/yamllint-1.26.3/yamllint/rules/document_start.py 2020-11-04 15:13:42.000000000 +0100 @@ -22,6 +22,14 @@ * Set ``present`` to ``true`` when the document start marker is required, or to ``false`` when it is forbidden. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + document-start: + present: true + .. rubric:: Examples #. With ``document-start: {present: true}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/empty_lines.py new/yamllint-1.26.3/yamllint/rules/empty_lines.py --- old/yamllint-1.24.2/yamllint/rules/empty_lines.py 2019-04-09 16:48:10.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/empty_lines.py 2020-09-02 18:18:24.000000000 +0200 @@ -25,6 +25,16 @@ * ``max-end`` defines the maximal number of empty lines allowed at the end of the file. This option takes precedence over ``max``. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + empty-lines: + max: 2 + max-start: 0 + max-end: 0 + .. rubric:: Examples #. With ``empty-lines: {max: 1}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/empty_values.py new/yamllint-1.26.3/yamllint/rules/empty_values.py --- old/yamllint-1.24.2/yamllint/rules/empty_values.py 2019-10-15 16:18:58.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/empty_values.py 2020-09-02 18:18:24.000000000 +0200 @@ -23,6 +23,15 @@ * Use ``forbid-in-block-mappings`` to prevent empty values in block mappings. * Use ``forbid-in-flow-mappings`` to prevent empty values in flow mappings. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + empty-values: + forbid-in-block-mappings: true + forbid-in-flow-mappings: true + .. rubric:: Examples #. With ``empty-values: {forbid-in-block-mappings: true}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/hyphens.py new/yamllint-1.26.3/yamllint/rules/hyphens.py --- old/yamllint-1.24.2/yamllint/rules/hyphens.py 2019-01-10 10:01:44.000000000 +0100 +++ new/yamllint-1.26.3/yamllint/rules/hyphens.py 2020-09-02 18:18:24.000000000 +0200 @@ -22,6 +22,14 @@ * ``max-spaces-after`` defines the maximal number of spaces allowed after hyphens. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + hyphens: + max-spaces-after: 1 + .. rubric:: Examples #. With ``hyphens: {max-spaces-after: 1}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/indentation.py new/yamllint-1.26.3/yamllint/rules/indentation.py --- old/yamllint-1.24.2/yamllint/rules/indentation.py 2019-06-06 09:52:15.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/indentation.py 2020-09-02 18:18:24.000000000 +0200 @@ -32,6 +32,16 @@ * ``check-multi-line-strings`` defines whether to lint indentation in multi-line strings. Set to ``true`` to enable, ``false`` to disable. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + indentation: + spaces: consistent + indent-sequences: true + check-multi-line-strings: false + .. rubric:: Examples #. With ``indentation: {spaces: 1}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/line_length.py new/yamllint-1.26.3/yamllint/rules/line_length.py --- old/yamllint-1.24.2/yamllint/rules/line_length.py 2019-01-10 10:01:44.000000000 +0100 +++ new/yamllint-1.26.3/yamllint/rules/line_length.py 2021-04-06 15:22:52.000000000 +0200 @@ -17,10 +17,6 @@ """ Use this rule to set a limit to lines length. -Note: with Python 2, the ``line-length`` rule may not work properly with -unicode characters because of the way strings are represented in bytes. We -recommend running yamllint with Python 3. - .. rubric:: Options * ``max`` defines the maximal (inclusive) length of lines. @@ -30,6 +26,16 @@ * ``allow-non-breakable-inline-mappings`` implies ``allow-non-breakable-words`` and extends it to also allow non-breakable words in inline mappings. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + line-length: + max: 80 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: false + .. rubric:: Examples #. With ``line-length: {max: 70}`` @@ -134,7 +140,11 @@ start += 1 if start != line.end: - if line.buffer[start] in ('#', '-'): + if line.buffer[start] == '#': + while line.buffer[start] == '#': + start += 1 + start += 1 + elif line.buffer[start] == '-': start += 2 if line.buffer.find(' ', start, line.end) == -1: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/new_lines.py new/yamllint-1.26.3/yamllint/rules/new_lines.py --- old/yamllint-1.24.2/yamllint/rules/new_lines.py 2019-04-09 16:48:10.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/new_lines.py 2020-09-02 18:18:24.000000000 +0200 @@ -21,6 +21,14 @@ * Set ``type`` to ``unix`` to use UNIX-typed new line characters (``\\n``), or ``dos`` to use DOS-typed new line characters (``\\r\\n``). + +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + new-lines: + type: unix """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/octal_values.py new/yamllint-1.26.3/yamllint/rules/octal_values.py --- old/yamllint-1.24.2/yamllint/rules/octal_values.py 2019-10-15 16:18:58.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/octal_values.py 2020-09-27 10:11:38.000000000 +0200 @@ -20,6 +20,20 @@ For instance ``010`` is the city code of Beijing, and should not be converted to ``8``. +.. rubric:: Options + +* Use ``forbid-implicit-octal`` to prevent numbers starting with ``0``. +* Use ``forbid-explicit-octal`` to prevent numbers starting with ``0o``. + +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + octal-values: + forbid-implicit-octal: true + forbid-explicit-octal: true + .. rubric:: Examples #. With ``octal-values: {forbid-implicit-octal: true}`` @@ -57,6 +71,8 @@ city-code: 0o10 """ +import re + import yaml from yamllint.linter import LintProblem @@ -70,6 +86,10 @@ 'forbid-explicit-octal': True} +def _is_octal_number(string): + return re.match(r'^[0-7]+$', string) is not None + + def check(conf, token, prev, next, nextnext, context): if prev and isinstance(prev, yaml.tokens.TagToken): return @@ -78,7 +98,8 @@ if isinstance(token, yaml.tokens.ScalarToken): if not token.style: val = token.value - if val.isdigit() and len(val) > 1 and val[0] == '0': + if (val.isdigit() and len(val) > 1 and val[0] == '0' and + _is_octal_number(val[1:])): yield LintProblem( token.start_mark.line + 1, token.end_mark.column + 1, 'forbidden implicit octal value "%s"' % @@ -88,7 +109,8 @@ if isinstance(token, yaml.tokens.ScalarToken): if not token.style: val = token.value - if len(val) > 2 and val[:2] == '0o' and val[2:].isdigit(): + if (len(val) > 2 and val[:2] == '0o' and + _is_octal_number(val[2:])): yield LintProblem( token.start_mark.line + 1, token.end_mark.column + 1, 'forbidden explicit octal value "%s"' % diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/quoted_strings.py new/yamllint-1.26.3/yamllint/rules/quoted_strings.py --- old/yamllint-1.24.2/yamllint/rules/quoted_strings.py 2020-04-17 10:30:12.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/quoted_strings.py 2021-01-27 08:53:04.000000000 +0100 @@ -34,6 +34,17 @@ **Note**: Multi-line strings (with ``|`` or ``>``) will not be checked. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + quoted-strings: + quote-type: any + required: true + extra-required: [] + extra-allowed: [] + .. rubric:: Examples #. With ``quoted-strings: {quote-type: any, required: true}`` @@ -133,6 +144,17 @@ DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str' +# https://stackoverflow.com/a/36514274 +yaml.resolver.Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:int', + re.compile(r'''^(?:[-+]?0b[0-1_]+ + |[-+]?0o?[0-7_]+ + |[-+]?0[0-7_]+ + |[-+]?(?:0|[1-9][0-9_]*) + |[-+]?0x[0-9a-fA-F_]+ + |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), + list('-+0123456789')) + def _quote_match(quote_type, token_style): return ((quote_type == 'any') or @@ -149,7 +171,7 @@ try: a, b = loader.get_token(), loader.get_token() if (isinstance(a, yaml.ScalarToken) and a.style is None and - isinstance(b, yaml.BlockEndToken)): + isinstance(b, yaml.BlockEndToken) and a.value == string): return False return True except yaml.scanner.ScannerError: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint/rules/truthy.py new/yamllint-1.26.3/yamllint/rules/truthy.py --- old/yamllint-1.24.2/yamllint/rules/truthy.py 2020-04-08 12:30:35.000000000 +0200 +++ new/yamllint-1.26.3/yamllint/rules/truthy.py 2020-09-02 18:18:24.000000000 +0200 @@ -34,6 +34,15 @@ ``truthy`` rule applies to both keys and values. Set this option to ``false`` to prevent this. +.. rubric:: Default values (when enabled) + +.. code-block:: yaml + + rules: + truthy: + allowed-values: ['true', 'false'] + check-keys: true + .. rubric:: Examples #. With ``truthy: {}`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint.egg-info/PKG-INFO new/yamllint-1.26.3/yamllint.egg-info/PKG-INFO --- old/yamllint-1.24.2/yamllint.egg-info/PKG-INFO 2020-07-16 09:35:38.000000000 +0200 +++ new/yamllint-1.26.3/yamllint.egg-info/PKG-INFO 2021-08-21 19:26:45.000000000 +0200 @@ -1,10 +1,14 @@ Metadata-Version: 1.2 Name: yamllint -Version: 1.24.2 +Version: 1.26.3 Summary: A linter for YAML files. Home-page: https://github.com/adrienverge/yamllint Author: Adrien Verg?? License: GPLv3 +Project-URL: Documentation, https://yamllint.readthedocs.io +Project-URL: Download, https://pypi.org/project/yamllint/#files +Project-URL: Bug Tracker, https://github.com/adrienverge/yamllint/issues +Project-URL: Source Code, https://github.com/adrienverge/yamllint Description: A linter for YAML files. yamllint does not only check for syntax validity, but for weirdnesses like key @@ -16,16 +20,14 @@ Classifier: Environment :: Console Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3) -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Debuggers Classifier: Topic :: Software Development :: Quality Assurance Classifier: Topic :: Software Development :: Testing -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Python: >=3.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yamllint-1.24.2/yamllint.egg-info/requires.txt new/yamllint-1.26.3/yamllint.egg-info/requires.txt --- old/yamllint-1.24.2/yamllint.egg-info/requires.txt 2020-07-16 09:35:38.000000000 +0200 +++ new/yamllint-1.26.3/yamllint.egg-info/requires.txt 2021-08-21 19:26:45.000000000 +0200 @@ -1,2 +1,3 @@ pathspec>=0.5.3 pyyaml +setuptools