glinkfix 2.2.0__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.0 → glinkfix-2.2.2}/CHANGELOG.md +31 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/PKG-INFO +5 -4
- {glinkfix-2.2.0 → glinkfix-2.2.2}/README.md +4 -3
- {glinkfix-2.2.0 → glinkfix-2.2.2}/justfile +5 -18
- {glinkfix-2.2.0 → glinkfix-2.2.2}/pyproject.toml +1 -1
- {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/dependency_upgrade_commit.py +4 -3
- {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/release_tags.sh +6 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/upgrade_dependencies.sh +1 -5
- {glinkfix-2.2.0 → 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.0 → glinkfix-2.2.2}/LICENSE +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/assets/glinkfix-logo.png +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/assets/google-drive-copy-link.png +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/assets/google-drive-get-link.png +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/changelogs/v1.0.x.md +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/changelogs/v1.2.x.md +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/changelogs/v2.0.x.md +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/changelogs/v2.1.x.md +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/archive_changelog.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/extract_release_notes.sh +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/__init__.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/__main__.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/app.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/links.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/py.typed +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/__init__.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/test_app_entry_points.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/test_archive_changelog.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/test_extract_release_notes.py +0 -0
- {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/test_fixlink.py +0 -0
|
@@ -1,3 +1,34 @@
|
|
|
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
|
+
|
|
22
|
+
## 2.2.1 (2026-05-23)
|
|
23
|
+
|
|
24
|
+
### 🐛 Bug Fixes
|
|
25
|
+
|
|
26
|
+
- Fix broken links in README (cc3ef62)
|
|
27
|
+
|
|
28
|
+
### ⚙️ Miscellaneous Tasks
|
|
29
|
+
|
|
30
|
+
- Add github release workflow (d7f618d)
|
|
31
|
+
|
|
1
32
|
## 2.2.0 (2026-05-22)
|
|
2
33
|
|
|
3
34
|
### 🛠️ Changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: glinkfix
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.2
|
|
4
4
|
Summary: Google Drive Link Fixer
|
|
5
5
|
Keywords: glinkfix,google,drive,link,curl,markdown,embed,image,download
|
|
6
6
|
Author: Peter Nardi
|
|
@@ -42,7 +42,8 @@ Description-Content-Type: text/markdown
|
|
|
42
42
|
|
|
43
43
|
<br>
|
|
44
44
|
|
|
45
|
-
<img src="assets/glinkfix-logo.png"
|
|
45
|
+
<img src="https://raw.githubusercontent.com/geozeke/glinkfix/main/assets/glinkfix-logo.png"
|
|
46
|
+
alt="glinkfix logo" width="120"/>
|
|
46
47
|
|
|
47
48
|
## Google Drive Link Fixer
|
|
48
49
|
|
|
@@ -129,12 +130,12 @@ _Note: The images below demonstrate Google Drive sharing links and their
|
|
|
129
130
|
Start by getting a sharing link to a file on Google Drive. Make sure
|
|
130
131
|
it's set up for public access (_Anyone with the link_):
|
|
131
132
|
|
|
132
|
-
<img src="assets/google-drive-get-link.png"
|
|
133
|
+
<img src="https://raw.githubusercontent.com/geozeke/glinkfix/main/assets/google-drive-get-link.png"
|
|
133
134
|
alt="Getting Link" width="450"/>
|
|
134
135
|
|
|
135
136
|
---
|
|
136
137
|
|
|
137
|
-
<img src="assets/google-drive-copy-link.png"
|
|
138
|
+
<img src="https://raw.githubusercontent.com/geozeke/glinkfix/main/assets/google-drive-copy-link.png"
|
|
138
139
|
alt="Copying Link" width="450"/>
|
|
139
140
|
|
|
140
141
|
Now run _glinkfix_ with the sharing link:
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
|
|
14
14
|
<br>
|
|
15
15
|
|
|
16
|
-
<img src="assets/glinkfix-logo.png"
|
|
16
|
+
<img src="https://raw.githubusercontent.com/geozeke/glinkfix/main/assets/glinkfix-logo.png"
|
|
17
|
+
alt="glinkfix logo" width="120"/>
|
|
17
18
|
|
|
18
19
|
## Google Drive Link Fixer
|
|
19
20
|
|
|
@@ -100,12 +101,12 @@ _Note: The images below demonstrate Google Drive sharing links and their
|
|
|
100
101
|
Start by getting a sharing link to a file on Google Drive. Make sure
|
|
101
102
|
it's set up for public access (_Anyone with the link_):
|
|
102
103
|
|
|
103
|
-
<img src="assets/google-drive-get-link.png"
|
|
104
|
+
<img src="https://raw.githubusercontent.com/geozeke/glinkfix/main/assets/google-drive-get-link.png"
|
|
104
105
|
alt="Getting Link" width="450"/>
|
|
105
106
|
|
|
106
107
|
---
|
|
107
108
|
|
|
108
|
-
<img src="assets/google-drive-copy-link.png"
|
|
109
|
+
<img src="https://raw.githubusercontent.com/geozeke/glinkfix/main/assets/google-drive-copy-link.png"
|
|
109
110
|
alt="Copying Link" width="450"/>
|
|
110
111
|
|
|
111
112
|
Now run _glinkfix_ with the sharing link:
|
|
@@ -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
|