Rules: Add the 'commas' rule
							parent
							
								
									cfea0661ed
								
							
						
					
					
						commit
						a5b384ab21
					
				| @ -0,0 +1,154 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # Copyright (C) 2016 Adrien Vergé | ||||
| # | ||||
| # This program is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # 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 tests.rules.common import RuleTestCase | ||||
| 
 | ||||
| 
 | ||||
| class CommaTestCase(RuleTestCase): | ||||
|     rule_id = 'commas' | ||||
| 
 | ||||
|     def test_disabled(self): | ||||
|         conf = 'commas: disable' | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b ,   c: "1 2 3",    d: e , f: [g,      h]}\n' | ||||
|                    'array: [\n' | ||||
|                    '  elem  ,\n' | ||||
|                    '  key: val ,\n' | ||||
|                    ']\n' | ||||
|                    'map: {\n' | ||||
|                    '  key1: val1 ,\n' | ||||
|                    '  key2: val2,\n' | ||||
|                    '}\n' | ||||
|                    '...\n', conf) | ||||
| 
 | ||||
|     def test_before_enabled(self): | ||||
|         conf = 'commas: {max-spaces-before: 0, max-spaces-after: -1}' | ||||
|         self.check('---\n' | ||||
|                    'array: [1, 2,  3, 4]\n' | ||||
|                    '...\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'array: [1, 2 ,  3, 4]\n' | ||||
|                    '...\n', conf, problem=(2, 13)) | ||||
|         self.check('---\n' | ||||
|                    'array: [1 , 2,  3      , 4]\n' | ||||
|                    '...\n', conf, problem1=(2, 10), problem2=(2, 23)) | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b, c: "1 2 3", d: e,  f: [g, h]}\n' | ||||
|                    '...\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b, c: "1 2 3" , d: e,  f: [g, h]}\n' | ||||
|                    '...\n', conf, problem=(2, 24)) | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b , c: "1 2 3", d: e,  f: [g    , h]}\n' | ||||
|                    '...\n', conf, problem1=(2, 12), problem2=(2, 42)) | ||||
|         self.check('---\n' | ||||
|                    'array: [\n' | ||||
|                    '  elem,\n' | ||||
|                    '  key: val,\n' | ||||
|                    ']\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'array: [\n' | ||||
|                    '  elem ,\n' | ||||
|                    '  key: val,\n' | ||||
|                    ']\n', conf, problem=(3, 7)) | ||||
|         self.check('---\n' | ||||
|                    'map: {\n' | ||||
|                    '  key1: val1,\n' | ||||
|                    '  key2: val2,\n' | ||||
|                    '}\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'map: {\n' | ||||
|                    '  key1: val1,\n' | ||||
|                    '  key2: val2 ,\n' | ||||
|                    '}\n', conf, problem=(4, 13)) | ||||
| 
 | ||||
|     def test_before_max(self): | ||||
|         conf = 'commas: {max-spaces-before: 3, max-spaces-after: -1}' | ||||
|         self.check('---\n' | ||||
|                    'array: [1 , 2, 3   , 4]\n' | ||||
|                    '...\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'array: [1 , 2, 3    , 4]\n' | ||||
|                    '...\n', conf, problem=(2, 20)) | ||||
|         self.check('---\n' | ||||
|                    'array: [\n' | ||||
|                    '  elem1   ,\n' | ||||
|                    '  elem2    ,\n' | ||||
|                    '  key: val,\n' | ||||
|                    ']\n', conf, problem=(4, 11)) | ||||
| 
 | ||||
|     def test_after_enabled(self): | ||||
|         conf = 'commas: {max-spaces-before: -1, max-spaces-after: 1}' | ||||
|         self.check('---\n' | ||||
|                    'array: [1, 2, 3, 4]\n' | ||||
|                    '...\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'array: [1, 2,  3, 4]\n' | ||||
|                    '...\n', conf, problem=(2, 15)) | ||||
|         self.check('---\n' | ||||
|                    'array: [1,  2, 3,     4]\n' | ||||
|                    '...\n', conf, problem1=(2, 12), problem2=(2, 22)) | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b , c: "1 2 3", d: e, f: [g, h]}\n' | ||||
|                    '...\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b , c: "1 2 3",  d: e, f: [g, h]}\n' | ||||
|                    '...\n', conf, problem=(2, 27)) | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b ,  c: "1 2 3", d: e, f: [g,     h]}\n' | ||||
|                    '...\n', conf, problem1=(2, 15), problem2=(2, 44)) | ||||
|         self.check('---\n' | ||||
|                    'array: [\n' | ||||
|                    '  elem,\n' | ||||
|                    '  key: val,\n' | ||||
|                    ']\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'array: [\n' | ||||
|                    '  elem,  key: val,\n' | ||||
|                    ']\n', conf, problem=(3, 9)) | ||||
|         self.check('---\n' | ||||
|                    'map: {\n' | ||||
|                    '  key1: val1,   key2: [val2,  val3]\n' | ||||
|                    '}\n', conf, problem1=(3, 16), problem2=(3, 30)) | ||||
| 
 | ||||
|     def test_after_max(self): | ||||
|         conf = 'commas: {max-spaces-before: -1, max-spaces-after: 3}' | ||||
|         self.check('---\n' | ||||
|                    'array: [1,  2, 3,   4]\n' | ||||
|                    '...\n', conf) | ||||
|         self.check('---\n' | ||||
|                    'array: [1,  2, 3,    4]\n' | ||||
|                    '...\n', conf, problem=(2, 21)) | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b ,   c: "1 2 3",    d: e, f: [g,      h]}\n' | ||||
|                    '...\n', conf, problem1=(2, 31), problem2=(2, 49)) | ||||
| 
 | ||||
|     def test_both_before_and_after(self): | ||||
|         conf = 'commas: {max-spaces-before: 0, max-spaces-after: 1}' | ||||
|         self.check('---\n' | ||||
|                    'dict: {a: b ,   c: "1 2 3",    d: e , f: [g,      h]}\n' | ||||
|                    'array: [\n' | ||||
|                    '  elem  ,\n' | ||||
|                    '  key: val ,\n' | ||||
|                    ']\n' | ||||
|                    'map: {\n' | ||||
|                    '  key1: val1 ,\n' | ||||
|                    '  key2: val2,\n' | ||||
|                    '}\n' | ||||
|                    '...\n', conf, | ||||
|                    problem1=(2, 12), problem2=(2, 16), problem3=(2, 31), | ||||
|                    problem4=(2, 36), problem5=(2, 50), problem6=(4, 8), | ||||
|                    problem7=(5, 11), problem8=(8, 13)) | ||||
| @ -0,0 +1,38 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # Copyright (C) 2016 Adrien Vergé | ||||
| # | ||||
| # This program is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation, either version 3 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # 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 yaml | ||||
| 
 | ||||
| from yamllint.rules.common import max_spaces_after, max_spaces_before | ||||
| 
 | ||||
| 
 | ||||
| ID = 'commas' | ||||
| TYPE = 'token' | ||||
| CONF = {'max-spaces-before': int, | ||||
|         'max-spaces-after': int} | ||||
| 
 | ||||
| 
 | ||||
| def check(conf, token, prev, next): | ||||
|     if isinstance(token, yaml.FlowEntryToken): | ||||
|         problem = max_spaces_before(conf['max-spaces-before'], token, prev, | ||||
|                                     next, 'too many spaces before comma') | ||||
|         if problem is not None: | ||||
|             yield problem | ||||
| 
 | ||||
|         problem = max_spaces_after(conf['max-spaces-after'], token, prev, next, | ||||
|                                    'too many spaces after comma') | ||||
|         if problem is not None: | ||||
|             yield problem | ||||
					Loading…
					
					
				
		Reference in New Issue