We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Incorrect error message when over-using empty string
# Bug report

<!--
Hi, thanks for submitting a bug. We appreciate that.

But, we will need some information about what's wrong to help you.
-->

## What's wrong

Right now:

> hooks/post_gen_project.py:0:1: Z226 Found string constant over-use: 

## How is that should be

> hooks/post_gen_project.py:0:1: Z226 Found string constant over-use: ''

I am using `0.10`

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `wemake_python_styleguide/visitors/ast/builtins.py`
Content:
```
1 # -*- coding: utf-8 -*-
2 
3 import ast
4 from collections import Counter, defaultdict
5 from typing import ClassVar, DefaultDict, Iterable, List, Mapping
6 
7 import astor
8 from typing_extensions import final
9 
10 from wemake_python_styleguide import constants
11 from wemake_python_styleguide.logic.operators import (
12     count_unary_operator,
13     get_parent_ignoring_unary,
14     unwrap_unary_node,
15 )
16 from wemake_python_styleguide.types import AnyNodes, AnyUnaryOp
17 from wemake_python_styleguide.violations.best_practices import (
18     MagicNumberViolation,
19     MultipleAssignmentsViolation,
20     NonUniqueItemsInSetViolation,
21     WrongUnpackingViolation,
22 )
23 from wemake_python_styleguide.violations.complexity import (
24     OverusedStringViolation,
25 )
26 from wemake_python_styleguide.violations.consistency import (
27     FormattedStringViolation,
28     UselessOperatorsViolation,
29 )
30 from wemake_python_styleguide.visitors.base import BaseNodeVisitor
31 
32 
33 @final
34 class WrongStringVisitor(BaseNodeVisitor):
35     """Restricts several string usages."""
36 
37     def __init__(self, *args, **kwargs) -> None:
38         """Inits the counter for constants."""
39         super().__init__(*args, **kwargs)
40         self._string_constants: DefaultDict[str, int] = defaultdict(int)
41 
42     def _check_string_constant(self, node: ast.Str) -> None:
43         self._string_constants[node.s] += 1
44 
45     def _post_visit(self) -> None:
46         for string, usage_count in self._string_constants.items():
47             if usage_count > self.options.max_string_usages:
48                 self.add_violation(OverusedStringViolation(text=string))
49 
50     def visit_Str(self, node: ast.Str) -> None:
51         """
52         Restricts to over-use string constants.
53 
54         Raises:
55             OverusedStringViolation
56 
57         """
58         self._check_string_constant(node)
59         self.generic_visit(node)
60 
61     def visit_JoinedStr(self, node: ast.JoinedStr) -> None:
62         """
63         Restricts to use ``f`` strings.
64 
65         Raises:
66             FormattedStringViolation
67 
68         """
69         self.add_violation(FormattedStringViolation(node))
70         self.generic_visit(node)
71 
72 
73 @final
74 class MagicNumberVisitor(BaseNodeVisitor):
75     """Checks magic numbers used in the code."""
76 
77     _allowed_parents: ClassVar[AnyNodes] = (
78         ast.Assign,
79         ast.AnnAssign,
80 
81         # Constructor usages:
82         ast.FunctionDef,
83         ast.AsyncFunctionDef,
84         ast.arguments,
85 
86         # Primitives:
87         ast.List,
88         ast.Dict,
89         ast.Set,
90         ast.Tuple,
91     )
92 
93     def _check_is_magic(self, node: ast.Num) -> None:
94         parent = get_parent_ignoring_unary(node)
95         if isinstance(parent, self._allowed_parents):
96             return
97 
98         if node.n in constants.MAGIC_NUMBERS_WHITELIST:
99             return
100 
101         if isinstance(node.n, int) and node.n <= constants.NON_MAGIC_MODULO:
102             return
103 
104         self.add_violation(MagicNumberViolation(node, text=str(node.n)))
105 
106     def visit_Num(self, node: ast.Num) -> None:
107         """
108         Checks numbers not to be magic constants inside the code.
109 
110         Raises:
111             MagicNumberViolation
112 
113         """
114         self._check_is_magic(node)
115         self.generic_visit(node)
116 
117 
118 @final
119 class UselessOperatorsVisitor(BaseNodeVisitor):
120     """Checks operators used in the code."""
121 
122     _limits: ClassVar[Mapping[AnyUnaryOp, int]] = {
123         ast.UAdd: 0,
124         ast.Invert: 1,
125         ast.Not: 1,
126         ast.USub: 1,
127     }
128 
129     def _check_operator_count(self, node: ast.Num) -> None:
130         for node_type, limit in self._limits.items():
131             if count_unary_operator(node, node_type) > limit:
132                 self.add_violation(
133                     UselessOperatorsViolation(node, text=str(node.n)),
134                 )
135 
136     def visit_Num(self, node: ast.Num) -> None:
137         """
138         Checks numbers unnecessary operators inside the code.
139 
140         Raises:
141             UselessOperatorsViolation
142 
143         """
144         self._check_operator_count(node)
145         self.generic_visit(node)
146 
147 
148 @final
149 class WrongAssignmentVisitor(BaseNodeVisitor):
150     """Visits all assign nodes."""
151 
152     def _check_assign_targets(self, node: ast.Assign) -> None:
153         if len(node.targets) > 1:
154             self.add_violation(MultipleAssignmentsViolation(node))
155 
156     def _check_unpacking_targets(
157         self,
158         node: ast.AST,
159         targets: Iterable[ast.AST],
160     ) -> None:
161         for target in targets:
162             if isinstance(target, ast.Starred):
163                 target = target.value
164             if not isinstance(target, ast.Name):
165                 self.add_violation(WrongUnpackingViolation(node))
166 
167     def visit_With(self, node: ast.With) -> None:
168         """
169         Checks assignments inside context managers to be correct.
170 
171         Raises:
172             WrongUnpackingViolation
173 
174         """
175         for withitem in node.items:
176             if isinstance(withitem.optional_vars, ast.Tuple):
177                 self._check_unpacking_targets(
178                     node, withitem.optional_vars.elts,
179                 )
180         self.generic_visit(node)
181 
182     def visit_For(self, node: ast.For) -> None:
183         """
184         Checks assignments inside ``for`` loops to be correct.
185 
186         Raises:
187             WrongUnpackingViolation
188 
189         """
190         if isinstance(node.target, ast.Tuple):
191             self._check_unpacking_targets(node, node.target.elts)
192         self.generic_visit(node)
193 
194     def visit_Assign(self, node: ast.Assign) -> None:
195         """
196         Checks assignments to be correct.
197 
198         Raises:
199             MultipleAssignmentsViolation
200             WrongUnpackingViolation
201 
202         """
203         self._check_assign_targets(node)
204         if isinstance(node.targets[0], ast.Tuple):
205             self._check_unpacking_targets(node, node.targets[0].elts)
206         self.generic_visit(node)
207 
208 
209 @final
210 class WrongCollectionVisitor(BaseNodeVisitor):
211     """Ensures that collection definitions are correct."""
212 
213     _elements_in_sets: ClassVar[AnyNodes] = (
214         ast.Str,
215         ast.Bytes,
216         ast.Num,
217         ast.NameConstant,
218         ast.Name,
219     )
220 
221     def _report_set_elements(self, node: ast.Set, elements: List[str]) -> None:
222         for element, count in Counter(elements).items():
223             if count > 1:
224                 self.add_violation(
225                     NonUniqueItemsInSetViolation(node, text=element),
226                 )
227 
228     def _check_set_elements(self, node: ast.Set) -> None:
229         elements: List[str] = []
230         for set_item in node.elts:
231             real_set_item = unwrap_unary_node(set_item)
232             if isinstance(real_set_item, self._elements_in_sets):
233                 source = astor.to_source(set_item)
234                 elements.append(source.strip().strip('(').strip(')'))
235         self._report_set_elements(node, elements)
236 
237     def visit_Set(self, node: ast.Set) -> None:
238         """
239         Ensures that set literals do not have any duplicate items.
240 
241         Raises:
242             NonUniqueItemsInSetViolation
243 
244         """
245         self._check_set_elements(node)
246         self.generic_visit(node)
247
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/wemake_python_styleguide/visitors/ast/builtins.py b/wemake_python_styleguide/visitors/ast/builtins.py
--- a/wemake_python_styleguide/visitors/ast/builtins.py
+++ b/wemake_python_styleguide/visitors/ast/builtins.py
@@ -45,7 +45,7 @@
     def _post_visit(self) -> None:
         for string, usage_count in self._string_constants.items():
             if usage_count > self.options.max_string_usages:
-                self.add_violation(OverusedStringViolation(text=string))
+                self.add_violation(OverusedStringViolation(text=string or "''"))
 
     def visit_Str(self, node: ast.Str) -> None:
         """

{"golden_diff": "diff --git a/wemake_python_styleguide/visitors/ast/builtins.py b/wemake_python_styleguide/visitors/ast/builtins.py\n--- a/wemake_python_styleguide/visitors/ast/builtins.py\n+++ b/wemake_python_styleguide/visitors/ast/builtins.py\n@@ -45,7 +45,7 @@\n     def _post_visit(self) -> None:\n         for string, usage_count in self._string_constants.items():\n             if usage_count > self.options.max_string_usages:\n-                self.add_violation(OverusedStringViolation(text=string))\n+                self.add_violation(OverusedStringViolation(text=string or \"''\"))\n \n     def visit_Str(self, node: ast.Str) -> None:\n         \"\"\"\n", "issue": "Incorrect error message when over-using empty string\n# Bug report\r\n\r\n<!--\r\nHi, thanks for submitting a bug. We appreciate that.\r\n\r\nBut, we will need some information about what's wrong to help you.\r\n-->\r\n\r\n## What's wrong\r\n\r\nRight now:\r\n\r\n> hooks/post_gen_project.py:0:1: Z226 Found string constant over-use: \r\n\r\n## How is that should be\r\n\r\n> hooks/post_gen_project.py:0:1: Z226 Found string constant over-use: ''\r\n\r\nI am using `0.10`\n", "before_files": [{"content": "# -*- coding: utf-8 -*-\n\nimport ast\nfrom collections import Counter, defaultdict\nfrom typing import ClassVar, DefaultDict, Iterable, List, Mapping\n\nimport astor\nfrom typing_extensions import final\n\nfrom wemake_python_styleguide import constants\nfrom wemake_python_styleguide.logic.operators import (\n    count_unary_operator,\n    get_parent_ignoring_unary,\n    unwrap_unary_node,\n)\nfrom wemake_python_styleguide.types import AnyNodes, AnyUnaryOp\nfrom wemake_python_styleguide.violations.best_practices import (\n    MagicNumberViolation,\n    MultipleAssignmentsViolation,\n    NonUniqueItemsInSetViolation,\n    WrongUnpackingViolation,\n)\nfrom wemake_python_styleguide.violations.complexity import (\n    OverusedStringViolation,\n)\nfrom wemake_python_styleguide.violations.consistency import (\n    FormattedStringViolation,\n    UselessOperatorsViolation,\n)\nfrom wemake_python_styleguide.visitors.base import BaseNodeVisitor\n\n\n@final\nclass WrongStringVisitor(BaseNodeVisitor):\n    \"\"\"Restricts several string usages.\"\"\"\n\n    def __init__(self, *args, **kwargs) -> None:\n        \"\"\"Inits the counter for constants.\"\"\"\n        super().__init__(*args, **kwargs)\n        self._string_constants: DefaultDict[str, int] = defaultdict(int)\n\n    def _check_string_constant(self, node: ast.Str) -> None:\n        self._string_constants[node.s] += 1\n\n    def _post_visit(self) -> None:\n        for string, usage_count in self._string_constants.items():\n            if usage_count > self.options.max_string_usages:\n                self.add_violation(OverusedStringViolation(text=string))\n\n    def visit_Str(self, node: ast.Str) -> None:\n        \"\"\"\n        Restricts to over-use string constants.\n\n        Raises:\n            OverusedStringViolation\n\n        \"\"\"\n        self._check_string_constant(node)\n        self.generic_visit(node)\n\n    def visit_JoinedStr(self, node: ast.JoinedStr) -> None:\n        \"\"\"\n        Restricts to use ``f`` strings.\n\n        Raises:\n            FormattedStringViolation\n\n        \"\"\"\n        self.add_violation(FormattedStringViolation(node))\n        self.generic_visit(node)\n\n\n@final\nclass MagicNumberVisitor(BaseNodeVisitor):\n    \"\"\"Checks magic numbers used in the code.\"\"\"\n\n    _allowed_parents: ClassVar[AnyNodes] = (\n        ast.Assign,\n        ast.AnnAssign,\n\n        # Constructor usages:\n        ast.FunctionDef,\n        ast.AsyncFunctionDef,\n        ast.arguments,\n\n        # Primitives:\n        ast.List,\n        ast.Dict,\n        ast.Set,\n        ast.Tuple,\n    )\n\n    def _check_is_magic(self, node: ast.Num) -> None:\n        parent = get_parent_ignoring_unary(node)\n        if isinstance(parent, self._allowed_parents):\n            return\n\n        if node.n in constants.MAGIC_NUMBERS_WHITELIST:\n            return\n\n        if isinstance(node.n, int) and node.n <= constants.NON_MAGIC_MODULO:\n            return\n\n        self.add_violation(MagicNumberViolation(node, text=str(node.n)))\n\n    def visit_Num(self, node: ast.Num) -> None:\n        \"\"\"\n        Checks numbers not to be magic constants inside the code.\n\n        Raises:\n            MagicNumberViolation\n\n        \"\"\"\n        self._check_is_magic(node)\n        self.generic_visit(node)\n\n\n@final\nclass UselessOperatorsVisitor(BaseNodeVisitor):\n    \"\"\"Checks operators used in the code.\"\"\"\n\n    _limits: ClassVar[Mapping[AnyUnaryOp, int]] = {\n        ast.UAdd: 0,\n        ast.Invert: 1,\n        ast.Not: 1,\n        ast.USub: 1,\n    }\n\n    def _check_operator_count(self, node: ast.Num) -> None:\n        for node_type, limit in self._limits.items():\n            if count_unary_operator(node, node_type) > limit:\n                self.add_violation(\n                    UselessOperatorsViolation(node, text=str(node.n)),\n                )\n\n    def visit_Num(self, node: ast.Num) -> None:\n        \"\"\"\n        Checks numbers unnecessary operators inside the code.\n\n        Raises:\n            UselessOperatorsViolation\n\n        \"\"\"\n        self._check_operator_count(node)\n        self.generic_visit(node)\n\n\n@final\nclass WrongAssignmentVisitor(BaseNodeVisitor):\n    \"\"\"Visits all assign nodes.\"\"\"\n\n    def _check_assign_targets(self, node: ast.Assign) -> None:\n        if len(node.targets) > 1:\n            self.add_violation(MultipleAssignmentsViolation(node))\n\n    def _check_unpacking_targets(\n        self,\n        node: ast.AST,\n        targets: Iterable[ast.AST],\n    ) -> None:\n        for target in targets:\n            if isinstance(target, ast.Starred):\n                target = target.value\n            if not isinstance(target, ast.Name):\n                self.add_violation(WrongUnpackingViolation(node))\n\n    def visit_With(self, node: ast.With) -> None:\n        \"\"\"\n        Checks assignments inside context managers to be correct.\n\n        Raises:\n            WrongUnpackingViolation\n\n        \"\"\"\n        for withitem in node.items:\n            if isinstance(withitem.optional_vars, ast.Tuple):\n                self._check_unpacking_targets(\n                    node, withitem.optional_vars.elts,\n                )\n        self.generic_visit(node)\n\n    def visit_For(self, node: ast.For) -> None:\n        \"\"\"\n        Checks assignments inside ``for`` loops to be correct.\n\n        Raises:\n            WrongUnpackingViolation\n\n        \"\"\"\n        if isinstance(node.target, ast.Tuple):\n            self._check_unpacking_targets(node, node.target.elts)\n        self.generic_visit(node)\n\n    def visit_Assign(self, node: ast.Assign) -> None:\n        \"\"\"\n        Checks assignments to be correct.\n\n        Raises:\n            MultipleAssignmentsViolation\n            WrongUnpackingViolation\n\n        \"\"\"\n        self._check_assign_targets(node)\n        if isinstance(node.targets[0], ast.Tuple):\n            self._check_unpacking_targets(node, node.targets[0].elts)\n        self.generic_visit(node)\n\n\n@final\nclass WrongCollectionVisitor(BaseNodeVisitor):\n    \"\"\"Ensures that collection definitions are correct.\"\"\"\n\n    _elements_in_sets: ClassVar[AnyNodes] = (\n        ast.Str,\n        ast.Bytes,\n        ast.Num,\n        ast.NameConstant,\n        ast.Name,\n    )\n\n    def _report_set_elements(self, node: ast.Set, elements: List[str]) -> None:\n        for element, count in Counter(elements).items():\n            if count > 1:\n                self.add_violation(\n                    NonUniqueItemsInSetViolation(node, text=element),\n                )\n\n    def _check_set_elements(self, node: ast.Set) -> None:\n        elements: List[str] = []\n        for set_item in node.elts:\n            real_set_item = unwrap_unary_node(set_item)\n            if isinstance(real_set_item, self._elements_in_sets):\n                source = astor.to_source(set_item)\n                elements.append(source.strip().strip('(').strip(')'))\n        self._report_set_elements(node, elements)\n\n    def visit_Set(self, node: ast.Set) -> None:\n        \"\"\"\n        Ensures that set literals do not have any duplicate items.\n\n        Raises:\n            NonUniqueItemsInSetViolation\n\n        \"\"\"\n        self._check_set_elements(node)\n        self.generic_visit(node)\n", "path": "wemake_python_styleguide/visitors/ast/builtins.py"}], "after_files": [{"content": "# -*- coding: utf-8 -*-\n\nimport ast\nfrom collections import Counter, defaultdict\nfrom typing import ClassVar, DefaultDict, Iterable, List, Mapping\n\nimport astor\nfrom typing_extensions import final\n\nfrom wemake_python_styleguide import constants\nfrom wemake_python_styleguide.logic.operators import (\n    count_unary_operator,\n    get_parent_ignoring_unary,\n    unwrap_unary_node,\n)\nfrom wemake_python_styleguide.types import AnyNodes, AnyUnaryOp\nfrom wemake_python_styleguide.violations.best_practices import (\n    IncorrectUnpackingViolation,\n    MagicNumberViolation,\n    MultipleAssignmentsViolation,\n    NonUniqueItemsInSetViolation,\n)\nfrom wemake_python_styleguide.violations.complexity import (\n    OverusedStringViolation,\n)\nfrom wemake_python_styleguide.violations.consistency import (\n    FormattedStringViolation,\n    UselessOperatorsViolation,\n)\nfrom wemake_python_styleguide.visitors.base import BaseNodeVisitor\n\n\n@final\nclass WrongStringVisitor(BaseNodeVisitor):\n    \"\"\"Restricts several string usages.\"\"\"\n\n    def __init__(self, *args, **kwargs) -> None:\n        \"\"\"Inits the counter for constants.\"\"\"\n        super().__init__(*args, **kwargs)\n        self._string_constants: DefaultDict[str, int] = defaultdict(int)\n\n    def _check_string_constant(self, node: ast.Str) -> None:\n        self._string_constants[node.s] += 1\n\n    def _post_visit(self) -> None:\n        for string, usage_count in self._string_constants.items():\n            if usage_count > self.options.max_string_usages:\n                self.add_violation(OverusedStringViolation(text=string or \"''\"))\n\n    def visit_Str(self, node: ast.Str) -> None:\n        \"\"\"\n        Restricts to over-use string constants.\n\n        Raises:\n            OverusedStringViolation\n\n        \"\"\"\n        self._check_string_constant(node)\n        self.generic_visit(node)\n\n    def visit_JoinedStr(self, node: ast.JoinedStr) -> None:\n        \"\"\"\n        Restricts to use ``f`` strings.\n\n        Raises:\n            FormattedStringViolation\n\n        \"\"\"\n        self.add_violation(FormattedStringViolation(node))\n        self.generic_visit(node)\n\n\n@final\nclass MagicNumberVisitor(BaseNodeVisitor):\n    \"\"\"Checks magic numbers used in the code.\"\"\"\n\n    _allowed_parents: ClassVar[AnyNodes] = (\n        ast.Assign,\n        ast.AnnAssign,\n\n        # Constructor usages:\n        ast.FunctionDef,\n        ast.AsyncFunctionDef,\n        ast.arguments,\n\n        # Primitives:\n        ast.List,\n        ast.Dict,\n        ast.Set,\n        ast.Tuple,\n    )\n\n    def _check_is_magic(self, node: ast.Num) -> None:\n        parent = get_parent_ignoring_unary(node)\n        if isinstance(parent, self._allowed_parents):\n            return\n\n        if node.n in constants.MAGIC_NUMBERS_WHITELIST:\n            return\n\n        if isinstance(node.n, int) and node.n <= constants.NON_MAGIC_MODULO:\n            return\n\n        self.add_violation(MagicNumberViolation(node, text=str(node.n)))\n\n    def visit_Num(self, node: ast.Num) -> None:\n        \"\"\"\n        Checks numbers not to be magic constants inside the code.\n\n        Raises:\n            MagicNumberViolation\n\n        \"\"\"\n        self._check_is_magic(node)\n        self.generic_visit(node)\n\n\n@final\nclass UselessOperatorsVisitor(BaseNodeVisitor):\n    \"\"\"Checks operators used in the code.\"\"\"\n\n    _limits: ClassVar[Mapping[AnyUnaryOp, int]] = {\n        ast.UAdd: 0,\n        ast.Invert: 1,\n        ast.Not: 1,\n        ast.USub: 1,\n    }\n\n    def _check_operator_count(self, node: ast.Num) -> None:\n        for node_type, limit in self._limits.items():\n            if count_unary_operator(node, node_type) > limit:\n                self.add_violation(\n                    UselessOperatorsViolation(node, text=str(node.n)),\n                )\n\n    def visit_Num(self, node: ast.Num) -> None:\n        \"\"\"\n        Checks numbers unnecessary operators inside the code.\n\n        Raises:\n            UselessOperatorsViolation\n\n        \"\"\"\n        self._check_operator_count(node)\n        self.generic_visit(node)\n\n\n@final\nclass WrongAssignmentVisitor(BaseNodeVisitor):\n    \"\"\"Visits all assign nodes.\"\"\"\n\n    def _check_assign_targets(self, node: ast.Assign) -> None:\n        if len(node.targets) > 1:\n            self.add_violation(MultipleAssignmentsViolation(node))\n\n    def _check_unpacking_targets(\n        self,\n        node: ast.AST,\n        targets: Iterable[ast.AST],\n    ) -> None:\n        for target in targets:\n            if isinstance(target, ast.Starred):\n                target = target.value\n            if not isinstance(target, ast.Name):\n                self.add_violation(IncorrectUnpackingViolation(node))\n\n    def visit_With(self, node: ast.With) -> None:\n        \"\"\"\n        Checks assignments inside context managers to be correct.\n\n        Raises:\n            IncorrectUnpackingViolation\n\n        \"\"\"\n        for withitem in node.items:\n            if isinstance(withitem.optional_vars, ast.Tuple):\n                self._check_unpacking_targets(\n                    node, withitem.optional_vars.elts,\n                )\n        self.generic_visit(node)\n\n    def visit_For(self, node: ast.For) -> None:\n        \"\"\"\n        Checks assignments inside ``for`` loops to be correct.\n\n        Raises:\n            IncorrectUnpackingViolation\n\n        \"\"\"\n        if isinstance(node.target, ast.Tuple):\n            self._check_unpacking_targets(node, node.target.elts)\n        self.generic_visit(node)\n\n    def visit_Assign(self, node: ast.Assign) -> None:\n        \"\"\"\n        Checks assignments to be correct.\n\n        Raises:\n            MultipleAssignmentsViolation\n            IncorrectUnpackingViolation\n\n        \"\"\"\n        self._check_assign_targets(node)\n        if isinstance(node.targets[0], ast.Tuple):\n            self._check_unpacking_targets(node, node.targets[0].elts)\n        self.generic_visit(node)\n\n\n@final\nclass WrongCollectionVisitor(BaseNodeVisitor):\n    \"\"\"Ensures that collection definitions are correct.\"\"\"\n\n    _elements_in_sets: ClassVar[AnyNodes] = (\n        ast.Str,\n        ast.Bytes,\n        ast.Num,\n        ast.NameConstant,\n        ast.Name,\n    )\n\n    def _report_set_elements(self, node: ast.Set, elements: List[str]) -> None:\n        for element, count in Counter(elements).items():\n            if count > 1:\n                self.add_violation(\n                    NonUniqueItemsInSetViolation(node, text=element),\n                )\n\n    def _check_set_elements(self, node: ast.Set) -> None:\n        elements: List[str] = []\n        for set_item in node.elts:\n            real_set_item = unwrap_unary_node(set_item)\n            if isinstance(real_set_item, self._elements_in_sets):\n                source = astor.to_source(set_item)\n                elements.append(source.strip().strip('(').strip(')'))\n        self._report_set_elements(node, elements)\n\n    def visit_Set(self, node: ast.Set) -> None:\n        \"\"\"\n        Ensures that set literals do not have any duplicate items.\n\n        Raises:\n            NonUniqueItemsInSetViolation\n\n        \"\"\"\n        self._check_set_elements(node)\n        self.generic_visit(node)\n", "path": "wemake_python_styleguide/visitors/ast/builtins.py"}]}