e3cli 1.0.0__tar.gz → 1.0.2__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 (265) hide show
  1. {e3cli-1.0.0 → e3cli-1.0.2}/.github/workflows/release.yml +10 -5
  2. {e3cli-1.0.0 → e3cli-1.0.2}/PKG-INFO +1 -1
  3. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/__init__.py +1 -1
  4. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/interactive.py +1 -2
  5. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/course_name.py +9 -5
  6. {e3cli-1.0.0 → e3cli-1.0.2}/pyproject.toml +1 -1
  7. {e3cli-1.0.0 → e3cli-1.0.2}/tests/test_basic.py +34 -0
  8. {e3cli-1.0.0 → e3cli-1.0.2}/.github/workflows/ci.yml +0 -0
  9. {e3cli-1.0.0 → e3cli-1.0.2}/.gitignore +0 -0
  10. {e3cli-1.0.0 → e3cli-1.0.2}/CLAUDE.md +0 -0
  11. {e3cli-1.0.0 → e3cli-1.0.2}/COMMIT_EDITMSG +0 -0
  12. {e3cli-1.0.0 → e3cli-1.0.2}/Formula/e3cli.rb +0 -0
  13. {e3cli-1.0.0 → e3cli-1.0.2}/HEAD +0 -0
  14. {e3cli-1.0.0 → e3cli-1.0.2}/LICENSE +0 -0
  15. {e3cli-1.0.0 → e3cli-1.0.2}/Makefile +0 -0
  16. {e3cli-1.0.0 → e3cli-1.0.2}/README.md +0 -0
  17. {e3cli-1.0.0 → e3cli-1.0.2}/README_zh-TW.md +0 -0
  18. {e3cli-1.0.0 → e3cli-1.0.2}/config +0 -0
  19. {e3cli-1.0.0 → e3cli-1.0.2}/description +0 -0
  20. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/__main__.py +0 -0
  21. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/agent_prompt.md +0 -0
  22. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/ai/__init__.py +0 -0
  23. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/__init__.py +0 -0
  24. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/assignments.py +0 -0
  25. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/client.py +0 -0
  26. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/courses.py +0 -0
  27. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/files.py +0 -0
  28. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/forums.py +0 -0
  29. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/members.py +0 -0
  30. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/messages.py +0 -0
  31. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/api/site.py +0 -0
  32. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/auth.py +0 -0
  33. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/cli.py +0 -0
  34. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/__init__.py +0 -0
  35. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/_common.py +0 -0
  36. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/announcements.py +0 -0
  37. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/assignments.py +0 -0
  38. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/courses.py +0 -0
  39. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/download.py +0 -0
  40. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/login.py +0 -0
  41. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/logout.py +0 -0
  42. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/members.py +0 -0
  43. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/message.py +0 -0
  44. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/profile.py +0 -0
  45. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/schedule.py +0 -0
  46. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/setup.py +0 -0
  47. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/skill.py +0 -0
  48. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/submit.py +0 -0
  49. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/commands/sync.py +0 -0
  50. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/config.py +0 -0
  51. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/credential.py +0 -0
  52. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/formatting.py +0 -0
  53. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/http.py +0 -0
  54. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/i18n.py +0 -0
  55. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/scheduler/__init__.py +0 -0
  56. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/scheduler/cron.py +0 -0
  57. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/semester.py +0 -0
  58. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/skills/e3cli/SKILL.md +0 -0
  59. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/storage/__init__.py +0 -0
  60. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/storage/db.py +0 -0
  61. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/storage/models.py +0 -0
  62. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/storage/tracking.py +0 -0
  63. {e3cli-1.0.0 → e3cli-1.0.2}/e3cli/tui_menu.py +0 -0
  64. {e3cli-1.0.0 → e3cli-1.0.2}/gk/config +0 -0
  65. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/applypatch-msg.sample +0 -0
  66. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/commit-msg.sample +0 -0
  67. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/fsmonitor-watchman.sample +0 -0
  68. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/post-update.sample +0 -0
  69. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/pre-applypatch.sample +0 -0
  70. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/pre-commit.sample +0 -0
  71. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/pre-merge-commit.sample +0 -0
  72. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/pre-push.sample +0 -0
  73. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/pre-rebase.sample +0 -0
  74. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/pre-receive.sample +0 -0
  75. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/prepare-commit-msg.sample +0 -0
  76. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/push-to-checkout.sample +0 -0
  77. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/sendemail-validate.sample +0 -0
  78. {e3cli-1.0.0 → e3cli-1.0.2}/hooks/update.sample +0 -0
  79. {e3cli-1.0.0 → e3cli-1.0.2}/index +0 -0
  80. {e3cli-1.0.0 → e3cli-1.0.2}/info/exclude +0 -0
  81. {e3cli-1.0.0 → e3cli-1.0.2}/logs/HEAD +0 -0
  82. {e3cli-1.0.0 → e3cli-1.0.2}/logs/refs/heads/main +0 -0
  83. {e3cli-1.0.0 → e3cli-1.0.2}/logs/refs/remotes/origin/main +0 -0
  84. {e3cli-1.0.0 → e3cli-1.0.2}/objects/00/12f54a62a13459820d72b63eee8781d5cc0fae +0 -0
  85. {e3cli-1.0.0 → e3cli-1.0.2}/objects/00/373e054c653e54b45cacae42d71dff863626bf +0 -0
  86. {e3cli-1.0.0 → e3cli-1.0.2}/objects/04/9ee8e5968a9a80f0f1ac53d12141c61e7298ba +0 -0
  87. {e3cli-1.0.0 → e3cli-1.0.2}/objects/04/e0353337b6bb0c0ba43625456e9aaf13090a90 +0 -0
  88. {e3cli-1.0.0 → e3cli-1.0.2}/objects/05/0fec5da6aa35de1058b11671dfd6255b4d6b50 +0 -0
  89. {e3cli-1.0.0 → e3cli-1.0.2}/objects/06/5c820fc3efcd99754c56197a9c4e7142da710d +0 -0
  90. {e3cli-1.0.0 → e3cli-1.0.2}/objects/07/01890044580c4644114b781d474012b2fade80 +0 -0
  91. {e3cli-1.0.0 → e3cli-1.0.2}/objects/07/fb70ff1c509aad1f137a9255b9cb98733472a3 +0 -0
  92. {e3cli-1.0.0 → e3cli-1.0.2}/objects/0e/89da06e2d2273057dfa03705c42bbc57af1a6a +0 -0
  93. {e3cli-1.0.0 → e3cli-1.0.2}/objects/13/ad53a74b643378a7aebfe32d672b256ab73bef +0 -0
  94. {e3cli-1.0.0 → e3cli-1.0.2}/objects/13/fb66226ef7de52c039b1030460c5bb9ad1d576 +0 -0
  95. {e3cli-1.0.0 → e3cli-1.0.2}/objects/14/f44dcbbf53914d2d2b5b5a43453932fb0c6dd6 +0 -0
  96. {e3cli-1.0.0 → e3cli-1.0.2}/objects/15/6da5879f795abd72f645bbcadf18a4928a7502 +0 -0
  97. {e3cli-1.0.0 → e3cli-1.0.2}/objects/19/f9906c2882926f53e77b4be8be579906954a69 +0 -0
  98. {e3cli-1.0.0 → e3cli-1.0.2}/objects/1a/3f91d11c7c9c764fcd1ed01a4a0c3f13b68fee +0 -0
  99. {e3cli-1.0.0 → e3cli-1.0.2}/objects/1c/1765c4b372bd085c6224472de72f66e8d9fbe9 +0 -0
  100. {e3cli-1.0.0 → e3cli-1.0.2}/objects/22/e1020c805f3235c5c85d711a45d70d42883de0 +0 -0
  101. {e3cli-1.0.0 → e3cli-1.0.2}/objects/24/7f60ac43c8a065926f3228575a34d0ecd6f93d +0 -0
  102. {e3cli-1.0.0 → e3cli-1.0.2}/objects/25/4d6ec800e32759015479a68a3afd096ee12680 +0 -0
  103. {e3cli-1.0.0 → e3cli-1.0.2}/objects/27/1aee134d84254ba525ce728b3ecbbcbd73fe97 +0 -0
  104. {e3cli-1.0.0 → e3cli-1.0.2}/objects/27/41f5e19bf92e37c983e7d4d307ec09726b95ed +0 -0
  105. {e3cli-1.0.0 → e3cli-1.0.2}/objects/28/265727a791db9daef09c85ab159ef799908dc4 +0 -0
  106. {e3cli-1.0.0 → e3cli-1.0.2}/objects/2d/4c64fc2752b1356569f24e6f3d53cfd8ff3236 +0 -0
  107. {e3cli-1.0.0 → e3cli-1.0.2}/objects/31/61734dcf7d8b86372753c2552746641969ca7a +0 -0
  108. {e3cli-1.0.0 → e3cli-1.0.2}/objects/33/3da47d4f7d08fc2836374614b902a27f1a7638 +0 -0
  109. {e3cli-1.0.0 → e3cli-1.0.2}/objects/35/25cb5144ca2d643d918824df0f08042f8f1f19 +0 -0
  110. {e3cli-1.0.0 → e3cli-1.0.2}/objects/35/faf439f5e7e6730398397e0988c874ec74c15e +0 -0
  111. {e3cli-1.0.0 → e3cli-1.0.2}/objects/37/2acc5a62b5a8a7cd97d3eb07614d2a71d65c34 +0 -0
  112. {e3cli-1.0.0 → e3cli-1.0.2}/objects/37/f0c29518b9df6cde4d0cd7857d95b425fcaec9 +0 -0
  113. {e3cli-1.0.0 → e3cli-1.0.2}/objects/38/8bc96a53da22ddf8d3684c10480a9ed89274a6 +0 -0
  114. {e3cli-1.0.0 → e3cli-1.0.2}/objects/38/d062de47938882cc8c951cfcd18266bfa834d0 +0 -0
  115. {e3cli-1.0.0 → e3cli-1.0.2}/objects/39/bbbcd0ade10f3066a853cca53ad5159ac78e30 +0 -0
  116. {e3cli-1.0.0 → e3cli-1.0.2}/objects/3c/dd09e594d5716969279d6e3fcf99fca00f8504 +0 -0
  117. {e3cli-1.0.0 → e3cli-1.0.2}/objects/3e/71c91d71be5667a313ecfae444718750b2bf55 +0 -0
  118. {e3cli-1.0.0 → e3cli-1.0.2}/objects/3e/7febbe12d705885c2503c3e0d785e488f60966 +0 -0
  119. {e3cli-1.0.0 → e3cli-1.0.2}/objects/3f/0235e32813f74985f0363e64a110093d979e2f +0 -0
  120. {e3cli-1.0.0 → e3cli-1.0.2}/objects/40/9ded4237099e6e52de508dd46ebe74cf769e79 +0 -0
  121. {e3cli-1.0.0 → e3cli-1.0.2}/objects/41/88bc8a7a0569fd47efb215aad2e3f4a7b7e188 +0 -0
  122. {e3cli-1.0.0 → e3cli-1.0.2}/objects/42/53425dbc4368909b4b782fd53360537d3d9033 +0 -0
  123. {e3cli-1.0.0 → e3cli-1.0.2}/objects/42/925cbdfef5b97f5ae199323a5545810207af09 +0 -0
  124. {e3cli-1.0.0 → e3cli-1.0.2}/objects/42/b238ab6f9c3c74cd23a14c094ad8eb1c66d52b +0 -0
  125. {e3cli-1.0.0 → e3cli-1.0.2}/objects/43/49874ad2cdacc9d50d6ba06df25765d077248a +0 -0
  126. {e3cli-1.0.0 → e3cli-1.0.2}/objects/43/cead7a00c7ef98e1d5c9c86e50a3ccde712277 +0 -0
  127. {e3cli-1.0.0 → e3cli-1.0.2}/objects/43/e88c1a0a115fc72390e7bcef8ce0a8328a4e05 +0 -0
  128. {e3cli-1.0.0 → e3cli-1.0.2}/objects/45/9c23839b54e81c741fd2b5241c2b164079fcc1 +0 -0
  129. {e3cli-1.0.0 → e3cli-1.0.2}/objects/47/d9fe1a890a3d711662f4f414aee1ea6ae92261 +0 -0
  130. {e3cli-1.0.0 → e3cli-1.0.2}/objects/49/da3d511c413f21dca0f072ad52b0aca2d3c167 +0 -0
  131. {e3cli-1.0.0 → e3cli-1.0.2}/objects/4f/1897fc4248a024fc88e51f53f9028f531318cc +0 -0
  132. {e3cli-1.0.0 → e3cli-1.0.2}/objects/50/f89469bbe802dad848dcfeb2a8e447d4cd5787 +0 -0
  133. {e3cli-1.0.0 → e3cli-1.0.2}/objects/51/7ac4b389a310399e096baab0af89f1e5de7b3b +0 -0
  134. {e3cli-1.0.0 → e3cli-1.0.2}/objects/52/61e3b09b4722a7003c53a643085ca69e0c7bbd +0 -0
  135. {e3cli-1.0.0 → e3cli-1.0.2}/objects/53/7671d097d835bda94f0460295ce1cf49eda99a +0 -0
  136. {e3cli-1.0.0 → e3cli-1.0.2}/objects/54/8d12b92b82f95dc93b4f069086d8214651593d +0 -0
  137. {e3cli-1.0.0 → e3cli-1.0.2}/objects/55/2cd273856516fd1a5e026ef23c9ffeb5a33876 +0 -0
  138. {e3cli-1.0.0 → e3cli-1.0.2}/objects/56/52f31ea165a3ace62d1394af754a8aac78aa9f +0 -0
  139. {e3cli-1.0.0 → e3cli-1.0.2}/objects/57/9c69b0b67ebff094514cec01f692e21ca5e965 +0 -0
  140. {e3cli-1.0.0 → e3cli-1.0.2}/objects/57/ddc6c8820bd8ec98845e7f5a29bf3302f0f481 +0 -0
  141. {e3cli-1.0.0 → e3cli-1.0.2}/objects/58/2fba780a9cb7a9f312bd21cf97f16bc5b347c3 +0 -0
  142. {e3cli-1.0.0 → e3cli-1.0.2}/objects/5c/6b70ca4f2f822429a97a84428580966d84ab3a +0 -0
  143. {e3cli-1.0.0 → e3cli-1.0.2}/objects/5e/c686a09ef712b11372e38d25c958b027b3f21f +0 -0
  144. {e3cli-1.0.0 → e3cli-1.0.2}/objects/5f/96e4a89ab06b40be8c45cd0d975bdc2f957064 +0 -0
  145. {e3cli-1.0.0 → e3cli-1.0.2}/objects/60/c9053920fd6a8cd64eb28d8df99bcc2d176d59 +0 -0
  146. {e3cli-1.0.0 → e3cli-1.0.2}/objects/62/1ab88d46df0f1b1015e250f4c8174729629400 +0 -0
  147. {e3cli-1.0.0 → e3cli-1.0.2}/objects/62/5d72f7372bae8ab3ccc056e829c277c0705d1b +0 -0
  148. {e3cli-1.0.0 → e3cli-1.0.2}/objects/64/1ee83ac5a80cc7ae2e5f036db6329eacd03deb +0 -0
  149. {e3cli-1.0.0 → e3cli-1.0.2}/objects/65/011e04aeddd4c893a7a64b7ef745e9ad1af3c3 +0 -0
  150. {e3cli-1.0.0 → e3cli-1.0.2}/objects/66/b5f21689d122c08ee3b98d35f3de096addcfcc +0 -0
  151. {e3cli-1.0.0 → e3cli-1.0.2}/objects/69/89864c6313789a85608f01eda8976e1215bd31 +0 -0
  152. {e3cli-1.0.0 → e3cli-1.0.2}/objects/69/db255149b01f9ab01b48138fbb0f2d9b8b1acd +0 -0
  153. {e3cli-1.0.0 → e3cli-1.0.2}/objects/6a/597477c08142472e4a0559811e459ae7b127fc +0 -0
  154. {e3cli-1.0.0 → e3cli-1.0.2}/objects/6a/5e5e8ca97f2dec142b2ba15ed97a8493c16a54 +0 -0
  155. {e3cli-1.0.0 → e3cli-1.0.2}/objects/6b/d7a53ed2c5cd4c0e97267b70fff1dd461b60b7 +0 -0
  156. {e3cli-1.0.0 → e3cli-1.0.2}/objects/6d/05c5aaad4ff44578bbc46b5f7fc96f0d114e04 +0 -0
  157. {e3cli-1.0.0 → e3cli-1.0.2}/objects/6d/5c36f68694ad597a4deeba39e56e561ba72f2f +0 -0
  158. {e3cli-1.0.0 → e3cli-1.0.2}/objects/6e/3f7883a133ec8310cf8ad07cba6aead4583ff9 +0 -0
  159. {e3cli-1.0.0 → e3cli-1.0.2}/objects/6f/15710e7621abc864dabb788c5dfcab181e4551 +0 -0
  160. {e3cli-1.0.0 → e3cli-1.0.2}/objects/71/6894eaf5165344374d82dda25e82eff5fce119 +0 -0
  161. {e3cli-1.0.0 → e3cli-1.0.2}/objects/71/ca2fc16d0959c7465d57077a260156674274ba +0 -0
  162. {e3cli-1.0.0 → e3cli-1.0.2}/objects/74/0db02cd55f69b9f21f49a359fc14c15ad7f8ce +0 -0
  163. {e3cli-1.0.0 → e3cli-1.0.2}/objects/76/37fd54a47bfbdf2eed4827b78dff6019b87e57 +0 -0
  164. {e3cli-1.0.0 → e3cli-1.0.2}/objects/79/15535a493620715580f5d0ce8c2481172d44bd +0 -0
  165. {e3cli-1.0.0 → e3cli-1.0.2}/objects/7b/ad63d2dd7dab6c33f73a31bd359129523ac5ce +0 -0
  166. {e3cli-1.0.0 → e3cli-1.0.2}/objects/7c/95c6bec18763286e0100ebc4fbef71df48b0ae +0 -0
  167. {e3cli-1.0.0 → e3cli-1.0.2}/objects/7f/a3240ccd3661f7786bd269a0b0875cd9037b4b +0 -0
  168. {e3cli-1.0.0 → e3cli-1.0.2}/objects/82/8511321c72b509d8b39d3a392014e2748036ad +0 -0
  169. {e3cli-1.0.0 → e3cli-1.0.2}/objects/84/3e8bf8d7bf26780eb4c44f0e1733dae7df37da +0 -0
  170. {e3cli-1.0.0 → e3cli-1.0.2}/objects/84/45dbe199e0d8e83aa85b04f68c4b4e97764c46 +0 -0
  171. {e3cli-1.0.0 → e3cli-1.0.2}/objects/85/58de1a164b671ae0c5e9867140f4d105b26c71 +0 -0
  172. {e3cli-1.0.0 → e3cli-1.0.2}/objects/85/bfef5de75cdd3313dea22060cd9f22bf6f611c +0 -0
  173. {e3cli-1.0.0 → e3cli-1.0.2}/objects/87/075d1b2ca01520a54b6e2053d2b07e30ff550e +0 -0
  174. {e3cli-1.0.0 → e3cli-1.0.2}/objects/8a/2f2b74b3a7f9b0f2969ff455d1b5a149189522 +0 -0
  175. {e3cli-1.0.0 → e3cli-1.0.2}/objects/8b/da82680cf77bd85ef26d162f09df5b555c4817 +0 -0
  176. {e3cli-1.0.0 → e3cli-1.0.2}/objects/8b/f368e49da5649603590fd2ad157fb423f91240 +0 -0
  177. {e3cli-1.0.0 → e3cli-1.0.2}/objects/8c/988f80dcde632bee9389cb52d7c2639e358676 +0 -0
  178. {e3cli-1.0.0 → e3cli-1.0.2}/objects/8d/9cc78f614e082762dfd1af4d90b83e97509ba4 +0 -0
  179. {e3cli-1.0.0 → e3cli-1.0.2}/objects/91/b7e6699fcf2d3d87bc9209c30743851b95937e +0 -0
  180. {e3cli-1.0.0 → e3cli-1.0.2}/objects/97/6c6c60bcbbfe1b2ea7dc08631420753e2a2c55 +0 -0
  181. {e3cli-1.0.0 → e3cli-1.0.2}/objects/98/414112321df2d4fef51640978555b7b0a10740 +0 -0
  182. {e3cli-1.0.0 → e3cli-1.0.2}/objects/98/5dbb79e4f3157ba4a5b967ca1f045087fe718c +0 -0
  183. {e3cli-1.0.0 → e3cli-1.0.2}/objects/9b/8451b0fde38dfc5250c52aab3ef3fd30ef616d +0 -0
  184. {e3cli-1.0.0 → e3cli-1.0.2}/objects/9d/04ed7e9c2fdc16eadb72867c45c682d0661d8e +0 -0
  185. {e3cli-1.0.0 → e3cli-1.0.2}/objects/9d/1dcfdaf1a6857c5f83dc27019c7600e1ffaff8 +0 -0
  186. {e3cli-1.0.0 → e3cli-1.0.2}/objects/9e/9190183a3e710fd6a3caabafda0395aacc4907 +0 -0
  187. {e3cli-1.0.0 → e3cli-1.0.2}/objects/a4/9ab06df8e92e9921f006c4687a8119a41f140c +0 -0
  188. {e3cli-1.0.0 → e3cli-1.0.2}/objects/a4/9e182d79178f30917cb9d5d007bf4ad4354efc +0 -0
  189. {e3cli-1.0.0 → e3cli-1.0.2}/objects/a5/374e27f1f437b7b8d795bdbba9990e1b33ac4a +0 -0
  190. {e3cli-1.0.0 → e3cli-1.0.2}/objects/a9/621b26eb6fcf44e82b8f40fe15a08db273ea94 +0 -0
  191. {e3cli-1.0.0 → e3cli-1.0.2}/objects/a9/958ca6bbbce4793eb63dfc75053f6f2c468f7d +0 -0
  192. {e3cli-1.0.0 → e3cli-1.0.2}/objects/ab/8112dc0e039a6764e18515bc8b9d25bf8cba72 +0 -0
  193. {e3cli-1.0.0 → e3cli-1.0.2}/objects/ad/86572a7a3d9c41b39f68c1509f45eeb3c47145 +0 -0
  194. {e3cli-1.0.0 → e3cli-1.0.2}/objects/ae/7c0c0693884ee9968bd46c7e3c1c4801c93f07 +0 -0
  195. {e3cli-1.0.0 → e3cli-1.0.2}/objects/af/66d7ee37e22b5b4ffcb43392bcd6fe58b7189b +0 -0
  196. {e3cli-1.0.0 → e3cli-1.0.2}/objects/b0/1eb7d29ce867088dcfec990e3a118ee7d3a3b2 +0 -0
  197. {e3cli-1.0.0 → e3cli-1.0.2}/objects/b0/6bfa35440cb0bf33a698db8b116077b885dade +0 -0
  198. {e3cli-1.0.0 → e3cli-1.0.2}/objects/b2/30e20e02ded29d01eb93f89b62ab47fb378e1f +0 -0
  199. {e3cli-1.0.0 → e3cli-1.0.2}/objects/b2/e68381120a59886f7999876775e9b3dfeaa550 +0 -0
  200. {e3cli-1.0.0 → e3cli-1.0.2}/objects/b3/a239ea6bac51a6315988af95d83e86323aa461 +0 -0
  201. {e3cli-1.0.0 → e3cli-1.0.2}/objects/b4/1e24e40f90ad6c12b6f840ecdb133b2749ca7e +0 -0
  202. {e3cli-1.0.0 → e3cli-1.0.2}/objects/b9/4bb6724a0646fb1636a66de603cec15e7dfa3e +0 -0
  203. {e3cli-1.0.0 → e3cli-1.0.2}/objects/bb/8fccf2b545f4ba46149fb07bd1f700ae7bcc87 +0 -0
  204. {e3cli-1.0.0 → e3cli-1.0.2}/objects/be/9fc276a620ea29d87e2001489e436f6e714a34 +0 -0
  205. {e3cli-1.0.0 → e3cli-1.0.2}/objects/bf/a019fa30db2df7e7732d119032e84391c3b6ce +0 -0
  206. {e3cli-1.0.0 → e3cli-1.0.2}/objects/c0/2beae1cbe94f20d2a4ef88b46bd8ade684f911 +0 -0
  207. {e3cli-1.0.0 → e3cli-1.0.2}/objects/c6/1651ba7a27cd0ff5c726c4ce79751facc64f39 +0 -0
  208. {e3cli-1.0.0 → e3cli-1.0.2}/objects/c7/f3f6ba90a1ec28fdef6ec7b10d82f4ad144969 +0 -0
  209. {e3cli-1.0.0 → e3cli-1.0.2}/objects/cb/b097bc0ed0f65614e13f563a22624f0ce078e6 +0 -0
  210. {e3cli-1.0.0 → e3cli-1.0.2}/objects/cd/3c462e6a24c9757a0fffd7c42abce926e1adf5 +0 -0
  211. {e3cli-1.0.0 → e3cli-1.0.2}/objects/ce/f38215c9c7dc239421d85ca93221ad7beb63cb +0 -0
  212. {e3cli-1.0.0 → e3cli-1.0.2}/objects/cf/286c5bf7cffc4bf93b51554d4299845172df84 +0 -0
  213. {e3cli-1.0.0 → e3cli-1.0.2}/objects/d0/aa218f92135250fa46b8490c68f4e77846b1b1 +0 -0
  214. {e3cli-1.0.0 → e3cli-1.0.2}/objects/d1/70d82f10fffbce5936fc1d0f5e1f051c354413 +0 -0
  215. {e3cli-1.0.0 → e3cli-1.0.2}/objects/d1/eccedbd9604b59bcc247b6f8a177df5486ce57 +0 -0
  216. {e3cli-1.0.0 → e3cli-1.0.2}/objects/d4/1a891e54bfd7ddd745555624ce9142a47e5fdd +0 -0
  217. {e3cli-1.0.0 → e3cli-1.0.2}/objects/d8/2d02db21187a83d77a71c8665e1b4699e481fb +0 -0
  218. {e3cli-1.0.0 → e3cli-1.0.2}/objects/d8/76cc79a2f25f4e8616805811110f700e277af2 +0 -0
  219. {e3cli-1.0.0 → e3cli-1.0.2}/objects/db/3bb89cba087a88feb4075b467732846a1d0118 +0 -0
  220. {e3cli-1.0.0 → e3cli-1.0.2}/objects/db/dc7e591f97aab4da5d2acb29194355c277acf6 +0 -0
  221. {e3cli-1.0.0 → e3cli-1.0.2}/objects/df/8c39b5b6cfcf19f8f27d5913830cb0a8fcd4c8 +0 -0
  222. {e3cli-1.0.0 → e3cli-1.0.2}/objects/df/a8267b7bcb40cc3c4524934d386516e27dd5db +0 -0
  223. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e0/87a95e8c14f5d090c04d19d3a9f91a208b7841 +0 -0
  224. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e0/e63743c9660300f76483d3ad27ecd85241cdc5 +0 -0
  225. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e2/2ab51073af126f1b602884b02dad11f9027942 +0 -0
  226. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e4/1b4051ac3bac5364f7a5ce048ecc41147857d6 +0 -0
  227. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e4/1dbd057baa81d4e660a52d2486ee700f8c7b60 +0 -0
  228. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e4/fba2702e9b6e30902b10ef946b8e05ee14b3d6 +0 -0
  229. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e5/23965887274b5a3060bca39ec005e6fe99883b +0 -0
  230. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e6/3334965c2117237f22708d1c4681be5d77574b +0 -0
  231. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  232. {e3cli-1.0.0 → e3cli-1.0.2}/objects/e8/a732d4490c14cf239dd7081c8c1d15b44c495b +0 -0
  233. {e3cli-1.0.0 → e3cli-1.0.2}/objects/eb/22d1e687a8a2dd36474c7add9535ebe9682d3b +0 -0
  234. {e3cli-1.0.0 → e3cli-1.0.2}/objects/eb/7320ad4e2f7d18b503c64b2a983c2a41fc8eb1 +0 -0
  235. {e3cli-1.0.0 → e3cli-1.0.2}/objects/ec/2badeec80e4ddc66a5168d8c3aec878a30f813 +0 -0
  236. {e3cli-1.0.0 → e3cli-1.0.2}/objects/ec/d43841d2e6e7268caf4a1bb03c3f549ca75f49 +0 -0
  237. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f0/c3d899d1d7578174419e3d21fbb43d469ea0df +0 -0
  238. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f2/d740d8021553398f98f1302398006e988697ef +0 -0
  239. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f3/505619e9502b8a75ce04cf75ccb61e54f16cf5 +0 -0
  240. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f3/681d2437d363e9865aec3eb4e3e8f5aff46ca6 +0 -0
  241. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f3/b1f01d9f8fab935f87bee101fa0f1f944c30d8 +0 -0
  242. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f3/e2082feab4cb9a889f623d8fe7b58628f82da9 +0 -0
  243. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f4/21fa018addaacd7f59e11603b182b38207abca +0 -0
  244. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f5/9e7ad7dad379a9752969e3443d3ed60a82cdf1 +0 -0
  245. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f6/d28255ddf6cd98d69342c282663771093ad834 +0 -0
  246. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f7/c7da26bbfca63ed8af08f9b7b1ace4930dad44 +0 -0
  247. {e3cli-1.0.0 → e3cli-1.0.2}/objects/f9/aece29cc134fc99f629129d46c712f015b00c0 +0 -0
  248. {e3cli-1.0.0 → e3cli-1.0.2}/objects/fb/4fbcdf3b0da9864651c5d50322b27c21f26fed +0 -0
  249. {e3cli-1.0.0 → e3cli-1.0.2}/objects/fb/ba70de6b161e2918d9d9e62d734abd85d01ae1 +0 -0
  250. {e3cli-1.0.0 → e3cli-1.0.2}/objects/fb/bc2db563e1d0b7a0745a04fd0a0c5b5ef7e6aa +0 -0
  251. {e3cli-1.0.0 → e3cli-1.0.2}/objects/fc/03924609632d9a9f820119bdf5a9ddf5a4c90a +0 -0
  252. {e3cli-1.0.0 → e3cli-1.0.2}/objects/fd/3fb430f4e9190752eb58cef5019660e9aa92ef +0 -0
  253. {e3cli-1.0.0 → e3cli-1.0.2}/objects/fd/d0e4feee582591e85b9d488dd4fa1794364abb +0 -0
  254. {e3cli-1.0.0 → e3cli-1.0.2}/objects/fe/092d97fe5a0e2a3d7b807e1a9f44735281a286 +0 -0
  255. {e3cli-1.0.0 → e3cli-1.0.2}/refs/heads/main +0 -0
  256. {e3cli-1.0.0 → e3cli-1.0.2}/refs/remotes/origin/main +0 -0
  257. {e3cli-1.0.0 → e3cli-1.0.2}/refs/tags/v0.1.0 +0 -0
  258. {e3cli-1.0.0 → e3cli-1.0.2}/refs/tags/v0.2.0 +0 -0
  259. {e3cli-1.0.0 → e3cli-1.0.2}/refs/tags/v0.3.0 +0 -0
  260. {e3cli-1.0.0 → e3cli-1.0.2}/refs/tags/v0.3.1 +0 -0
  261. {e3cli-1.0.0 → e3cli-1.0.2}/refs/tags/v0.3.2 +0 -0
  262. {e3cli-1.0.0 → e3cli-1.0.2}/refs/tags/v0.4.0 +0 -0
  263. {e3cli-1.0.0 → e3cli-1.0.2}/refs/tags/v0.4.1 +0 -0
  264. {e3cli-1.0.0 → e3cli-1.0.2}/refs/tags/v0.4.3 +0 -0
  265. {e3cli-1.0.0 → e3cli-1.0.2}/tests/__init__.py +0 -0
@@ -85,12 +85,17 @@ jobs:
85
85
  m = re.match(r'^([A-Za-z0-9]([A-Za-z0-9._-]*[A-Za-z0-9])?)', r)
86
86
  if m:
87
87
  deps.append(m.group(1).lower())
88
- sdist_url, sha = "", ""
88
+ # Prefer pure-Python wheel (py3-none-any) → no compile, much faster brew install.
89
+ # Fall back to sdist for packages without a universal wheel.
90
+ wheel_url = wheel_sha = sdist_url = sdist_sha = ""
89
91
  for f in data["releases"].get(ver, []):
90
- if f["packagetype"] == "sdist":
91
- sdist_url, sha = f["url"], f["digests"]["sha256"]
92
- break
93
- return {"name": pkg_normalized, "deps": deps, "url": sdist_url, "sha256": sha}
92
+ if f["packagetype"] == "bdist_wheel" and "py3-none-any" in f["filename"]:
93
+ wheel_url, wheel_sha = f["url"], f["digests"]["sha256"]
94
+ elif f["packagetype"] == "sdist" and not sdist_url:
95
+ sdist_url, sdist_sha = f["url"], f["digests"]["sha256"]
96
+ url = wheel_url or sdist_url
97
+ sha = wheel_sha or sdist_sha
98
+ return {"name": pkg_normalized, "deps": deps, "url": url, "sha256": sha}
94
99
 
95
100
  # Resolve ALL transitive dependencies
96
101
  seen = set()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: e3cli
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: NYCU E3 Moodle automation CLI — sync courses, download materials, submit assignments.
5
5
  Project-URL: Homepage, https://github.com/junlinwk/e3cli
6
6
  Project-URL: Repository, https://github.com/junlinwk/e3cli
@@ -1,3 +1,3 @@
1
1
  """E3CLI — NYCU E3 Moodle Automation CLI Tool"""
2
2
 
3
- __version__ = "1.0.0"
3
+ __version__ = "1.0.2"
@@ -25,7 +25,7 @@ from e3cli.api.messages import send_message
25
25
  from e3cli.api.site import get_site_info
26
26
  from e3cli.commands._common import get_client, get_db
27
27
  from e3cli.config import load_config
28
- from e3cli.course_name import display_name, display_with_code, migrate_course_dir, other_lang_name
28
+ from e3cli.course_name import display_name, display_with_code, migrate_course_dir
29
29
  from e3cli.credential import activate_profile, get_active_profile, list_profiles
30
30
  from e3cli.formatting import format_duedate, format_submission_status, sort_assignments
31
31
  from e3cli.i18n import t
@@ -188,7 +188,6 @@ def _course_list_menu(client, db, cfg, info, courses, show_all=False):
188
188
  return MenuItem(
189
189
  label,
190
190
  key=str(c["id"]),
191
- description=other_lang_name(full, short),
192
191
  )
193
192
 
194
193
  if show_all:
@@ -61,11 +61,15 @@ def parse_course_name(fullname: str, shortname: str = "") -> tuple[str, str, str
61
61
  if last_cjk == -1:
62
62
  return code, "", rest.strip()
63
63
 
64
- after = rest[last_cjk + 1:]
65
- sm = re.match(r"^\s+(.*)$", after)
66
- if sm:
67
- return code, rest[:last_cjk + 1].strip(), sm.group(1).strip()
68
- return code, rest.strip(), ""
64
+ # 從最後一個 CJK 字往後吃掉所有「非空白」字元(半形/全形括號、引號、頓號等
65
+ # 都算中文段的一部分),直到遇到第一個空白才視為中英分界。
66
+ boundary = last_cjk + 1
67
+ while boundary < len(rest) and not rest[boundary].isspace():
68
+ boundary += 1
69
+
70
+ zh = rest[:boundary].strip()
71
+ en = rest[boundary:].strip()
72
+ return code, zh, en
69
73
 
70
74
 
71
75
  def display_name(fullname: str, shortname: str = "", lang: str | None = None) -> str:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "e3cli"
7
- version = "1.0.0"
7
+ version = "1.0.2"
8
8
  description = "NYCU E3 Moodle automation CLI — sync courses, download materials, submit assignments."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -76,6 +76,40 @@ def test_parse_course_name_no_shortname():
76
76
  assert en == "Test"
77
77
 
78
78
 
79
+ def test_parse_course_name_halfwidth_parens():
80
+ code, zh, en = parse_course_name(
81
+ "1142.410024.專題研究(三) Research(III)", "1142.410024"
82
+ )
83
+ assert code == "1142.410024"
84
+ assert zh == "專題研究(三)"
85
+ assert en == "Research(III)"
86
+
87
+
88
+ def test_parse_course_name_fullwidth_parens():
89
+ code, zh, en = parse_course_name(
90
+ "1142.410024.專題研究(三) Research(III)", "1142.410024"
91
+ )
92
+ assert code == "1142.410024"
93
+ assert zh == "專題研究(三)"
94
+ assert en == "Research(III)"
95
+
96
+
97
+ def test_parse_course_name_pure_chinese_with_parens():
98
+ code, zh, en = parse_course_name("1142.410024.專題研究(三)", "1142.410024")
99
+ assert code == "1142.410024"
100
+ assert zh == "專題研究(三)"
101
+ assert en == ""
102
+
103
+
104
+ def test_parse_course_name_chinese_with_period_then_english():
105
+ # 中文後接句號或頓號再接英文(少見但要 robust)
106
+ code, zh, en = parse_course_name(
107
+ "1142.999999.資訊安全、密碼學 Information Security", "1142.999999"
108
+ )
109
+ assert zh == "資訊安全、密碼學"
110
+ assert en == "Information Security"
111
+
112
+
79
113
  def test_display_name_picks_language():
80
114
  fullname = "1142.430107.中文名稱 English Name"
81
115
  assert display_name(fullname, "1142.430107", lang="zh") == "中文名稱"
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes