glinkfix 2.2.1__tar.gz → 2.2.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.
- {glinkfix-2.2.1 → glinkfix-2.2.2}/CHANGELOG.md +21 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/PKG-INFO +1 -1
- {glinkfix-2.2.1 → glinkfix-2.2.2}/justfile +5 -18
- {glinkfix-2.2.1 → glinkfix-2.2.2}/pyproject.toml +1 -1
- {glinkfix-2.2.1 → glinkfix-2.2.2}/scripts/dependency_upgrade_commit.py +4 -3
- {glinkfix-2.2.1 → glinkfix-2.2.2}/scripts/release_tags.sh +6 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/scripts/upgrade_dependencies.sh +1 -5
- {glinkfix-2.2.1 → glinkfix-2.2.2}/tests/test_dependency_upgrade_commit.py +3 -1
- glinkfix-2.2.2/tests/test_release_tags.py +72 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/LICENSE +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/README.md +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/assets/glinkfix-logo.png +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/assets/google-drive-copy-link.png +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/assets/google-drive-get-link.png +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/changelogs/v1.0.x.md +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/changelogs/v1.2.x.md +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/changelogs/v2.0.x.md +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/changelogs/v2.1.x.md +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/scripts/archive_changelog.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/scripts/extract_release_notes.sh +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/src/glinkfix/__init__.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/src/glinkfix/__main__.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/src/glinkfix/app.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/src/glinkfix/links.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/src/glinkfix/py.typed +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/tests/__init__.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/tests/test_app_entry_points.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/tests/test_archive_changelog.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/tests/test_extract_release_notes.py +0 -0
- {glinkfix-2.2.1 → glinkfix-2.2.2}/tests/test_fixlink.py +0 -0
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
## 2.2.2 (2026-07-03)
|
|
2
|
+
|
|
3
|
+
### 🐛 Bug Fixes
|
|
4
|
+
|
|
5
|
+
- Lint project tooling (184fc5e)
|
|
6
|
+
|
|
7
|
+
### 🗑️ Removed
|
|
8
|
+
|
|
9
|
+
- Remove "dev" recipe from justfile (bda0d17)
|
|
10
|
+
|
|
11
|
+
### 📦 Dependency Upgrades
|
|
12
|
+
|
|
13
|
+
- DEPS-See commit msg for list (0a54dd7)
|
|
14
|
+
- DEPS-See commit msg for list (434363a)
|
|
15
|
+
- DEPS-See commit msg for list (552413e)
|
|
16
|
+
- DEPS-See commit msg for list (c63537d)
|
|
17
|
+
|
|
18
|
+
### ⚙️ Miscellaneous Tasks
|
|
19
|
+
|
|
20
|
+
- Prevent latest tagging of beta builds (0faa345)
|
|
21
|
+
|
|
1
22
|
## 2.2.1 (2026-05-23)
|
|
2
23
|
|
|
3
24
|
### 🐛 Bug Fixes
|
|
@@ -106,16 +106,6 @@ coverage-open: coverage
|
|
|
106
106
|
|
|
107
107
|
# --------------------------------------------
|
|
108
108
|
|
|
109
|
-
# Provision development dependencies
|
|
110
|
-
dev: _require_setup
|
|
111
|
-
#!/usr/bin/env bash
|
|
112
|
-
export UV_CACHE_DIR="${UV_CACHE_DIR:-.uv-cache}"
|
|
113
|
-
export UV_PYTHON_PREFERENCE=only-managed
|
|
114
|
-
uv sync --all-groups --frozen
|
|
115
|
-
touch .init/dev
|
|
116
|
-
|
|
117
|
-
# --------------------------------------------
|
|
118
|
-
|
|
119
109
|
# Format Python files and apply fixable Ruff lint rules
|
|
120
110
|
format:
|
|
121
111
|
UV_CACHE_DIR="${UV_CACHE_DIR:-.uv-cache}" uv run ruff check --fix .
|
|
@@ -199,16 +189,17 @@ setup:
|
|
|
199
189
|
fi
|
|
200
190
|
mkdir -p scratch .init
|
|
201
191
|
touch .init/setup
|
|
202
|
-
export UV_CACHE_DIR="${UV_CACHE_DIR:-.uv-cache}"
|
|
203
|
-
export UV_PYTHON_PREFERENCE=only-managed
|
|
204
|
-
uv sync --frozen --no-dev
|
|
205
192
|
else
|
|
206
193
|
echo "Initial setup is already complete. If you are having issues, run:"
|
|
207
194
|
echo
|
|
208
195
|
echo "just reset"
|
|
209
196
|
echo "just setup"
|
|
210
197
|
echo
|
|
198
|
+
exit 0
|
|
211
199
|
fi
|
|
200
|
+
export UV_CACHE_DIR="${UV_CACHE_DIR:-.uv-cache}"
|
|
201
|
+
export UV_PYTHON_PREFERENCE=only-managed
|
|
202
|
+
uv sync --all-groups --frozen
|
|
212
203
|
|
|
213
204
|
# --------------------------------------------
|
|
214
205
|
|
|
@@ -216,11 +207,7 @@ setup:
|
|
|
216
207
|
sync: _require_setup
|
|
217
208
|
#!/usr/bin/env bash
|
|
218
209
|
export UV_CACHE_DIR="${UV_CACHE_DIR:-.uv-cache}"
|
|
219
|
-
|
|
220
|
-
uv sync --all-groups
|
|
221
|
-
else
|
|
222
|
-
uv sync --no-dev
|
|
223
|
-
fi
|
|
210
|
+
uv sync --all-groups
|
|
224
211
|
|
|
225
212
|
# --------------------------------------------
|
|
226
213
|
|
|
@@ -13,15 +13,16 @@ import sys
|
|
|
13
13
|
from dataclasses import dataclass
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
if sys.version_info >= (3, 11):
|
|
17
17
|
import tomllib
|
|
18
|
-
|
|
18
|
+
else:
|
|
19
19
|
import tomli as tomllib
|
|
20
20
|
|
|
21
21
|
COMMIT_SUBJECT = "deps: DEPS-See commit msg for list"
|
|
22
22
|
NAME_PATTERN = re.compile(r"^\s*([A-Za-z0-9_.-]+)")
|
|
23
23
|
OUTDATED_TREE_PATTERN = re.compile(
|
|
24
|
-
r"^[\s│]*[├└]── (?P<name>[A-Za-z0-9_.-]+)
|
|
24
|
+
r"^[\s│]*(?:[├└]── )?(?P<name>[A-Za-z0-9_.-]+)"
|
|
25
|
+
r"(?:\[[^\]]+\])? v\S+ .*latest:"
|
|
25
26
|
)
|
|
26
27
|
|
|
27
28
|
|
|
@@ -37,6 +37,12 @@ version=$(grep -E '^version *= *"' "$PYPROJECT" | \
|
|
|
37
37
|
sed -E 's/version *= *"([^"]+)"/\1/')
|
|
38
38
|
tag="v$version"
|
|
39
39
|
|
|
40
|
+
if [[ "$TAG_LATEST" == true && "$version" == *-* ]]; then
|
|
41
|
+
echo "Error: Refusing to move 'latest' for prerelease version '$version'."
|
|
42
|
+
echo "Use 'just tag-release' for beta and release candidate versions."
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
40
46
|
# Ensure we're on the main branch
|
|
41
47
|
current_branch=$(git -C "$PROJECT_ROOT" rev-parse --abbrev-ref HEAD)
|
|
42
48
|
if [[ "$current_branch" != "main" ]]; then
|
|
@@ -25,11 +25,7 @@ uv run python scripts/dependency_upgrade_commit.py snapshot \
|
|
|
25
25
|
--lockfile uv.lock \
|
|
26
26
|
--output "$before_versions"
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
dependency_scope=(--all-groups)
|
|
30
|
-
else
|
|
31
|
-
dependency_scope=(--no-dev)
|
|
32
|
-
fi
|
|
28
|
+
dependency_scope=(--all-groups)
|
|
33
29
|
|
|
34
30
|
uv tree --outdated --depth=1 "${dependency_scope[@]}" > "$outdated_tree"
|
|
35
31
|
uv run python scripts/dependency_upgrade_commit.py outdated \
|
|
@@ -86,10 +86,12 @@ def test_dependency_updates_ignores_transitive_only_changes() -> None:
|
|
|
86
86
|
def test_outdated_first_order_packages_ignores_transitive_packages() -> None:
|
|
87
87
|
"""Test parsing outdated first-order packages from ``uv tree`` output."""
|
|
88
88
|
dependencies = {
|
|
89
|
+
"coverage": "coverage",
|
|
89
90
|
"pyperclip": "pyperclip",
|
|
90
91
|
"pytest": "pytest",
|
|
91
92
|
}
|
|
92
93
|
tree_output = """Resolved 12 packages in 3ms
|
|
94
|
+
coverage[toml] v7.14.0 (group: dev) (latest: v7.14.1)
|
|
93
95
|
glinkfix v2.1.0
|
|
94
96
|
├── pyperclip v1.9.0 (latest: v1.11.0)
|
|
95
97
|
├── pytest v8.3.3 (latest: v9.0.3) (group: dev)
|
|
@@ -102,7 +104,7 @@ glinkfix v2.1.0
|
|
|
102
104
|
tree_output,
|
|
103
105
|
)
|
|
104
106
|
|
|
105
|
-
assert packages == ["pyperclip", "pytest"]
|
|
107
|
+
assert packages == ["coverage", "pyperclip", "pytest"]
|
|
106
108
|
|
|
107
109
|
|
|
108
110
|
def test_render_commit_message_lists_changed_direct_dependencies() -> None:
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""Tests for release tag generation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import shutil
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
pytestmark = pytest.mark.skipif(
|
|
13
|
+
sys.platform == "win32",
|
|
14
|
+
reason="release_tags.sh is a Bash release helper",
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def release_script(tmp_path: Path, version: str) -> Path:
|
|
19
|
+
scripts_path = tmp_path / "scripts"
|
|
20
|
+
scripts_path.mkdir()
|
|
21
|
+
script_path = scripts_path / "release_tags.sh"
|
|
22
|
+
shutil.copy(Path("scripts/release_tags.sh"), script_path)
|
|
23
|
+
(tmp_path / "pyproject.toml").write_text(
|
|
24
|
+
f'[project]\nname = "glinkfix"\nversion = "{version}"\n',
|
|
25
|
+
encoding="utf-8",
|
|
26
|
+
)
|
|
27
|
+
return script_path
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def run_release_script(
|
|
31
|
+
script_path: Path, *args: str
|
|
32
|
+
) -> subprocess.CompletedProcess[str]:
|
|
33
|
+
return subprocess.run(
|
|
34
|
+
["bash", str(script_path), *args],
|
|
35
|
+
check=False,
|
|
36
|
+
capture_output=True,
|
|
37
|
+
text=True,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.mark.parametrize("version", ["2.3.0-beta.1", "2.3.0-rc.1"])
|
|
42
|
+
def test_latest_refuses_beta_and_release_candidate_before_git(
|
|
43
|
+
tmp_path: Path, version: str
|
|
44
|
+
) -> None:
|
|
45
|
+
result = run_release_script(release_script(tmp_path, version), "--latest")
|
|
46
|
+
|
|
47
|
+
assert result.returncode == 1
|
|
48
|
+
assert (
|
|
49
|
+
f"Error: Refusing to move 'latest' for prerelease version '{version}'."
|
|
50
|
+
in result.stdout
|
|
51
|
+
)
|
|
52
|
+
assert (
|
|
53
|
+
"Use 'just tag-release' for beta and release candidate versions."
|
|
54
|
+
in result.stdout
|
|
55
|
+
)
|
|
56
|
+
assert "not a git repository" not in result.stderr
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_tag_release_allows_prerelease_versions(tmp_path: Path) -> None:
|
|
60
|
+
result = run_release_script(release_script(tmp_path, "2.3.0-rc.1"))
|
|
61
|
+
|
|
62
|
+
assert result.returncode != 1
|
|
63
|
+
assert "Refusing to move 'latest'" not in result.stdout
|
|
64
|
+
assert "not a git repository" in result.stderr
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_latest_stable_version_reaches_git_checks(tmp_path: Path) -> None:
|
|
68
|
+
result = run_release_script(release_script(tmp_path, "2.3.0"), "--latest")
|
|
69
|
+
|
|
70
|
+
assert result.returncode != 1
|
|
71
|
+
assert "Refusing to move 'latest'" not in result.stdout
|
|
72
|
+
assert "not a git repository" in result.stderr
|
|
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
|