Skip to content

Commit 464066b

Browse files
committed
Implement version fetching
Use the version explicitly to get the necessary versions
1 parent cb099c4 commit 464066b

5 files changed

Lines changed: 52 additions & 13 deletions

File tree

app/commands/setup_folder.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from app.commands.check.git import git
77
from app.commands.progress.constants import PROGRESS_LOCAL_FOLDER_NAME
88
from app.utils.click import error, info, invoke_command, prompt
9-
from app.utils.version import get_latest_exercise_version
9+
from app.utils.version import get_latest_release_exercise_version
1010

1111

1212
@click.command("setup")
@@ -38,7 +38,7 @@ def setup() -> None:
3838
info("Setting up your local progress tracker...")
3939
os.makedirs(PROGRESS_LOCAL_FOLDER_NAME, exist_ok=True)
4040
with open(".gitmastery.json", "w") as gitmastery_file:
41-
version_to_pin = get_latest_exercise_version()
41+
version_to_pin = get_latest_release_exercise_version()
4242
if version_to_pin is None:
4343
# For now, we just error out because we should never be in this bad state.
4444
raise ValueError(

app/utils/click.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
import sys
33
from enum import StrEnum
4-
from typing import Any, Dict, NoReturn, Optional
4+
from typing import Any, NoReturn, Optional
55

66
import click
77

app/utils/gitmastery.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import os
33
import sys
44
import tempfile
5-
import urllib.parse
65
from pathlib import Path
76
from typing import Any, Dict, Optional, Tuple, TypeVar, Union
87

@@ -13,7 +12,10 @@
1312
from app.gitmastery_config import GitMasteryConfig
1413
from app.utils.click import error, get_exercise_root_config, get_gitmastery_root_config
1514
from app.utils.general import ensure_str
16-
from app.utils.version import Version, get_latest_exercise_version_tag
15+
from app.utils.version import (
16+
Version,
17+
get_latest_exercise_version_within_pin,
18+
)
1719

1820
GITMASTERY_CONFIG_NAME = ".gitmastery.json"
1921
GITMASTERY_EXERCISE_CONFIG_NAME = ".gitmastery-exercise.json"
@@ -22,6 +24,27 @@
2224
)
2325

2426

27+
def _construct_gitmastery_exercises_url(filepath: str, version: Version) -> str:
28+
if version.release:
29+
ref = "heads/main"
30+
elif version.development:
31+
latest_development = get_latest_exercise_version_within_pin(version)
32+
ref = f"tags/{latest_development}"
33+
elif not version.pinned:
34+
ref = f"tags/{version.to_version_string()}"
35+
else:
36+
# If pinned, we need to basically search for all the available tags within the
37+
# range
38+
latest_within_pin = get_latest_exercise_version_within_pin(version)
39+
ref = f"tags/{latest_within_pin}"
40+
41+
url = (
42+
f"https://raw.githubusercontent.com/git-mastery/exercises/refs/{ref}/{filepath}"
43+
)
44+
print(url)
45+
return url
46+
47+
2548
def _find_root(filename: str) -> Optional[Tuple[Path, int]]:
2649
current = Path.cwd()
2750
steps = 0
@@ -68,8 +91,8 @@ def read_gitmastery_config(gitmastery_config_path: Path, cds: int) -> GitMastery
6891
cds=cds,
6992
progress_local=raw_config.get("progress_local", False),
7093
progress_remote=raw_config.get("progress_remote", False),
71-
exercises_version=raw_config.get(
72-
"exercises_version", Version.parse_version_string("latest")
94+
exercises_version=Version.parse_version_string(
95+
raw_config.get("exercises_version", "release")
7396
),
7497
)
7598

@@ -124,7 +147,12 @@ def generate_cds_string(cds: int) -> str:
124147

125148

126149
def get_gitmastery_file_path(path: str):
127-
return urllib.parse.urljoin(GITMASTERY_EXERCISES_BASE_URL, path)
150+
config = get_gitmastery_root_config()
151+
if config is None:
152+
version = Version.RELEASE
153+
else:
154+
version = config.exercises_version
155+
return _construct_gitmastery_exercises_url(path, version)
128156

129157

130158
def fetch_file_contents(url: str, is_binary: bool) -> str | bytes:
@@ -138,7 +166,6 @@ def fetch_file_contents(url: str, is_binary: bool) -> str | bytes:
138166
error(
139167
f"Failed to fetch resource {click.style(url, bold=True, italic=True)}. Inform the Git-Mastery team."
140168
)
141-
return ""
142169

143170

144171
def fetch_file_contents_or_none(

app/utils/version.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ def get_all_exercise_tags() -> List[Version]:
173173
)
174174

175175

176-
def get_latest_exercise_version() -> Optional[Version]:
176+
def get_latest_release_exercise_version() -> Optional[Version]:
177177
all_tags = get_all_exercise_tags()
178178
if len(all_tags) == 0:
179179
# Although this should not be happening, we will let the callsite handle this
@@ -188,6 +188,18 @@ def get_latest_exercise_version() -> Optional[Version]:
188188
return None
189189

190190

191+
def get_latest_development_exercise_version() -> Optional[Version]:
192+
all_tags = get_all_exercise_tags()
193+
if len(all_tags) == 0:
194+
# Although this should not be happening, we will let the callsite handle this
195+
return None
196+
197+
for tag in all_tags:
198+
if tag.build is None:
199+
return tag
200+
return None
201+
202+
191203
def get_latest_exercise_version_within_pin(pin_version: Version) -> Optional[Version]:
192204
all_tags = get_all_exercise_tags()
193205
for tag in all_tags:

tests/utils/test_version.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import pytest
55
from app.utils.version import (
66
Version,
7-
get_latest_exercise_version,
7+
get_latest_release_exercise_version,
88
get_latest_exercise_version_within_pin,
99
)
1010

@@ -154,7 +154,7 @@ def test_within_pin_with_prerelease(version, expected):
154154
assert version_v.within_pin(pin_version) == expected
155155

156156

157-
def test_get_latest_exercise_version():
157+
def test_get_latest_release_exercise_version():
158158
exercises = [
159159
"0.0.1-beta.0",
160160
"0.9.9",
@@ -166,7 +166,7 @@ def test_get_latest_exercise_version():
166166
with mock.patch(
167167
"app.utils.version.get_all_exercise_tags", return_value=_get_versions(exercises)
168168
):
169-
assert get_latest_exercise_version() == Version(
169+
assert get_latest_release_exercise_version() == Version(
170170
0, 9, 9, None, None, False, False, False
171171
)
172172

0 commit comments

Comments
 (0)