PyPtt 2.3.13__tar.gz → 2.3.15__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. {pyptt-2.3.13 → pyptt-2.3.15}/PKG-INFO +1 -1
  2. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/__init__.py +1 -1
  3. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_board_info.py +11 -12
  4. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_time.py +3 -2
  5. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/screens.py +2 -1
  6. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt.egg-info/PKG-INFO +1 -1
  7. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_board_setting_flow.py +30 -0
  8. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_board_info_parser.py +57 -0
  9. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_new_screen_fixes.py +11 -1
  10. {pyptt-2.3.13 → pyptt-2.3.15}/LICENSE +0 -0
  11. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/PTT.py +0 -0
  12. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_bucket.py +0 -0
  13. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_call_status.py +0 -0
  14. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_change_pw.py +0 -0
  15. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_comment.py +0 -0
  16. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_del_post.py +0 -0
  17. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_board_list.py +0 -0
  18. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_bottom_post_list.py +0 -0
  19. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_favourite_board.py +0 -0
  20. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_newest_index.py +0 -0
  21. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_post.py +0 -0
  22. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_post_index.py +0 -0
  23. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_post_list.py +0 -0
  24. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_user.py +0 -0
  25. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_get_waterball.py +0 -0
  26. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_give_money.py +0 -0
  27. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_has_new_mail.py +0 -0
  28. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_loginout.py +0 -0
  29. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_mail.py +0 -0
  30. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_mark_post.py +0 -0
  31. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_post.py +0 -0
  32. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_reply_post.py +0 -0
  33. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_search_user.py +0 -0
  34. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_set_board_title.py +0 -0
  35. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_set_signature_file.py +0 -0
  36. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_api_util.py +0 -0
  37. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_uao/LICENSE +0 -0
  38. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_uao/__init__.py +0 -0
  39. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_uao/b2u.py +0 -0
  40. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/_uao/u2b.py +0 -0
  41. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/api_server.py +0 -0
  42. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/check_value.py +0 -0
  43. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/command.py +0 -0
  44. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/config.py +0 -0
  45. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/connect_core.py +0 -0
  46. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/data_type.py +0 -0
  47. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/exceptions.py +0 -0
  48. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/i18n.py +0 -0
  49. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/lang_en_US.py +0 -0
  50. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/lang_zh_TW.py +0 -0
  51. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/lib_util.py +0 -0
  52. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/log.py +0 -0
  53. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/service.py +0 -0
  54. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt/ssl_config.py +0 -0
  55. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt.egg-info/SOURCES.txt +0 -0
  56. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt.egg-info/dependency_links.txt +0 -0
  57. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt.egg-info/requires.txt +0 -0
  58. {pyptt-2.3.13 → pyptt-2.3.15}/PyPtt.egg-info/top_level.txt +0 -0
  59. {pyptt-2.3.13 → pyptt-2.3.15}/README.md +0 -0
  60. {pyptt-2.3.13 → pyptt-2.3.15}/pyproject.toml +0 -0
  61. {pyptt-2.3.13 → pyptt-2.3.15}/setup.cfg +0 -0
  62. {pyptt-2.3.13 → pyptt-2.3.15}/setup.py +0 -0
  63. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_backup_effective.py +0 -0
  64. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_backup_param.py +0 -0
  65. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_bucket.py +0 -0
  66. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_change_pw.py +0 -0
  67. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_comment.py +0 -0
  68. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_connect_core_timeout.py +0 -0
  69. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_del_post.py +0 -0
  70. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_del_post_unit.py +0 -0
  71. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_exceptions.py +0 -0
  72. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_fast_post.py +0 -0
  73. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_board_info.py +0 -0
  74. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_board_list.py +0 -0
  75. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_bottom_post_list.py +0 -0
  76. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_content_formula.py +0 -0
  77. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_favourite_boards.py +0 -0
  78. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_mail.py +0 -0
  79. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_newest_index.py +0 -0
  80. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_post.py +0 -0
  81. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_post_list.py +0 -0
  82. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_post_list_parser.py +0 -0
  83. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_post_parser.py +0 -0
  84. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_time.py +0 -0
  85. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_user.py +0 -0
  86. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_get_waterball.py +0 -0
  87. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_give_money.py +0 -0
  88. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_half_dead_connection.py +0 -0
  89. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_i18n.py +0 -0
  90. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_incremental_parity.py +0 -0
  91. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_init.py +0 -0
  92. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_logger.py +0 -0
  93. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_login_logout.py +0 -0
  94. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_mail_send_and_del.py +0 -0
  95. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_main_menu_status_bar.py +0 -0
  96. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_mark_post.py +0 -0
  97. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_parse_query_post.py +0 -0
  98. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_post.py +0 -0
  99. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_post_anonymous.py +0 -0
  100. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_pyte_parity.py +0 -0
  101. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_reply_post.py +0 -0
  102. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_search_user.py +0 -0
  103. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_service.py +0 -0
  104. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_set_board_title.py +0 -0
  105. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_set_signature_file.py +0 -0
  106. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_status_line.py +0 -0
  107. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_uao_codec.py +0 -0
  108. {pyptt-2.3.13 → pyptt-2.3.15}/tests/test_vt100_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPtt
3
- Version: 2.3.13
3
+ Version: 2.3.15
4
4
  Summary: PyPtt github: https://github.com/PyPtt/PyPtt
5
5
  Author-email: CodingMan <pttcodingman@gmail.com>
6
6
  License: GNU Lesser General Public License v3 (LGPLv3)
@@ -1,4 +1,4 @@
1
- __version__ = '2.3.13'
1
+ __version__ = '2.3.15'
2
2
  __author__ = 'CodingMan'
3
3
  __email__ = 'pttcodingman@gmail.com'
4
4
 
@@ -95,8 +95,10 @@ def get_board_info(api, board: str, get_post_kind: bool, call_by_others: bool) -
95
95
  raise exceptions.ConnectionClosed()
96
96
 
97
97
  boardname = None
98
- # 新版: '看板名稱: Test 板主名單: ...';舊版: '《Test》看板設定'
99
- r = re.search(r'看板名稱: (\S+)|《(.+)》看板設定', ori_screen)
98
+ # 2026-11-01 起: '名稱: Test 板主: ...';2026-10: '看板名稱: Test 板主名單: ...';
99
+ # 舊版: '《Test》看板設定'
100
+ r = re.search(r'^(?:看板)?名稱: (\S+)|《(.+)》看板設定', ori_screen, re.M)
101
+ new_layout = r is not None and r.group(1) is not None
100
102
  if r is not None:
101
103
  boardname = (r.group(1) or r.group(2)).strip()
102
104
 
@@ -119,20 +121,17 @@ def get_board_info(api, board: str, get_post_kind: bool, call_by_others: bool) -
119
121
  logger.debug('中文敘述', chinese_des)
120
122
 
121
123
  moderators = []
122
- p = re.compile(r'板主名單: (.+)')
124
+ # 2026-11-01 起帳號板主以 '/' 串接,非帳號的板主稱號接在後面、以空白分隔:
125
+ # '板主: ubcs/redDest 初音未來'
126
+ p = re.compile(r'板主(?:名單)?: (.+)')
123
127
  r = p.search(ori_screen)
124
128
  if r is not None:
125
- moderator_line = r.group(0)[5:].strip()
126
- if '(無)' in moderator_line:
127
- moderators = []
128
- else:
129
- moderators = moderator_line.split('/')
130
- for moderator in moderators.copy():
131
- if moderator in ('徵求中', ''):
132
- moderators.remove(moderator)
129
+ moderator_line = r.group(1).strip()
130
+ if '(無)' not in moderator_line:
131
+ moderators = [m for m in re.split(r'[/\s]+', moderator_line) if m not in ('徵求中', '')]
133
132
  logger.debug('板主名單', moderators)
134
133
 
135
- if '看板名稱:' in ori_screen:
134
+ if new_layout:
136
135
  # 新版畫面每項一列: ' 9. 快速連推文章 限制 (間隔 5 秒)'。
137
136
  # 2026-10-19 起欄寬變寬;編輯模式另有熱鍵標示 ' 1. (b)中文敘述' 與
138
137
  # 權限註記 '開放 (限站長)',兩者都去掉再比對。
@@ -8,7 +8,7 @@ from . import i18n
8
8
  from . import log
9
9
  from . import screens
10
10
 
11
- pattern = re.compile(r'[\d]+:[\d][\d]')
11
+ pattern = re.compile(r'(\d{1,2}):(\d{2})')
12
12
 
13
13
 
14
14
  def get_time(api) -> str:
@@ -46,5 +46,6 @@ def _find_time(line_list):
46
46
  if '線上' in line:
47
47
  result = pattern.search(line)
48
48
  if result is not None:
49
- return result.group(0)
49
+ # 10 點前小時不補零 (週六 9:18), 統一回傳 HH:MM
50
+ return f'{int(result.group(1)):02d}:{result.group(2)}'
50
51
  return None
@@ -250,8 +250,9 @@ class Target:
250
250
  '看板設定與管理 [唯讀檢視]',
251
251
  '(←)離開',
252
252
  ]
253
+ # 2026-11-01 起編輯模式頁首改為「[管理權限: 板主]」
253
254
  BoardSettingEdit = [
254
- '編輯模式 (按 Ctrl-P 唯讀)',
255
+ ['編輯模式 (按 Ctrl-P 唯讀)', '看板設定與管理 [管理權限:'],
255
256
  '看板設定(編輯)',
256
257
  ]
257
258
  # 舊版 (本機 pttbbs): i → 設定頁 + 任意鍵提示,^P → 單行輸入「要改變的設定」
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPtt
3
- Version: 2.3.13
3
+ Version: 2.3.15
4
4
  Summary: PyPtt github: https://github.com/PyPtt/PyPtt
5
5
  Author-email: CodingMan <pttcodingman@gmail.com>
6
6
  License: GNU Lesser General Public License v3 (LGPLv3)
@@ -232,6 +232,36 @@ class TestSetBoardTitleNewFlow:
232
232
  assert api.connect_core.keys == ['I', LEFT]
233
233
 
234
234
 
235
+ # 2026-11-01 PTT1 改版: 編輯模式頁首改成 '[管理權限: 板主]',頁尾 (w) 改叫禁言名單
236
+ EDIT_20261101 = EDIT.replace('[編輯模式 (按 Ctrl-P 唯讀)]', '[管理權限: 板主]').replace(
237
+ '(w)水桶名單', '(w)禁言名單').replace('看板名稱: give 板主名單: SomeBM', '名稱: give 板主: SomeBM')
238
+ EDIT_20261101_CURSOR16 = EDIT_CURSOR16.replace('[編輯模式 (按 Ctrl-P 唯讀)]', '[管理權限: 板主]')
239
+
240
+
241
+ class TestEditHeader20261101:
242
+ def test_set_board_title(self, make_api):
243
+ assert '[管理權限: 板主]' in EDIT_20261101 and '編輯模式' not in EDIT_20261101
244
+ text = '[贈送] 新標題 test'
245
+ api = make_api([READONLY, EDIT_20261101, TITLE_PROMPT, _typed(text), EDIT_20261101, SAVED, ARTICLE_LIST])
246
+ _api_set_board_title.set_board_title(api, 'give', '新標題 test')
247
+ keys = api.connect_core.keys
248
+ assert keys[:3] == ['I', CTRL_P, ENTER]
249
+ assert keys[3].lstrip(command.backspace) == text
250
+ assert keys[4:] == [ENTER, LEFT, LEFT]
251
+
252
+ def test_bucket(self, make_api):
253
+ api = make_api([READONLY, EDIT_20261101, BAKUMAN, BAKUMAN_ID, BAKUMAN_PERIOD, BAKUMAN_REASON,
254
+ BAKUMAN_CONFIRM, BAKUMAN_DONE, BAKUMAN, EDIT_20261101_CURSOR16, UNCHANGED, ARTICLE_LIST])
255
+ _api_bucket.bucket(api, 'give', 1, 'PyPtt test', 'CodingMan')
256
+ assert api.connect_core.keys == [
257
+ 'i', CTRL_P, 'w', 'a' + ENTER, 'CodingMan' + ENTER, '1' + ENTER, 'PyPtt test' + ENTER, 'y' + ENTER,
258
+ LEFT, ENTER, LEFT, LEFT]
259
+
260
+ def test_exit_key_and_in_board_setting(self):
261
+ assert screens.in_board_setting(EDIT_20261101)
262
+ assert screens.board_setting_exit_key(EDIT_20261101) == LEFT
263
+
264
+
235
265
  class TestBucketNewFlow:
236
266
  def test_happy_path(self, make_api):
237
267
  api = make_api([READONLY, EDIT, BAKUMAN, BAKUMAN_ID, BAKUMAN_PERIOD, BAKUMAN_REASON, BAKUMAN_CONFIRM,
@@ -312,3 +312,60 @@ def test_no_such_board_after_i_still_leaves_menu():
312
312
  with pytest.raises(exceptions.NoSuchBoard):
313
313
  _api_get_board_info.get_board_info(api, 'Test', get_post_kind=False, call_by_others=True)
314
314
  assert api.connect_core.keys[-1] == command.left
315
+
316
+
317
+ # 2026-11-01 PTT1 改版: 標頭 '看板名稱: X 板主名單: ...' 改成 '名稱: X 板主: ...';
318
+ # 帳號板主以 '/' 串接,非帳號的板主稱號 (綠字) 以空白分隔接在後面
319
+ _ROWS_20261101 = '\n'.join([
320
+ '> 1. 中文敘述 [八卦] X教授 R.I.P',
321
+ ' 2. 公開狀態 (是否隱形) 公開',
322
+ ' 3. 隱板時進入十大排行榜 可以',
323
+ ' 4. 非看板會員發文 開放',
324
+ ' 5. 回應文章 開放',
325
+ ' 6. 自刪文章 開放',
326
+ ' 7. 推薦文章 (推文) 開放',
327
+ ' 8. 噓文 開放',
328
+ ' 9. 快速連推文章 限制 (間隔 5 秒)',
329
+ ' 10. 推文時記錄來源 IP 自動記錄',
330
+ ' 11. 推文開頭自動對齊 不用對齊',
331
+ ' 12. 板主刪除部份違規文字 可',
332
+ ' 13. 轉錄文章自動記錄 會 (需發文權限)',
333
+ ' 14. 冷靜模式 未設定',
334
+ ' 15. 未滿十八歲進入 禁止',
335
+ ' 16. [發文條件] 登入次數 無限制',
336
+ ' 17. [發文條件] 退文篇數 無限制',
337
+ ' 18. 個人發文推文權限 具有發文與推文權限',
338
+ ' 19. 預設連署限制 (登入/退文) 無特別限制',
339
+ ' 20. [名單] 設定禁言名單(水桶) [唯讀檢視]',
340
+ ' 21. [名單] 可見會員名單 [唯讀檢視]',
341
+ ' 看板資訊 (PgUp)上頁 (PgDn)下頁 (1)跳號 (←)離開 (h)說明',
342
+ ])
343
+
344
+
345
+ def _info_20261101(header):
346
+ return ' 看板設定與管理 [唯讀檢視]\n' + header + '\n' + _ROWS_20261101
347
+
348
+
349
+ @pytest.mark.parametrize('header, board, moderators', [
350
+ ('名稱: Gossiping 板主: ubcs/redDest 初音未來', 'Gossiping', ['ubcs', 'redDest', '初音未來']),
351
+ ('名稱: C_Chat 板主: daniel0527/arrenwu/motw1999', 'C_Chat', ['daniel0527', 'arrenwu', 'motw1999']),
352
+ ('名稱: SYSOP 板主: 站長', 'SYSOP', ['站長']),
353
+ ('名稱: Python 板主: (無)', 'Python', []),
354
+ ])
355
+ def test_layout_20261101(header, board, moderators):
356
+ info = _info(board, _info_20261101(header))
357
+ assert info[BoardField.board] == board
358
+ assert info[BoardField.moderators] == moderators
359
+ assert info[BoardField.mandarin_des] == '[八卦] X教授 R.I.P'
360
+ assert info[BoardField.into_top_ten_when_hide] is True
361
+ assert info[BoardField.can_fast_push] is False
362
+ assert info[BoardField.min_interval_between_comments] == 5
363
+ assert info[BoardField.is_comment_record_ip] is True
364
+ assert info[BoardField.can_moderators_del_illegal_content] is True
365
+ assert info[BoardField.is_require18] is True
366
+ assert info[BoardField.require_login_time] == 0
367
+
368
+
369
+ def test_layout_20261101_board_name_mismatch_raises_no_such_board():
370
+ with pytest.raises(exceptions.NoSuchBoard):
371
+ _info('Test', _info_20261101('名稱: Python 板主: (無)'))
@@ -17,7 +17,7 @@ from unittest.mock import MagicMock
17
17
  import pytest
18
18
 
19
19
  import PyPtt
20
- from PyPtt import (_api_get_favourite_board, _api_get_newest_index, _api_get_post_list, _api_give_money,
20
+ from PyPtt import (_api_get_favourite_board, _api_get_newest_index, _api_get_time, _api_get_post_list, _api_give_money,
21
21
  _api_util, command, config, connect_core, data_type, exceptions, i18n, screens)
22
22
 
23
23
  i18n.init(PyPtt.Language.ENGLISH)
@@ -404,3 +404,13 @@ def test_favourites_target_matches(name):
404
404
  core.get_screen_queue.return_value = [_fx('favourites_new_p5.txt')]
405
405
  _api_get_favourite_board.get_favourite_board(_mock_api(core))
406
406
  assert target_list[0].is_match(_fx(name), '>')
407
+
408
+
409
+ @pytest.mark.parametrize('bar, expected', [
410
+ # 10 點前狀態列的小時不補零, get_time 仍要回 HH:MM
411
+ (' 主選單 [ 獅子時 ] 10/24 週六 9:18 | DeepLearning | 線上23636人 (h)說明 ', '09:18'),
412
+ (' 主選單 [ 獅子時 ] 10/24 週六 0:05 | DeepLearning | 線上23636人 (h)說明 ', '00:05'),
413
+ ('主選單 世界郵政日 10/9 週五 15:04 | janice001 | 線上24305人 (h)說明', '15:04'),
414
+ ])
415
+ def test_get_time_zero_pads_hour(bar, expected):
416
+ assert _api_get_time._find_time(['', bar]) == expected
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes