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.
Files changed (30) hide show
  1. {glinkfix-2.2.0 → glinkfix-2.2.2}/CHANGELOG.md +31 -0
  2. {glinkfix-2.2.0 → glinkfix-2.2.2}/PKG-INFO +5 -4
  3. {glinkfix-2.2.0 → glinkfix-2.2.2}/README.md +4 -3
  4. {glinkfix-2.2.0 → glinkfix-2.2.2}/justfile +5 -18
  5. {glinkfix-2.2.0 → glinkfix-2.2.2}/pyproject.toml +1 -1
  6. {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/dependency_upgrade_commit.py +4 -3
  7. {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/release_tags.sh +6 -0
  8. {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/upgrade_dependencies.sh +1 -5
  9. {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/test_dependency_upgrade_commit.py +3 -1
  10. glinkfix-2.2.2/tests/test_release_tags.py +72 -0
  11. {glinkfix-2.2.0 → glinkfix-2.2.2}/LICENSE +0 -0
  12. {glinkfix-2.2.0 → glinkfix-2.2.2}/assets/glinkfix-logo.png +0 -0
  13. {glinkfix-2.2.0 → glinkfix-2.2.2}/assets/google-drive-copy-link.png +0 -0
  14. {glinkfix-2.2.0 → glinkfix-2.2.2}/assets/google-drive-get-link.png +0 -0
  15. {glinkfix-2.2.0 → glinkfix-2.2.2}/changelogs/v1.0.x.md +0 -0
  16. {glinkfix-2.2.0 → glinkfix-2.2.2}/changelogs/v1.2.x.md +0 -0
  17. {glinkfix-2.2.0 → glinkfix-2.2.2}/changelogs/v2.0.x.md +0 -0
  18. {glinkfix-2.2.0 → glinkfix-2.2.2}/changelogs/v2.1.x.md +0 -0
  19. {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/archive_changelog.py +0 -0
  20. {glinkfix-2.2.0 → glinkfix-2.2.2}/scripts/extract_release_notes.sh +0 -0
  21. {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/__init__.py +0 -0
  22. {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/__main__.py +0 -0
  23. {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/app.py +0 -0
  24. {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/links.py +0 -0
  25. {glinkfix-2.2.0 → glinkfix-2.2.2}/src/glinkfix/py.typed +0 -0
  26. {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/__init__.py +0 -0
  27. {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/test_app_entry_points.py +0 -0
  28. {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/test_archive_changelog.py +0 -0
  29. {glinkfix-2.2.0 → glinkfix-2.2.2}/tests/test_extract_release_notes.py +0 -0
  30. {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.0
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" alt="glinkfix logo" width="120"/>
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" alt="glinkfix logo" width="120"/>
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
- if [ -f .init/dev ]; then
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
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "glinkfix"
3
- version = "2.2.0"
3
+ version = "2.2.2"
4
4
  description = "Google Drive Link Fixer"
5
5
  authors = [{ name = "Peter Nardi", email = "geozeke@gmail.com" }]
6
6
  maintainers = [{ name = "Peter Nardi", email = "geozeke@gmail.com" }]
@@ -13,15 +13,16 @@ import sys
13
13
  from dataclasses import dataclass
14
14
  from pathlib import Path
15
15
 
16
- try:
16
+ if sys.version_info >= (3, 11):
17
17
  import tomllib
18
- except ModuleNotFoundError: # pragma: no cover - Python 3.10 compatibility.
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_.-]+) v\S+ .*latest:"
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
- if [ -f .init/dev ]; then
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