Skip to content

Conversation

@copier-update
Copy link

@copier-update copier-update bot commented Nov 2, 2025

Automated changes by Bot > Copier Update Workflow

liblaf
liblaf previously approved these changes Nov 2, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Nov 2, 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.85s
⚠️ JSON jsonlint 9 1 0 0.15s
✅ JSON prettier 9 0 0 0 0.34s
✅ JSON v8r 9 0 0 4.39s
⚠️ PYTHON ruff yes yes 100 no 1.55s
✅ REPOSITORY git_diff yes no no 0.25s
✅ SPELL cspell 48 0 0 3.66s
✅ YAML prettier 4 0 0 0 0.41s
✅ YAML v8r 4 0 0 4.26s
✅ 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             │ 272         │ 1739         │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ python │ 20             │ 1305        │ 10048        │ 1            │ 11 (0.84%)       │ 93 (0.93%)        │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ Total: │ 32             │ 1577        │ 11787        │ 1            │ 11 (0.7%)        │ 93 (0.79%)        │
└────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘
Found 1 clones.
HTML report saved to megalinter-reports/copy-paste/html/
ERROR: jscpd found too many duplicates (0.7%) over threshold (0%)
Error: ERROR: jscpd found too many duplicates (0.7%) 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
⚠️ JSON / jsonlint - 1 error
File: .vscode/settings.json
Parse error on line 17, column 5:
....customTags": [    // ref: <https://squ...
----------------------^
Unexpected token "/"
⚠️ 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,

(Truncated to 13333 characters out of 35401)

See detailed reports in MegaLinter artifacts

MegaLinter is graciously provided by OX Security

@liblaf liblaf bot force-pushed the copier-update branch from 0834a33 to a0a89c4 Compare November 2, 2025 12:08
@liblaf liblaf bot requested a review from liblaf November 2, 2025 12:08
liblaf
liblaf previously approved these changes Nov 2, 2025
liblaf
liblaf previously approved these changes Nov 2, 2025
@liblaf liblaf bot force-pushed the copier-update branch from 3d00ece to 016adab Compare November 2, 2025 13:35
@liblaf liblaf bot added the bot label Nov 2, 2025
@liblaf liblaf bot requested a review from liblaf November 2, 2025 13:35
liblaf
liblaf previously approved these changes Nov 2, 2025
liblaf
liblaf previously approved these changes Nov 2, 2025
@liblaf liblaf bot added the automerge Merge the pull request once unit tests and other checks pass. label Nov 2, 2025
@liblaf liblaf bot requested a review from liblaf November 2, 2025 19:07
liblaf
liblaf previously approved these changes Nov 2, 2025
liblaf
liblaf previously approved these changes Nov 3, 2025
@liblaf liblaf bot force-pushed the copier-update branch from 82d96d0 to df1bbca Compare November 3, 2025 11:45
@liblaf liblaf bot deployed to MegaLinter November 3, 2025 11:45 Active
@liblaf liblaf bot requested a review from liblaf November 3, 2025 11:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automerge Merge the pull request once unit tests and other checks pass. bot

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants