Skip to content

Conversation

@pre-commit-ci
Copy link
Contributor

@pre-commit-ci pre-commit-ci bot commented Mar 12, 2024

@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from de4d6f3 to d8785ea Compare March 25, 2024 19:05
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from d8785ea to 34a3d5d Compare April 1, 2024 19:07
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from 34a3d5d to 54060a6 Compare April 8, 2024 19:21
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from 54060a6 to a91f388 Compare April 15, 2024 19:17
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from a91f388 to 152cef5 Compare April 22, 2024 19:07
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from 602a8a1 to d655c55 Compare May 6, 2024 19:13
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from b02e628 to ee24dd9 Compare May 20, 2024 19:00
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from ee24dd9 to f577f51 Compare May 27, 2024 19:08
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from f577f51 to 6db11d7 Compare June 3, 2024 19:15
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from 0eedc15 to 8c11f11 Compare June 17, 2024 19:13
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from 8c11f11 to 7d34356 Compare June 24, 2024 19:15
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from f7202fb to 580a23c Compare July 8, 2024 19:02
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from 5a16e44 to fd9a2c0 Compare July 22, 2024 19:23
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from fd9a2c0 to ce325a4 Compare July 29, 2024 19:23
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from ce325a4 to 71b53a1 Compare August 5, 2024 19:38
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from 19983f2 to 8356849 Compare September 2, 2024 19:21
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from 1a177d0 to 0a6992b Compare September 16, 2024 19:25
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from 0a6992b to aa8c54a Compare September 23, 2024 19:26
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from aa8c54a to c6bf605 Compare September 30, 2024 19:34
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from c6bf605 to 96af08c Compare October 7, 2024 20:19
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from 96af08c to 838f590 Compare August 25, 2025 17:52
@liblaf
Copy link
Contributor

liblaf bot commented Aug 25, 2025

⚠️MegaLinter analysis: Success with warnings

Descriptor Linter Files Fixed Errors Warnings Elapsed time
✅ BASH shellcheck 3 0 0 0.05s
✅ BASH shfmt 3 0 0 0 0.01s
⚠️ COPYPASTE jscpd yes 1 no 1.87s
✅ JSON prettier 9 0 0 0 0.36s
✅ JSON v8r 9 0 0 4.75s
⚠️ PYTHON ruff yes yes 100 no 1.41s
✅ REPOSITORY git_diff yes no no 0.02s
✅ SPELL cspell 48 0 0 3.75s
✅ YAML prettier 4 0 0 0 0.47s
✅ YAML v8r 4 0 0 4.28s
✅ YAML yamllint 4 0 0 0.42s

Detailed Issues

⚠️ COPYPASTE / jscpd - 1 error
Clone found (python):
 - src/thu_learn_downloader/download/downloader.py [162:10 - 173:5] (11 lines, 93 tokens)
   src/thu_learn_downloader/download/downloader.py [117:13 - 128:3]

┌────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐
│ Format │ Files analyzed │ Total lines │ Total tokens │ Clones found │ Duplicated lines │ Duplicated tokens │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ bash   │ 12             │ 281         │ 1834         │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ python │ 20             │ 1305        │ 10048        │ 1            │ 11 (0.84%)       │ 93 (0.93%)        │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ Total: │ 32             │ 1586        │ 11882        │ 1            │ 11 (0.69%)       │ 93 (0.78%)        │
└────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘
Found 1 clones.
HTML report saved to megalinter-reports/copy-paste/html/
ERROR: jscpd found too many duplicates (0.69%) over threshold (0%)
Error: ERROR: jscpd found too many duplicates (0.69%) over threshold (0%)
    at ThresholdReporter.report (/node-deps/node_modules/@jscpd/finder/dist/index.js:612:13)
    at /node-deps/node_modules/@jscpd/finder/dist/index.js:110:18
    at Array.forEach (<anonymous>)
    at /node-deps/node_modules/@jscpd/finder/dist/index.js:109:22
    at async /node-deps/node_modules/jscpd/dist/jscpd.js:351:5
⚠️ PYTHON / ruff - 100 errors
TRY301 Abstract `raise` to an inner function
  --> src/thu_learn_downloader/client/client.py:33:17
   |
31 |             token = self.cookies.get("XSRF-TOKEN")
32 |             if token is None:
33 |                 raise KeyError("XSRF-TOKEN not found in cookies")
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
34 |             return token
35 |         except KeyError as e:
   |

TRY003 Avoid specifying long messages outside the exception class
  --> src/thu_learn_downloader/client/client.py:33:23
   |
31 |             token = self.cookies.get("XSRF-TOKEN")
32 |             if token is None:
33 |                 raise KeyError("XSRF-TOKEN not found in cookies")
   |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
34 |             return token
35 |         except KeyError as e:
   |

EM101 Exception must not use a string literal, assign to variable first
  --> src/thu_learn_downloader/client/client.py:33:32
   |
31 |             token = self.cookies.get("XSRF-TOKEN")
32 |             if token is None:
33 |                 raise KeyError("XSRF-TOKEN not found in cookies")
   |                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
34 |             return token
35 |         except KeyError as e:
   |
help: Assign to variable; remove string literal

TRY300 Consider moving this statement to an `else` block
  --> src/thu_learn_downloader/client/client.py:34:13
   |
32 |             if token is None:
33 |                 raise KeyError("XSRF-TOKEN not found in cookies")
34 |             return token
   |             ^^^^^^^^^^^^
35 |         except KeyError as e:
36 |             print(f"无法获取CSRF token: {e}")
   |

TRY002 Create your own exception
  --> src/thu_learn_downloader/client/client.py:38:19
   |
36 |             print(f"无法获取CSRF token: {e}")
37 |             print(f"当前cookies: {list(self.cookies.keys())}")
38 |             raise Exception("登录状态可能已失效,请重新登录") from e
   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

EM101 Exception must not use a string literal, assign to variable first
  --> src/thu_learn_downloader/client/client.py:38:29
   |
36 |             print(f"无法获取CSRF token: {e}")
37 |             print(f"当前cookies: {list(self.cookies.keys())}")
38 |             raise Exception("登录状态可能已失效,请重新登录") from e
   |                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
help: Assign to variable; remove string literal

RUF001 String contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
  --> src/thu_learn_downloader/client/client.py:38:39
   |
36 |             print(f"无法获取CSRF token: {e}")
37 |             print(f"当前cookies: {list(self.cookies.keys())}")
38 |             raise Exception("登录状态可能已失效,请重新登录") from e
   |                                                ^^
   |

ANN201 Missing return type annotation for public function `get_course_issues`
  --> src/thu_learn_downloader/client/course.py:21:5
   |
21 | def get_course_issues():
   |     ^^^^^^^^^^^^^^^^^
22 |     """获取课程问题汇总"""
23 |     return _course_issues.copy()
   |
help: Add return type annotation

D415 First line should end with a period, question mark, or exclamation point
  --> src/thu_learn_downloader/client/course.py:22:5
   |
21 | def get_course_issues():
22 |     """获取课程问题汇总"""
   |     ^^^^^^^^^^^^^^^^^^^^^^
23 |     return _course_issues.copy()
   |
help: Add closing punctuation

ANN201 Missing return type annotation for public function `clear_course_issues`
  --> src/thu_learn_downloader/client/course.py:26:5
   |
26 | def clear_course_issues():
   |     ^^^^^^^^^^^^^^^^^^^
27 |     """清空课程问题记录"""
28 |     global _course_issues
   |
help: Add return type annotation: `None`

D415 First line should end with a period, question mark, or exclamation point
  --> src/thu_learn_downloader/client/course.py:27:5
   |
26 | def clear_course_issues():
27 |     """清空课程问题记录"""
   |     ^^^^^^^^^^^^^^^^^^^^^^
28 |     global _course_issues
29 |     _course_issues = {
   |
help: Add closing punctuation

PLW0603 Using the global statement to update `_course_issues` is discouraged
  --> src/thu_learn_downloader/client/course.py:28:12
   |
26 | def clear_course_issues():
27 |     """清空课程问题记录"""
28 |     global _course_issues
   |            ^^^^^^^^^^^^^^
29 |     _course_issues = {
30 |         "missing_documents": [],
   |

RUF003 Comment contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
  --> src/thu_learn_downloader/client/course.py:48:15
   |
46 |     @property
47 |     def document_classes(self) -> Sequence[DocumentClass]:
48 |         # 异常处理,记录问题
   |                   ^^
49 |         try:
50 |             response = self.client.get_with_token(
   |

F841 Local variable `json_data` is assigned to but never used
  --> src/thu_learn_downloader/client/course.py:54:13
   |
52 |                 params={"wlkcid": self.id},
53 |             )
54 |             json_data = response.json()["object"]["rows"]
   |             ^^^^^^^^^
55 |
56 |             return [
   |
help: Remove assignment to unused variable `json_data`

BLE001 Do not catch blind exception: `Exception`
  --> src/thu_learn_downloader/client/course.py:61:16
   |
59 |             ]
60 |
61 |         except Exception as e:
   |                ^^^^^^^^^
62 |             _course_issues["missing_document_classes"].append(
63 |                 {"course": self.name, "course_id": self.id, "reason": f"异常: {e!s}"}
   |

TRY300 Consider moving this statement to an `else` block
  --> src/thu_learn_downloader/client/course.py:82:13
   |
80 |             documents.sort(key=lambda document: document.title)
81 |             documents.sort(key=lambda document: document.upload_time)
82 |             return documents
   |             ^^^^^^^^^^^^^^^^
83 |
84 |         except Exception as e:
   |

BLE001 Do not catch blind exception: `Exception`
  --> src/thu_learn_downloader/client/course.py:84:16
   |
82 |             return documents
83 |
84 |         except Exception as e:
   |                ^^^^^^^^^
85 |             _course_issues["missing_documents"].append(
86 |                 {"course": self.name, "course_id": self.id, "reason": f"异常: {e!s}"}
   |

RUF003 Comment contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
   --> src/thu_learn_downloader/client/course.py:113:27
    |
111 |         ]
112 |
113 |         # 如果所有作业API都没有返回数据,记录该课程
    |                                        ^^
114 |         if not all_homeworks:
115 |             _course_issues["missing_homeworks"].append(
    |

RUF003 Comment contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
   --> src/thu_learn_downloader/client/course.py:127:27
    |
125 |             # 检查响应状态
126 |             if resp.status_code != 200:
127 |                 # 作业API失败时,只在所有作业API都失败时才记录
    |                                ^^
128 |                 return []
    |

BLE001 Do not catch blind exception: `Exception`
   --> src/thu_learn_downloader/client/course.py:148:16
    |
146 |             ]
147 |
148 |         except Exception:
    |                ^^^^^^^^^
149 |             return []
    |

TID252 Prefer absolute imports over relative imports from parent modules
  --> src/thu_learn_downloader/client/learn.py:18:9
   |
17 |     def login(self) -> None:
18 |         from ..login.browser import login_with_browser
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
19 |
20 |         try:
   |
help: Replace relative imports from parent modules with absolute imports

RUF003 Comment contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
  --> src/thu_learn_downloader/client/learn.py:27:23
   |
25 |                 self.client.cookies[name] = value
26 |
27 |             # 验证登录是否成功,尝试访问课程页面
   |                               ^^
28 |             response = self.client.get(
29 |                 url=url.make_url(path="/f/wlxt/index/course/student/")
   |

RUF001 String contains ambiguous `!` (FULLWIDTH EXCLAMATION MARK). Did you mean `!` (EXCLAMATION MARK)?
  --> src/thu_learn_downloader/client/learn.py:32:31
   |
30 |             )
31 |             if response.status_code == 200:
32 |                 print("浏览器登录成功!")
   |                                      ^^
33 |             else:
34 |                 raise Exception("登录验证失败,请重试")
   |

TRY301 Abstract `raise` to an inner function
  --> src/thu_learn_downloader/client/learn.py:34:17
   |
32 |                 print("浏览器登录成功!")
33 |             else:
34 |                 raise Exception("登录验证失败,请重试")
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
35 |
36 |         except Exception as e:
   |

TRY002 Create your own exception
  --> src/thu_learn_downloader/client/learn.py:34:23
   |
32 |                 print("浏览器登录成功!")
33 |             else:
34 |                 raise Exception("登录验证失败,请重试")
   |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
35 |
36 |         except Exception as e:
   |

EM101 Exception must not use a string literal, assign to variable first
  --> src/thu_learn_downloader/client/learn.py:34:33
   |
32 |                 print("浏览器登录成功!")
33 |             else:
34 |                 raise Exception("登录验证失败,请重试")
   |                                 ^^^^^^^^^^^^^^^^^^^^^^
35 |
36 |         except Exception as e:
   |
help: Assign to variable; remove string literal

RUF001 String contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
  --> src/thu_learn_downloader/client/learn.py:34:40
   |
32 |                 print("浏览器登录成功!")
33 |             else:
34 |                 raise Exception("登录验证失败,请重试")
   |                                              ^^
35 |
36 |         except Exception as e:
   |

BLE001 Do not catch blind exception: `Exception`
  --> src/thu_learn_downloader/client/learn.py:36:16
   |
34 |                 raise Exception("登录验证失败,请重试")
35 |
36 |         except Exception as e:
   |                ^^^^^^^^^
37 |             print(f"浏览器登录失败: {e}")
   |

RUF003 Comment contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
  --> src/thu_learn_downloader/client/learn.py:42:22
   |
40 |     #     """
41 |     #     登录方法
42 |     #     如果提供了用户名和密码,使用传统登录方式(保留兼容性)
   |                                 ^^
43 |     #     否则使用浏览器登录方式
44 |     #     """
   |

RUF003 Comment contains ambiguous `(` (FULLWIDTH LEFT PARENTHESIS). Did you mean `(` (LEFT PARENTHESIS)?
  --> src/thu_learn_downloader/client/learn.py:42:31
   |
40 |     #     """
41 |     #     登录方法
42 |     #     如果提供了用户名和密码,使用传统登录方式(保留兼容性)
   |                                                   ^^
43 |     #     否则使用浏览器登录方式
44 |     #     """
   |

RUF003 Comment contains ambiguous `)` (FULLWIDTH RIGHT PARENTHESIS). Did you mean `)` (RIGHT PARENTHESIS)?
  --> src/thu_learn_downloader/client/learn.py:42:37
   |
40 |     #     """
41 |     #     登录方法
42 |     #     如果提供了用户名和密码,使用传统登录方式(保留兼容性)
   |                                                               ^^
43 |     #     否则使用浏览器登录方式
44 |     #     """
   |

RUF003 Comment contains ambiguous `(` (FULLWIDTH LEFT PARENTHESIS). Did you mean `(` (LEFT PARENTHESIS)?
  --> src/thu_learn_downloader/client/learn.py:53:26
   |
52 |     # def _login_with_credentials(self, username: str, password: str) -> None:
53 |     #     """传统的用户名密码登录方式(保留作为备用)"""
   |                                      ^^
54 |     #     response: Response = self.client.get(url=url.make_url())
55 |     #     soup: BeautifulSoup = BeautifulSoup(
   |

RUF003 Comment contains ambiguous `)` (FULLWIDTH RIGHT PARENTHESIS). Did you mean `)` (RIGHT PARENTHESIS)?
  --> src/thu_learn_downloader/client/learn.py:53:33
   |
52 |     # def _login_with_credentials(self, username: str, password: str) -> None:
53 |     #     """传统的用户名密码登录方式(保留作为备用)"""
   |                                                    ^^
54 |     #     response: Response = self.client.get(url=url.make_url())
55 |     #     soup: BeautifulSoup = BeautifulSoup(
   |

ANN001 Missing type annotation for function argument `fragment`
  --> src/thu_learn_downloader/client/url.py:14:5
   |
12 |     path: str = "",
13 |     query: Mapping | None = None,
14 |     fragment="",
   |     ^^^^^^^^
15 | ) -> str:
16 |     query = query or {}
   |

ANN201 Missing return type annotation for public function `cast`
 --> src/thu_learn_downloader/common/typing.py:1:5
  |
1 | def cast(typ, val):
  |     ^^^^
2 |     assert isinstance(val, typ)
3 |     return val
  |
help: Add return type annotation

ANN001 Missing type annotation for function argument `typ`
 --> src/thu_learn_downloader/common/typing.py:1:10
  |
1 | def cast(typ, val):
  |          ^^^
2 |     assert isinstance(val, typ)
3 |     return val
  |

ANN001 Missing type annotation for function argument `val`
 --> src/thu_learn_downloader/common/typing.py:1:15
  |
1 | def cast(typ, val):
  |               ^^^
2 |     assert isinstance(val, typ)
3 |     return val
  |

ARG001 Unused function argument: `semester`
  --> src/thu_learn_downloader/download/description.py:8:5
   |
 7 | def document(
 8 |     semester: Semester,
   |     ^^^^^^^^
 9 |     course: Course,
10 |     document_class: DocumentClass,
   |

ARG001 Unused function argument: `document_class`
  --> src/thu_learn_downloader/download/description.py:10:5
   |
 8 |     semester: Semester,
 9 |     course: Course,
10 |     document_class: DocumentClass,
   |     ^^^^^^^^^^^^^^
11 |     document: Document,
12 |     index: int,
   |

ARG001 Unused function argument: `semester`
  --> src/thu_learn_downloader/download/description.py:21:5
   |
20 | def attachment(
21 |     semester: Semester, course: Course, homework: Homework, attachment: Attachment
   |     ^^^^^^^^
22 | ) -> str:
23 |     return (
   |

ANN001 Missing type annotation for function argument `exc_type`
  --> src/thu_learn_downloader/download/downloader.py:92:24
   |
90 |         return self
91 |
92 |     def __exit__(self, exc_type, exc_val, exc_tb) -> None:
   |                        ^^^^^^^^
93 |         self.executor.__exit__(exc_type, exc_val, exc_tb)
94 |         self.live.__exit__(exc_type, exc_val, exc_tb)
   |

ANN001 Missing type annotation for function argument `exc_val`
  --> src/thu_learn_downloader/download/downloader.py:92:34
   |
90 |         return self
91 |
92 |     def __exit__(self, exc_type, exc_val, exc_tb) -> None:
   |                                  ^^^^^^^
93 |         self.executor.__exit__(exc_type, exc_val, exc_tb)
94 |         self.live.__exit__(exc_type, exc_val, exc_tb)
   |

ANN001 Missing type annotation for function argument `exc_tb`
  --> src/thu_learn_downloader/download/downloader.py:92:43
   |
90 |         return self
91 |
92 |     def __exit__(self, exc_type, exc_val, exc_tb) -> None:
   |                                           ^^^^^^
93 |         self.executor.__exit__(exc_type, exc_val, exc_tb)
94 |         self.live.__exit__(exc_type, exc_val, exc_tb)
   |

PTH103 `os.makedirs()` should be replaced by `Path.mkdir(parents=True)`
   --> src/thu_learn_downloader/download/downloader.py:110:9
    |
108 |         self.progress_download.update(task_id=task_id, visible=True)
109 |         response: Response = client.get(url=url, stream=True)
110 |         os.makedirs(name=output.parent, exist_ok=True)
    |         ^^^^^^^^^^^
111 |         with output.open(mode="wb") as file:
112 |             for chunk in response.iter_content(chunk_size=8192):
    |
help: Replace with `Path(...).mkdir(parents=True)`

BLE001 Do not catch blind exception: `Exception`
   --> src/thu_learn_downloader/download/downloader.py:133:24
    |
131 |                 try:
132 |                     remote_size = int(response.headers["Content-Length"])
133 |                 except Exception:
    |                        ^^^^^^^^^
134 |                     remote_size = None
135 |             if remote_time is None:
    |

BLE001 Do not catch blind exception: `Exception`
   --> src/thu_learn_downloader/download/downloader.py:138:24
    |
136 |                 try:
137 |                     remote_time = dateutil.parser.parse(response.headers["Date"])
138 |                 except Exception:
    |                        ^^^^^^^^^
139 |                     remote_time = None
140 |         if (
    |

PTH103 `os.makedirs()` should be replaced by `Path.mkdir(parents=True)`
   --> src/thu_learn_downloader/download/downloader.py:298:9
    |
296 |             prefix=self.prefix, semester=semester, course=course, homework=homework
297 |         )
298 |         os.makedirs(readme_path.parent, exist_ok=True)
    |         ^^^^^^^^^^^
299 |         readme_path.write_text(homework.markdown)
300 |         for attachment in homework.attachments:
    |
help: Replace with `Path(...).mkdir(parents=True)`

D205 1 blank line required between summary line and description
  --> src/thu_learn_downloader/download/filename.py:11:5
   |
10 |   def sanitize_filename(filename: str) -> str:
11 | /     """输入: 文件名
12 | |     输出: 清理无效字符后的文件名,避免程序出错
13 | |     """
   | |_______^
14 |       # 定义Windows不允许的字符
15 |       invalid_chars = r'[<>:"|?*\\]'
   |
help: Insert single blank line

D415 First line should end with a period, question mark, or exclamation point
  --> src/thu_learn_downloader/download/filename.py:11:5
   |
10 |   def sanitize_filename(filename: str) -> str:
11 | /     """输入: 文件名
12 | |     输出: 清理无效字符后的文件名,避免程序出错
13 | |     """
   | |_______^
14 |       # 定义Windows不允许的字符
15 |       invalid_chars = r'[<>:"|?*\\]'
   |
help: Add closing punctuation

RUF002 Docstring contains ambiguous `:` (FULLWIDTH COLON). Did you mean `:` (COLON)?
  --> src/thu_learn_downloader/download/filename.py:11:10
   |
10 | def sanitize_filename(filename: str) -> str:
11 |     """输入: 文件名
   |            ^^
12 |     输出: 清理无效字符后的文件名,避免程序出错
13 |     """
   |

RUF002 Docstring contains ambiguous `:` (FULLWIDTH COLON). Did you mean `:` (COLON)?
  --> src/thu_learn_downloader/download/filename.py:12:7
   |
10 | def sanitize_filename(filename: str) -> str:
11 |     """输入: 文件名
12 |     输出: 清理无效字符后的文件名,避免程序出错
   |         ^^
13 |     """
14 |     # 定义Windows不允许的字符
   |

RUF002 Docstring contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
  --> src/thu_learn_downloader/download/filename.py:12:20
   |
10 | def sanitize_filename(filename: str) -> str:
11 |     """输入: 文件名
12 |     输出: 清理无效字符后的文件名,避免程序出错
   |                                  ^^
13 |     """
14 |     # 定义Windows不允许的字符
   |

RUF003 Comment contains ambiguous `(` (FULLWIDTH LEFT PARENTHESIS). Did you mean `(` (LEFT PARENTHESIS)?
  --> src/thu_learn_downloader/download/filename.py:20:13
   |
18 |     filename = re.sub(invalid_chars, "_", filename)
19 |
20 |     # 移除控制字符(ASCII 0-31)
   |                   ^^
21 |     filename = re.sub(r"[\x00-\x1f]", "", filename)
   |

RUF003 Comment contains ambiguous `)` (FULLWIDTH RIGHT PARENTHESIS). Did you mean `)` (RIGHT PARENTHESIS)?
  --> src/thu_learn_downloader/download/filename.py:20:24
   |
18 |     filename = re.sub(invalid_chars, "_", filename)
19 |
20 |     # 移除控制字符(ASCII 0-31)
   |                               ^^
21 |     filename = re.sub(r"[\x00-\x1f]", "", filename)
   |

RUF003 Comment contains ambiguous `,` (FULLWIDTH COMMA). Did you mean `,` (COMMA)?
  --> src/thu_learn_downloader/download/filename.py:26:22
   |
24 |     filename = filename.strip(" .")
25 |
26 |     # 如果文件名为空或只包含无效字符,使用默认名称
   |                                     ^^
27 |     if not filename:
28 |         filename = "untitled"
   |

S110 `try`-`except`-`pass` detected, consider logging the exception
  --> src/thu_learn_downloader/login/auto.py:9:5
   |
 7 |           if username:
 8 |               return username
 9 | /     except Exception:
10 | |         pass
   | |____________^
11 |       return ""
   |

BLE001 Do not catch blind exception: `Exception`
  --> src/thu_learn_downloader/login/auto.py:9:12
   |
 7 |         if username:
 8 |             return username
 9 |     except Exception:
   |            ^^^^^^^^^
10 |         pass

(Truncated to 20000 characters out of 35401)

See detailed reports in MegaLinter artifacts

MegaLinter is graciously provided by OX Security

@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from 838f590 to b3659af Compare September 1, 2025 17:53
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from b3659af to b71cd2f Compare September 8, 2025 17:56
@codecov
Copy link

codecov bot commented Sep 8, 2025

⚠️ File not in storage

No result to display due to the CLI not being able to find the file.
Please ensure the file contains junit in the name and automated file search is enabled,
or the desired file specified by the file and search_dir arguments of the CLI.

@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch from 8e44cbe to 496271b Compare September 15, 2025 17:57
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from 6865e94 to f42f72d Compare September 29, 2025 17:50
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from a2107ae to d9ddcfd Compare October 13, 2025 18:03
@pre-commit-ci pre-commit-ci bot force-pushed the pre-commit-ci-update-config branch 2 times, most recently from a7b47eb to d5abdfb Compare October 27, 2025 17:52
@liblaf liblaf removed yaml labels Nov 2, 2025
liblaf
liblaf previously approved these changes Nov 2, 2025
liblaf
liblaf previously approved these changes Nov 4, 2025
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.14.1 → v0.14.4](astral-sh/ruff-pre-commit@v0.14.1...v0.14.4)
- [github.com/biomejs/pre-commit: v2.2.6 → v2.3.4](biomejs/pre-commit@v2.2.6...v2.3.4)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants