package_util.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import os
  2. import re
  3. import time
  4. from pathlib import Path
  5. from typing import Tuple
  6. import requests
  7. from tools import loggerKit
  8. # PROXY = "http://127.0.0.1:7890"
  9. PROXY = None
  10. class enter_package:
  11. """进入包目录"""
  12. def __init__(self, package: str):
  13. self.package = package
  14. def __enter__(self):
  15. # 进入包目录
  16. os.chdir(Path("packages") / self.package)
  17. time.sleep(0.1)
  18. def __exit__(self, exc_type, exc_val, exc_tb):
  19. # 返回上一级目录
  20. os.chdir("../..")
  21. time.sleep(0.1)
  22. def get_current_pkg() -> Tuple[str, str]:
  23. """获取当前包的名称和版本号"""
  24. pyproject_text = Path("pyproject.toml").read_text(encoding="utf-8")
  25. pkg_name, pkg_version = (
  26. re.findall(r'name ?= ?"(.*)"', pyproject_text)[0],
  27. re.findall(r'version ?= ?"(.*)"', pyproject_text)[0],
  28. )
  29. if pkg_name and pkg_version:
  30. return pkg_name, pkg_version
  31. raise Exception("No valid pyproject.toml found.")
  32. def fetch_pkg_latest_version(pkg_name: str, proxy=PROXY) -> str:
  33. """在线获取包最新版本号"""
  34. try:
  35. res = requests.get(
  36. f"https://pypi.org/pypi/{pkg_name}/json",
  37. proxies={"http": proxy, "https": proxy} if proxy else None,
  38. ).json()
  39. except Exception:
  40. return ""
  41. try:
  42. if res["info"]["version"]:
  43. return res["info"]["version"]
  44. except Exception:
  45. pass
  46. try:
  47. if res["message"] == "Not Found":
  48. return "-"
  49. except Exception:
  50. pass
  51. return ""
  52. def install_package(package: str):
  53. """安装包与依赖"""
  54. with enter_package(package):
  55. pkg_name, pkg_version = get_current_pkg()
  56. loggerKit.info(f"Installing package {package}...")
  57. if Path("poetry.lock").exists():
  58. # 更新 poetry.lock
  59. os.system("poetry lock --no-update")
  60. # 安装依赖
  61. os.system("poetry install")
  62. loggerKit.info(f"Package {pkg_name} install success!\n")
  63. def clean_package_env(package: str):
  64. """清理包环境"""
  65. with enter_package(package):
  66. pkg_name, pkg_version = get_current_pkg()
  67. # 删除构建文件
  68. for file in Path("dist").glob("*"):
  69. file.unlink()
  70. # 删除缓存文件
  71. for file in Path("build").glob("*"):
  72. file.unlink()
  73. # 删除 .venv 目录
  74. if Path(".venv").exists():
  75. for file in Path(".venv").glob("*"):
  76. file.unlink()
  77. Path(".venv").rmdir()
  78. loggerKit.info(f"Package {pkg_name} clean success!\n")
  79. def test_package(package: str):
  80. """测试包"""
  81. install_package(package)
  82. with enter_package(package):
  83. pkg_name, pkg_version = get_current_pkg()
  84. # 执行测试
  85. pyproject = Path("pyproject.toml").read_text(encoding="utf-8")
  86. if "test" in pyproject:
  87. loggerKit.info("Running tests...")
  88. try:
  89. assert os.system("poetry run test") == 0
  90. except AssertionError:
  91. loggerKit.error(f"Package {pkg_name} test failed.")
  92. exit(1)
  93. else:
  94. loggerKit.info("No tests found. Skipping...")
  95. loggerKit.info(f"Package {pkg_name} test passed.\n")
  96. def build_package(package: str):
  97. """构建包"""
  98. install_package(package)
  99. with enter_package(package):
  100. pkg_name, pkg_version = get_current_pkg()
  101. # 删除旧的构建文件
  102. for file in Path("dist").glob("*"):
  103. file.unlink()
  104. # 执行构建
  105. try:
  106. assert os.system("poetry build") == 0
  107. except AssertionError:
  108. loggerKit.error(f"Package {pkg_name} build failed.")
  109. exit(1)
  110. loggerKit.info(f"Package {pkg_name} build success!\n")
  111. def publish_package(package: str):
  112. """发布包"""
  113. with enter_package(package):
  114. pkg_name, pkg_version = get_current_pkg()
  115. # 检查是否已经发布
  116. latest_version = fetch_pkg_latest_version(pkg_name)
  117. if latest_version == pkg_version:
  118. loggerKit.info(f"Package {pkg_name} is already published.")
  119. return
  120. # 执行发布
  121. try:
  122. assert os.system("poetry publish") == 0
  123. except AssertionError:
  124. loggerKit.error(f"Package {pkg_name} publish failed.")
  125. exit(1)
  126. loggerKit.info(f"Package {pkg_name} publish success!\n")