From df6bdf9443618cc8de3467c22f82aba2f04195e3 Mon Sep 17 00:00:00 2001 From: Caleb Sacks <16855387+clabe45@users.noreply.github.com> Date: Fri, 3 May 2024 16:12:25 -0700 Subject: [PATCH] fix(minecraft): update yarn sources path to `src` for 1.20.5 Closes: #55 --- docs/changelog.md | 3 +++ src/minecraft/source.py | 2 +- src/minecraft/version.py | 6 ++++++ tests/minecraft/unit/conftest.py | 23 +++++++++++++++-------- tests/minecraft/unit/test_source.py | 26 ++++++++++++++++++++++++-- tests/minecraft/unit/test_version.py | 16 ++++++++-------- 6 files changed, 57 insertions(+), 19 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index f11403a..aa24f61 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed +- *namedSrc not found* error when decompiling Minecraft 1.20.5 with Yarn mappings. + ### Security - Updated `cryptography` from 40.0.2 to 42.0.4 - Updated `requests` from 2.28.1 to 2.31.0 diff --git a/src/minecraft/source.py b/src/minecraft/source.py index 8697237..8a47ffb 100644 --- a/src/minecraft/source.py +++ b/src/minecraft/source.py @@ -65,7 +65,7 @@ def _generate_sources_with_yarn(version: Version, path: str) -> None: # Move the generated source code to $repo_dir/src shutil.move( - os.path.join(decompiler_repo.path, 'namedSrc'), + os.path.join(decompiler_repo.path, 'src' if version >= Version.of('1.20.5') else 'namedSrc'), src_path ) diff --git a/src/minecraft/version.py b/src/minecraft/version.py index 325309a..2ea392b 100644 --- a/src/minecraft/version.py +++ b/src/minecraft/version.py @@ -42,6 +42,12 @@ def __gt__(self, other) -> bool: return self._index > other._index + def __le__(self, other) -> bool: + return self < other or self == other + + def __ge__(self, other) -> bool: + return self > other or self == other + def to(self, other: Optional[Version], snapshots=True) -> List[Version]: """Iterate over all the versions from this version (inclusive) to `other` (exclusive) diff --git a/tests/minecraft/unit/conftest.py b/tests/minecraft/unit/conftest.py index a7b0675..4c01a70 100644 --- a/tests/minecraft/unit/conftest.py +++ b/tests/minecraft/unit/conftest.py @@ -8,26 +8,32 @@ MANIFEST_DATA = { 'latest': { - 'release': '1.0.0', - 'snapshot': '1.0.0' + 'release': '1.20.5', + 'snapshot': 'abcdef' }, 'versions': [ { 'type': 'release', - 'id': '1.0.0' + 'id': '1.20.5' }, { 'type': 'snapshot', 'id': 'abcdef' + }, + { + 'type': 'release', + 'id': '1.20.4' } ] } class TestVersions: - def __init__(self, snapshot: Version, release: Version) -> None: + def __init__(self, v1_20_4: Version, snapshot: Version, v1_20_5: Version) -> None: + self.v1_20_4 = v1_20_4 self.snapshot = snapshot - self.release = release + self.v1_20_5 = v1_20_5 + self.release = v1_20_5 def create_repo(mocker, path: str): @@ -71,11 +77,12 @@ def rev_parse(): @pytest.fixture def versions(): - load_manifest(MANIFEST_DATA, earliest_supported_version_id='abcdef') + load_manifest(MANIFEST_DATA, earliest_supported_version_id='1.20.4') + v1_20_4 = Version.of('1.20.4') snapshot = Version.of('abcdef') - release = Version.of('1.0.0') + v1_20_5 = Version.of('1.20.5') - yield TestVersions(snapshot, release) + yield TestVersions(v1_20_4, snapshot, v1_20_5) clear_manifest() diff --git a/tests/minecraft/unit/test_source.py b/tests/minecraft/unit/test_source.py index 21e8ec3..0009c8f 100644 --- a/tests/minecraft/unit/test_source.py +++ b/tests/minecraft/unit/test_source.py @@ -97,7 +97,7 @@ def test_generate_sources_with_yarn_removes_old_decompiler_dir_if_exists(mocker, rmtree.assert_any_call(old_decompiler_dir) -def test_generate_sources_with_yarn_moves_sources_to_repo(mocker, versions, yarn_project): +def test_generate_sources_with_1_20_4_and_yarn_moves_sources_to_repo(mocker, versions, yarn_project): root_path = 'foo' decompiler_dir = os.path.join(root_path, 'DecompilerMC') @@ -110,7 +110,7 @@ def test_generate_sources_with_yarn_moves_sources_to_repo(mocker, versions, yarn mocker.patch('os.makedirs') move = mocker.patch('shutil.move') - generate_sources(versions.snapshot, 'yarn', root_path) + generate_sources(versions.v1_20_4, 'yarn', root_path) decompiler_dir = os.path.join(root_path, 'yarn') move.assert_called_once_with( @@ -119,6 +119,28 @@ def test_generate_sources_with_yarn_moves_sources_to_repo(mocker, versions, yarn ) +def test_generate_sources_with_1_20_5_and_yarn_moves_sources_to_repo(mocker, versions, yarn_project): + root_path = 'foo' + decompiler_dir = os.path.join(root_path, 'DecompilerMC') + + mocker.patch( + 'subprocess.run', + return_value=SubprocessMock() + ) + mocker.patch('minecraft.source.click') + mocker.patch('shutil.rmtree') + mocker.patch('os.makedirs') + move = mocker.patch('shutil.move') + + generate_sources(versions.v1_20_5, 'yarn', root_path) + + decompiler_dir = os.path.join(root_path, 'yarn') + move.assert_called_once_with( + os.path.join(decompiler_dir, 'src'), + os.path.join(root_path, 'src') + ) + + def test_generate_sources_with_mojang_runs_decompiler(mocker, versions, decompiler_mc_repo): root_path = 'foo' decompiler_dir = os.path.join(root_path, 'DecompilerMC') diff --git a/tests/minecraft/unit/test_version.py b/tests/minecraft/unit/test_version.py index cc3eab8..1109b71 100644 --- a/tests/minecraft/unit/test_version.py +++ b/tests/minecraft/unit/test_version.py @@ -36,7 +36,7 @@ def test_release_to_snapshot_raises_version_error(self, versions): versions.release.to(versions.snapshot) def test_pattern_with_no_range_operator_returns_list_containing_version(self, versions): - assert Version.pattern('1.0.0') == [versions.release] + assert Version.pattern('1.20.5') == [versions.release] def test_pattern_with_snapshot_two_dots_returns_list_containing_release(self, versions): assert Version.pattern('abcdef..') == [versions.release] @@ -45,13 +45,13 @@ def test_pattern_with_snapshot_three_dots_returns_list_containing_snapshot_and_r assert Version.pattern('abcdef...') == [versions.snapshot, versions.release] def test_pattern_with_release_two_dots_returns_list_containing_release(self, versions): - assert Version.pattern('1.0.0..') == [versions.release] + assert Version.pattern('1.20.5..') == [versions.release] def test_pattern_with_release_two_dots_release_returns_list_containing_release(self, versions): - assert Version.pattern('1.0.0..1.0.0') == [versions.release] + assert Version.pattern('1.20.5..1.20.5') == [versions.release] def test_pattern_with_snapshot_three_dots_release_returns_list_containing_snapshot_and_release(self, versions): - assert Version.pattern('abcdef...1.0.0') == [versions.snapshot, versions.release] + assert Version.pattern('abcdef...1.20.5') == [versions.snapshot, versions.release] def test_pattern_with_three_dots_on_empty_repo_throws_value_error(self, versions): with pytest.raises(ValueError, match='No commits from which to derive current version'): @@ -67,13 +67,13 @@ def test_patterns_with_empty_list_returns_empty_list(self, versions): assert Version.patterns([]) == [] def test_patterns_with_one_positive_id_returns_corresponding_version(self, versions): - assert Version.patterns(['1.0.0']) == [versions.release] + assert Version.patterns(['1.20.5']) == [versions.release] def test_patterns_with_two_positive_identical_ids_returns_one_version(self, versions): - assert Version.patterns(['1.0.0', '1.0.0']) == [versions.release] + assert Version.patterns(['1.20.5', '1.20.5']) == [versions.release] def test_patterns_with_one_positive_id_and_the_same_negative_id_returns_empty_list(self, versions): - assert Version.patterns(['1.0.0', '-1.0.0']) == [] + assert Version.patterns(['1.20.5', '-1.20.5']) == [] def test_patterns_with_one_positive_id_and_the_same_negative_id_and_the_same_positive_id_returns_one_version(self, versions): - assert Version.patterns(['1.0.0', '-1.0.0', '1.0.0']) == [versions.release] + assert Version.patterns(['1.20.5', '-1.20.5', '1.20.5']) == [versions.release]