1# Copyright (c) 2016 Will Thames <will@thames.id.au>
2#
3# Permission is hereby granted, free of charge, to any person obtaining a copy
4# of this software and associated documentation files (the "Software"), to deal
5# in the Software without restriction, including without limitation the rights
6# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7# copies of the Software, and to permit persons to whom the Software is
8# furnished to do so, subject to the following conditions:
9#
10# The above copyright notice and this permission notice shall be included in
11# all copies or substantial portions of the Software.
12#
13# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19# THE SOFTWARE.
20
21from typing import TYPE_CHECKING, Any, Dict, Union
22
23from ansiblelint.rules import AnsibleLintRule
24
25if TYPE_CHECKING:
26    from typing import Optional
27
28    from ansiblelint.file_utils import Lintable
29
30
31class TaskHasNameRule(AnsibleLintRule):
32    id = 'unnamed-task'
33    shortdesc = 'All tasks should be named'
34    description = (
35        'All tasks should have a distinct name for readability '
36        'and for ``--start-at-task`` to work'
37    )
38    severity = 'MEDIUM'
39    tags = ['idiom']
40    version_added = 'historic'
41
42    def matchtask(
43        self, task: Dict[str, Any], file: 'Optional[Lintable]' = None
44    ) -> Union[bool, str]:
45        return not task.get('name')
46