首页 > 其他分享 >devtool.py

devtool.py

时间:2022-11-22 18:35:59浏览次数:36  
标签:py run args cmd devtool version str extras

devtool.py_git

一个web后端项目的开发环境便捷脚本:

#!/usr/bin/env python
import subprocess
import sys
from pathlib import Path
from typing import List, Tuple


def get_part(s: str) -> str:
choices = {"1": "patch", "2": "minor", "3": "major"}
choices.update({v: v for v in choices.values()})
try:
return choices[s]
except KeyError:
print(f"Invalid part: {s!r}")
sys.exit(1)


def run_and_echo(cmd: str) -> int:
print("-->", cmd)
return subprocess.run(cmd, shell=True).returncode


def get_current_version() -> str:
r = subprocess.run(["poetry", "version", "-s"], capture_output=True)

return r.stdout.decode().strip()


def exit_if_run_failed(cmd: str) -> None:
if rc := run_and_echo(cmd):
sys.exit(rc)


def bump():
version = get_current_version()
print(f"Current version: {version}")
if sys.argv[1:]:
part = get_part(sys.argv[1])
else:
tip = (
"Choices:\n1. patch\n2. minor\n3. major\n\n"
"Which one to bump?(Leave blank to use `patch`) "
)
if a := input(tip).strip():
part = get_part(a)
else:
part = "patch"
parse = '"(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)"' # NOQA
cmd = (
f"bumpversion --commit --parse {parse}"
f" --current-version {version} {part} pyproject.toml"
)
if part != "patch":
cmd + " --tag"
exit_if_run_failed(cmd)
exit_if_run_failed("git push && git push --tags && git log -1")


class UpgradeDependencies:
@staticmethod
def parse_extras(version_info: str, extras_tip: str) -> str:
extras_info = version_info.split(extras_tip)[-1]
return extras_info.split("[", 1)[-1].split("]")[0].replace('"', "")

@classmethod
def build_args(cls, package_lines: List[str], extras_tip: str) -> List[str]:
args: List[str] = []
for m in package_lines:
package, version_info = m.split("=", 1)
if (package := package.strip()).lower() == "python":
continue
if extras_tip in version_info:
package += "[" + cls.parse_extras(version_info, extras_tip) + "]"
args.append(f'"{package}@latest"')
else:
args.append(f"{package}@latest")
return args

@classmethod
def get_args(cls) -> Tuple[List[str], List[str]]:
main_title = "[tool.poetry.dependencies]"
dev_title = "[tool.poetry.dev-dependencies]"
toml_file = Path(__file__).parent.resolve().parent / "pyproject.toml"
text = toml_file.read_text("utf8").split(main_title)[-1]
main, dev = text.split(dev_title)
devs = dev.split("[tool.")[0].strip().splitlines()
mains = main.strip().splitlines()
extras_tip = "extras"
return cls.build_args(mains, extras_tip), cls.build_args(devs, extras_tip)


def update():
"""升级所有依赖包到最新版"""
main_args, dev_args = UpgradeDependencies.get_args()
command = "poetry add"
upgrade = "{0} {1} && {0} --dev {2}".format(
command, " ".join(main_args), " ".join(dev_args)
)
exit_if_run_failed(upgrade)


def lint(remove=None):
"""pep8+mypy"""
remove_imports = "autoflake --in-place --remove-all-unused-imports"
cmd = ""
paths = "."
if args := sys.argv[1:]:
if (flag := "-r") in args:
if remove is None:
remove = True
args = [i for i in args if i != flag]
paths = " ".join(args)
if remove and all(Path(i).is_file() for i in args):
cmd = f"{remove_imports} {paths} && " + cmd
lint_them = "{0} {2} {1} && {0} {3} {1} && {0} {4} {1} && {0} {5} {1}"
tools = ("isort", "black", "pflake8", "mypy")
cmd += lint_them.format("poetry run", paths, *tools)
exit_if_run_failed(cmd)


def dev():
"""启动服务:相当于django的runserver"""
cmd = "poetry run python main.py"
if args := sys.argv[1:]:
cmd += " " + " ".join(args)
exit_if_run_failed(cmd)


def makemigrations():
exit_if_run_failed("aerich migrate")


def migrate():
"""更新数据库表结构:相当于django的./manage.py migrate"""
exit_if_run_failed("aerich upgrade")

代码可读性,我觉得还是很Nice。有不同意见的,欢迎来怼~

标签:py,run,args,cmd,devtool,version,str,extras
From: https://blog.51cto.com/u_15003512/5878318

相关文章

  • Python中除了lambda函数能实现一句话程序,还有什么方式能够实现呢?
    引言我们都知道python中使用lambda函数能够实现一句话程序,一句话能实现复杂功能,是一件多么炫酷的事情.但也是有利有弊的,至少一句话代码虽然简洁,但可读性不好,毕竟现实中......
  • Python 命令行参数
    Python命令行参数参考文章:https://zhuanlan.zhihu.com/p/56922793目标:编写出可执行参数的脚本文件并打包;1.sys模块方法使用sys.argv获取执行参数;"""开发终端参......
  • 2211-22学习记录之python百分数,time模块
    百分数print('{:.0%}'.format(84/100))输出为84%以上百分数输出是使用到了字符串格式化函数format(),在其中将分数42/50作为值给传递了进去。如果将分子分母同时乘以2......
  • 2. pycharm终端提示无法加载文件 F:\Users\Administrator\PycharmProjects\python
    问题如下:终端(terminnal)遇到下面红色问题。   怎么解决??pycharm终端提示无法加载文件F:\Users\Administrator\PycharmProjects\pythonProject\venv\Scripts\activa......
  • python之路33 MySQL 1
    存取数据的演变1.文本文件文件路径不固定:C:\aaa.txtD:\bbb.txtE:\ccc.txt数据格式不统一:jason|123jason$123jason1232.软件开发目录规范规定......
  • 几句话说清python中的零宽断言
    1、所谓零宽,是指”一个字符位置,不占字符宽度“。故称为“零宽”。2、所谓的先行断言,后发断言,......等等不一而足的种种称谓,只能徒增初学者理解上的困难。其实,以正则表达式中......
  • Python中 "is" "in""=="三个的区别含义
    1."is","in","=="的意思?"is":判断两个对象的标识符(通常所说的内存地址)是否相同。"in":用于成员检测,判断一个对象是否在另一个对象里面。"==":判断内容或者地址......
  • 20221122-Python格式化字符串
    1.格式化字符串       ......
  • 爬虫为什么喜欢用 python
    说到网络爬虫,相信大家都很熟悉。爬虫可以捕捉某个网站或应用程序的内容,提取有用的价值信息。爬虫可以使用多种编程语言,但Python确实是很常用的。你知道为什么吗?让......
  • 【Python】pandas 筛选满足多个条件的数据
    筛选满足条件的数据行#dfdf[(df['name']=='name1')&(df['sex']=='male')]更改相关参数#df1,df2a=df1[(df1['企业名称']==value)&(df1['统一社会信用代......