|
| 1 | +import argparse, re, sys |
| 2 | +from pathlib import Path |
| 3 | +from types import SimpleNamespace as sn |
| 4 | + |
| 5 | +from lib import data, git, log, toml |
| 6 | + |
| 7 | +paths = sn(root=Path(__file__).parent.parent) |
| 8 | +paths.pyproject = paths.root / 'pyproject.toml' |
| 9 | +paths.readme = paths.root / 'docs/README.md' |
| 10 | +paths.util_msgs = paths.root / 'utils/data/messages.json' |
| 11 | + |
| 12 | +msgs = sn(**{ key:val['message'] for key,val in data.json.read(paths.util_msgs)['bump'].items() }) |
| 13 | + |
| 14 | +def parse_args(): |
| 15 | + argp = argparse.ArgumentParser(description=msgs.app_DESC, add_help=False) |
| 16 | + argp.add_argument('-M', '--major', action='store_true', help=msgs.help_MAJOR) |
| 17 | + argp.add_argument('-m', '--minor', action='store_true', help=msgs.help_MINOR) |
| 18 | + argp.add_argument('-p', '--patch', action='store_true', help=msgs.help_PATCH) |
| 19 | + argp.add_argument('-n', '--no-commit', '--skip-commit', action='store_true', help=msgs.help_NO_COMMIT) |
| 20 | + argp.add_argument('-N', '--no-push', '--skip-push', action='store_true', help=msgs.help_NO_PUSH) |
| 21 | + argp.add_argument('-h', '--help', action='help', help=msgs.help_HELP) |
| 22 | + return argp.parse_args() |
| 23 | + |
| 24 | +def init_vers(project, bump_type): |
| 25 | + prev_ver = project.version |
| 26 | + major, minor, patch = map(int, prev_ver.split('.')) |
| 27 | + if bump_type == 'major' : patch = 0 ; minor = 0 ; major += 1 |
| 28 | + elif bump_type == 'minor' : patch = 0 ; minor += 1 |
| 29 | + elif bump_type == 'patch' : patch += 1 |
| 30 | + new_ver = f'{major}.{minor}.{patch}' |
| 31 | + return prev_ver, new_ver |
| 32 | + |
| 33 | +def bump_pyproject_vers(pyproject, project, new_ver): |
| 34 | + |
| 35 | + # Bump project.version |
| 36 | + pyproject['project']['version'] = new_ver |
| 37 | + toml.write(paths.pyproject, pyproject) |
| 38 | + log.success(msgs.log_BUMPED_PROJECT_VER.format(prev_ver=project.version, **locals())) |
| 39 | + |
| 40 | + # Bump project.urls['Releases'] |
| 41 | + new_ver_tag = f'{project.name}-{new_ver}' |
| 42 | + changelog_url = f"{project.urls['Releases']}/tag/{new_ver_tag}" |
| 43 | + log.debug(f'{msgs.log_GENERATED_CLOG_URL}: {changelog_url}') |
| 44 | + log.info(f'{msgs.log_UPDATING_CLOG_URL_IN} pyproject.toml...') |
| 45 | + pyproject['project']['urls']['Changelog'] = changelog_url |
| 46 | + toml.write(paths.pyproject, pyproject) |
| 47 | + log.success(msgs.log_BUMPED_CLOG_URL_VER_TAG.format(**locals())) |
| 48 | + |
| 49 | +def update_readme_vers(new_ver): |
| 50 | + log.info(f'{msgs.log_UPDATING_VERS_IN} docs/README.md...') |
| 51 | + updated_readme_content = re.sub(r'\b(?>\d{1,3}\.\d{1,3}\.\d{1,3})\b', new_ver, data.file.read(paths.readme)) |
| 52 | + data.file.write(paths.readme, updated_readme_content) |
| 53 | + log.success(msgs.log_UPDATED_README_VERS.format(**locals())) |
| 54 | + |
| 55 | +def main(): |
| 56 | + |
| 57 | + # Parse args |
| 58 | + args = parse_args() |
| 59 | + bump_type = 'major' if args.major else 'minor' if args.minor else 'patch' if args.patch else None |
| 60 | + if not bump_type: |
| 61 | + log.error(msgs.err_MISSING_BUMP_TYPE_ARG) |
| 62 | + sys.exit(1) |
| 63 | + |
| 64 | + # Init project data |
| 65 | + log.info(f'{msgs.log_LOADING_PYPROJECT.format(pyproject_path=paths.pyproject)}...') |
| 66 | + pyproject = toml.read(paths.pyproject) |
| 67 | + project = sn(**pyproject['project']) |
| 68 | + |
| 69 | + # Update files |
| 70 | + _, new_ver = init_vers(project, bump_type) |
| 71 | + bump_pyproject_vers(pyproject, project, new_ver) |
| 72 | + update_readme_vers(new_ver) |
| 73 | + |
| 74 | + # Git commit/push |
| 75 | + if args.no_commit: |
| 76 | + print(f'\n{msgs.log_SKIPPING_GIT_COMMIT}...') |
| 77 | + else: |
| 78 | + git.init_kudo_sync_bot(msgs) |
| 79 | + log.info(f'{msgs.log_COMMITTING_CHANGES}...') |
| 80 | + git.commit([str(paths.readme)], |
| 81 | + f'Updated {project.name} versions in README URLs to {new_ver}', '-n') |
| 82 | + if args.no_push: |
| 83 | + print(f'\n{msgs.log_SKIPPING_GIT_PUSH}...') |
| 84 | + else: |
| 85 | + log.info(f'{msgs.log_PUSHING_CHANGES}...') |
| 86 | + git.push() |
| 87 | + log.success(f'{msgs.log_PUSHED_ALL_COMMITS}') |
| 88 | + git.restore_og_config(msgs) |
| 89 | + |
| 90 | + log.success(f'{msgs.log_SUCCESS}! {project.name} {msgs.log_BUMPED_TO} v{new_ver}!') |
| 91 | + |
| 92 | +if __name__ == '__main__' : main() |
0 commit comments