Merge branch 'master' into master
This commit is contained in:
@@ -61,6 +61,30 @@ class ColonTestCase(RuleTestCase):
|
||||
' 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'
|
||||
|
||||
@@ -60,6 +60,29 @@ class ColonTestCase(RuleTestCase):
|
||||
' 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'
|
||||
|
||||
@@ -97,7 +97,7 @@ class CommentsTestCase(RuleTestCase):
|
||||
'#!/bin/env my-interpreter\n'
|
||||
'', conf,
|
||||
problem1=(1, 2), problem2=(3, 2), problem3=(4, 2))
|
||||
self.check('#! not a shebang\n',
|
||||
self.check('#! is a valid shebang too\n',
|
||||
conf, problem1=(1, 2))
|
||||
self.check('key: #!/not/a/shebang\n',
|
||||
conf, problem1=(1, 8))
|
||||
@@ -117,8 +117,7 @@ class CommentsTestCase(RuleTestCase):
|
||||
'#comment\n'
|
||||
'#!/bin/env my-interpreter\n', conf,
|
||||
problem2=(3, 2), problem3=(4, 2))
|
||||
self.check('#! not a shebang\n',
|
||||
conf, problem1=(1, 2))
|
||||
self.check('#! is a valid shebang too\n', conf)
|
||||
self.check('key: #!/not/a/shebang\n',
|
||||
conf, problem1=(1, 8))
|
||||
|
||||
|
||||
@@ -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 @@ class LineLengthTestCase(RuleTestCase):
|
||||
'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,18 +177,17 @@ class LineLengthTestCase(RuleTestCase):
|
||||
' {% 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'
|
||||
'# This is a test to check if “line-length” works nice\n'
|
||||
'with: “unicode characters” that span accross bytes! ↺\n',
|
||||
'with: “unicode characters” that span across bytes! ↺\n',
|
||||
conf)
|
||||
conf = 'line-length: {max: 52}'
|
||||
conf = 'line-length: {max: 51}'
|
||||
self.check('---\n'
|
||||
'# This is a test to check if “line-length” works nice\n'
|
||||
'with: “unicode characters” that span accross bytes! ↺\n',
|
||||
conf, problem1=(2, 53), problem2=(3, 53))
|
||||
'with: “unicode characters” that span across bytes! ↺\n',
|
||||
conf, problem1=(2, 52), problem2=(3, 52))
|
||||
|
||||
def test_with_dos_newlines(self):
|
||||
conf = ('line-length: {max: 10}\n'
|
||||
|
||||
@@ -436,3 +436,21 @@ class QuotedTestCase(RuleTestCase):
|
||||
'- 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))
|
||||
|
||||
@@ -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
|
||||
@@ -246,19 +243,19 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
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$'
|
||||
@@ -269,21 +266,21 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
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:
|
||||
@@ -300,6 +297,7 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
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')
|
||||
@@ -386,7 +384,7 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
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')
|
||||
@@ -395,7 +393,7 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
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')
|
||||
@@ -555,11 +553,13 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
with RunContext(self) as ctx:
|
||||
cli.run((path, '--format', 'github'))
|
||||
expected_out = (
|
||||
'::error file=%s,line=2,col=4::[trailing-spaces] trailing'
|
||||
'::group::%s\n'
|
||||
'::error file=%s,line=2,col=4::2:4 [trailing-spaces] trailing'
|
||||
' spaces\n'
|
||||
'::error file=%s,line=3,col=4::[new-line-at-end-of-file] no'
|
||||
'::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'
|
||||
% (path, path))
|
||||
'::endgroup::\n\n'
|
||||
% (path, path, path))
|
||||
self.assertEqual(
|
||||
(ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, ''))
|
||||
|
||||
@@ -573,11 +573,13 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
os.environ['GITHUB_WORKFLOW'] = 'something'
|
||||
cli.run((path, ))
|
||||
expected_out = (
|
||||
'::error file=%s,line=2,col=4::[trailing-spaces] trailing'
|
||||
'::group::%s\n'
|
||||
'::error file=%s,line=2,col=4::2:4 [trailing-spaces] trailing'
|
||||
' spaces\n'
|
||||
'::error file=%s,line=3,col=4::[new-line-at-end-of-file] no'
|
||||
'::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'
|
||||
% (path, path))
|
||||
'::endgroup::\n\n'
|
||||
% (path, path, path))
|
||||
self.assertEqual(
|
||||
(ctx.returncode, ctx.stdout, ctx.stderr), (1, expected_out, ''))
|
||||
|
||||
|
||||
@@ -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 @@ class SimpleConfigTestCase(unittest.TestCase):
|
||||
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 @@ class SimpleConfigTestCase(unittest.TestCase):
|
||||
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 @@ class SimpleConfigTestCase(unittest.TestCase):
|
||||
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 '):
|
||||
|
||||
@@ -47,16 +47,15 @@ class ModuleTestCase(unittest.TestCase):
|
||||
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(
|
||||
|
||||
Reference in New Issue
Block a user