|
12 | 12 | ... "baz"
|
13 | 13 | ... )
|
14 | 14 |
|
| 15 | +
|
15 | 16 | into this:
|
16 | 17 |
|
17 | 18 | >>> foo = ("bar " "baz")
|
18 | 19 |
|
19 | 20 | Black is not considering this as an
|
20 |
| -issue (see https://github.com/psf/black/issues/1051), so we are checking |
21 |
| -it here. |
| 21 | +issue (see issue https://github.com/psf/black/issues/1051), |
| 22 | +so we are checking it here. |
22 | 23 | """
|
23 | 24 |
|
24 | 25 | import os
|
25 | 26 | import sys
|
26 | 27 | import token
|
27 | 28 | import tokenize
|
| 29 | +from typing import FrozenSet, Generator, List |
28 | 30 |
|
29 |
| -# Can be annotated as typing.FrozenSet[str] |
30 |
| -FILE_EXTENSIONS_TO_CHECK = frozenset((".pxd", ".py", ".pyx", ".pyx.ini")) |
| 31 | +FILE_EXTENSIONS_TO_CHECK: FrozenSet[str] = frozenset( |
| 32 | + (".pxd", ".py", ".pyx", ".pyx.ini") |
| 33 | +) |
31 | 34 |
|
32 | 35 |
|
33 |
| -def is_concatenated(file_path): |
| 36 | +def strings_to_concatenate(file_path: str) -> Generator[str, None, None]: |
34 | 37 | """
|
35 |
| - Checking if the file containing strings that needs to be concatenated. |
| 38 | + Yielding the strings that needs to be concatenated in a given file. |
36 | 39 |
|
37 | 40 | Parameters
|
38 | 41 | ----------
|
39 | 42 | file_path : str
|
40 | 43 | File path pointing to a single file.
|
41 | 44 |
|
42 |
| - Returns |
43 |
| - ------- |
44 |
| - int |
45 |
| - Status code representing if the file needs a fix. |
46 |
| - 0 - All good. |
47 |
| - 1 - Needs to be fixed. |
| 45 | + Yields |
| 46 | + ------ |
| 47 | + str |
| 48 | + Message containing info about the string that needs to be concatenated. |
48 | 49 | """
|
49 |
| - need_fix = False |
50 | 50 | with open(file_path, "r") as file_name:
|
51 |
| - tokens = list(tokenize.generate_tokens(file_name.readline)) |
52 |
| - for current_token, next_token in zip(tokens, tokens[1:]): |
53 |
| - if current_token[0] == next_token[0] == token.STRING: |
54 |
| - need_fix = True |
55 |
| - print( |
56 |
| - "{file_path}:{line_number}:\t{start} and {end}".format( |
57 |
| - file_path=file_path, |
58 |
| - line_number=current_token[2][0], |
59 |
| - start=current_token[1], |
60 |
| - end=next_token[1], |
61 |
| - ) |
62 |
| - ) |
63 |
| - |
64 |
| - return int(need_fix) |
| 51 | + tokens: List = list(tokenize.generate_tokens(file_name.readline)) |
| 52 | + |
| 53 | + for current_token, next_token in zip(tokens, tokens[1:]): |
| 54 | + if current_token[0] == next_token[0] == token.STRING: |
| 55 | + line_number = current_token[2][0] |
| 56 | + start = current_token[1] |
| 57 | + end = next_token[1] |
| 58 | + yield f"{file_path}:{line_number}:\t between {start} and {end}\n" |
65 | 59 |
|
66 | 60 |
|
67 | 61 | if __name__ == "__main__":
|
68 |
| - path = sys.argv[1] |
| 62 | + path: str = sys.argv[1] |
69 | 63 |
|
70 | 64 | if not os.path.exists(path):
|
71 | 65 | raise ValueError("Please enter a valid path, to a file/directory.")
|
72 | 66 |
|
| 67 | + failed: bool = False |
| 68 | + |
73 | 69 | if os.path.isfile(path):
|
74 |
| - # Means that the given path is of a single file. |
75 |
| - sys.exit(is_concatenated(path)) |
| 70 | + for msg in strings_to_concatenate(path): |
| 71 | + if msg: |
| 72 | + failed = True |
| 73 | + print(msg) |
76 | 74 |
|
77 |
| - failures = 0 |
78 |
| - # Means that the given path is of a directory. |
79 | 75 | for subdir, _, files in os.walk(path):
|
80 | 76 | for file_name in files:
|
81 | 77 | if any(
|
82 | 78 | file_name.endswith(extension) for extension in FILE_EXTENSIONS_TO_CHECK
|
83 | 79 | ):
|
84 | 80 | file_extension = os.path.join(subdir, file_name)
|
85 |
| - failures += is_concatenated(os.path.join(subdir, file_name)) |
86 | 81 |
|
87 |
| - exit_code = 1 if failures >= 1 else 0 |
88 |
| - sys.exit(exit_code) |
| 82 | + for msg in strings_to_concatenate(os.path.join(subdir, file_name)): |
| 83 | + if msg: |
| 84 | + failed = True |
| 85 | + print(msg) |
| 86 | + sys.exit(failed) |
0 commit comments