|
807 | 807 | "outputs": [], |
808 | 808 | "source": [ |
809 | 809 | "#| export\n", |
810 | | - "def bump_version(v, part=2, unbump=False):\n", |
811 | | - " \"Bump semver part `part` (0=major, 1=minor, 2=patch), counted from the right\"\n", |
812 | | - " parts = (v or '0.0.0').split('.')\n", |
| 810 | + "def bump_version(v, part=None, unbump=False):\n", |
| 811 | + " \"Bump `.postN` by default when present, otherwise a semver part counted from the right\"\n", |
| 812 | + " v = v or '0.0.0'\n", |
| 813 | + " post = re.fullmatch(r'(.*)\\.post(\\d+)', v)\n", |
| 814 | + " if part is None and post:\n", |
| 815 | + " n = max(0, int(post[2]) + (-1 if unbump else 1))\n", |
| 816 | + " return f'{post[1]}.post{n}'\n", |
| 817 | + " if part is None: part = 2\n", |
| 818 | + " parts = (post[1] if post else v).split('.')\n", |
813 | 819 | " parts += ['0'] * (3 - len(parts))\n", |
814 | 820 | " idx = len(parts) - 3 + part\n", |
815 | 821 | " parts[idx] = str(int(parts[idx]) + (-1 if unbump else 1))\n", |
|
844 | 850 | "test_eq(bump_version('1.2.3', part=2, unbump=True), '1.2.2')\n", |
845 | 851 | "test_eq(bump_version('2026.05.27.2'), '2026.05.27.3')\n", |
846 | 852 | "test_eq(bump_version('2026.05.27.2', part=1), '2026.05.28.0')\n", |
847 | | - "test_eq(bump_version('2026.05.27.2', part=0), '2026.6.0.0')" |
| 853 | + "test_eq(bump_version('2026.05.27.2', part=0), '2026.6.0.0')\n", |
| 854 | + "test_eq(bump_version('0.0.2026082005.post1'), '0.0.2026082005.post2')\n", |
| 855 | + "test_eq(bump_version('0.0.2026082005.post2', unbump=True), '0.0.2026082005.post1')\n", |
| 856 | + "test_eq(bump_version('0.0.2026082005.post1', part=2), '0.0.2026082006')" |
848 | 857 | ] |
849 | 858 | }, |
850 | 859 | { |
|
0 commit comments