diff --git a/gitgud/skills/__init__.py b/gitgud/skills/__init__.py index ae8bcbd4..200345e8 100644 --- a/gitgud/skills/__init__.py +++ b/gitgud/skills/__init__.py @@ -4,6 +4,7 @@ from gitgud.skills.rework import skill as rework_skill from gitgud.skills.mixedbag import skill as mixedbag_skill from gitgud.skills.extras import skill as extras_skill +from gitgud.skills.newbasics import skill as newbasics_skill from gitgud.skills.util import AllSkills @@ -13,7 +14,8 @@ rampup_skill, rework_skill, mixedbag_skill, - extras_skill + extras_skill, + newbasics_skill ]) all_levels = [] diff --git a/gitgud/skills/level_builder.py b/gitgud/skills/level_builder.py index 064a978f..d6266fb6 100644 --- a/gitgud/skills/level_builder.py +++ b/gitgud/skills/level_builder.py @@ -93,16 +93,20 @@ def file(self, path): def cat_file(self, path): cat_file(self.file(path)) + def details(self): + details_path = self.file('details.yaml') + if details_path.is_file(): + with open(details_path) as details_file: + return yaml.safe_load(details_file) + else: + return None + def _setup(self): file_operator = operations.get_operator() file_operator.use_repo() commits, head = parse_spec(self.file('setup.spec')) - details_path = self.file('details.yaml') - if details_path.is_file(): - details = yaml.safe_load(details_path.open()) - else: - details = None + details = self.details() file_operator.create_tree(commits, head, details, self.level_dir) diff --git a/gitgud/skills/newbasics/__init__.py b/gitgud/skills/newbasics/__init__.py new file mode 100644 index 00000000..89d6fc39 --- /dev/null +++ b/gitgud/skills/newbasics/__init__.py @@ -0,0 +1,32 @@ +from gitgud import operations +from gitgud.skills.level_builder import BasicLevel +from gitgud.skills.util import Skill + + +class MergeConflicts(BasicLevel): + def _test(self): + if not super()._test(): + return False + + op = operations.get_operator() + tree = op.repo.head.commit.tree + merge_details = self.details()['M1']['files'] + + for blob in tree.blobs: + path = blob.path + content = merge_details[path][0] + blob_content = blob.data_stream.read().decode('ascii') + + if content.strip() != blob_content.strip(): + return False + + return True + + +skill = Skill( + 'Placeholder', + 'newbasics', + [ + MergeConflicts('Merge Conflicts', 'conflicts', __name__) + ] +) diff --git a/gitgud/skills/newbasics/_conflicts/details.yaml b/gitgud/skills/newbasics/_conflicts/details.yaml new file mode 100644 index 00000000..6ee6732f --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/details.yaml @@ -0,0 +1,26 @@ +'1': + message: "Added intro" + files: + intro.txt: + - Once upon a time, there was a princess +'3': + message: "Added middle" + add-files: + middle.txt: + - She lived a fulfilling life +'2': + message: "Added ending" + add-files: + middle.txt: + - She lived + ending.txt: + - And then she died +'M1': + message: "Merge branch 'ending' into master" + files: + intro.txt: + - Once upon a time, there was a princess + middle.txt: + - She lived a fulfilling life + ending.txt: + - And then she died diff --git a/gitgud/skills/newbasics/_conflicts/explanation.txt b/gitgud/skills/newbasics/_conflicts/explanation.txt new file mode 100644 index 00000000..f632181b --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/explanation.txt @@ -0,0 +1,3 @@ +Use this file to explain to the users how to use the git feature that this level focuses on. +>>> +Separate blocks using ">>>", and be sure to include tips and examples as explanation aids. diff --git a/gitgud/skills/newbasics/_conflicts/goal.txt b/gitgud/skills/newbasics/_conflicts/goal.txt new file mode 100644 index 00000000..674aaaae --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/goal.txt @@ -0,0 +1 @@ +In this file, write a short explanation of the level's goal (e.g. "Merge commits 1 and 2"). diff --git a/gitgud/skills/newbasics/_conflicts/setup.spec b/gitgud/skills/newbasics/_conflicts/setup.spec new file mode 100644 index 00000000..0ada6f7f --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/setup.spec @@ -0,0 +1,4 @@ +1 +2 (master) +3 : 1 (other) +master diff --git a/gitgud/skills/newbasics/_conflicts/solution.txt b/gitgud/skills/newbasics/_conflicts/solution.txt new file mode 100644 index 00000000..015a72f9 --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/solution.txt @@ -0,0 +1,4 @@ +git merge other +echo "She lived a fulfilling life" > middle.txt +git add middle.txt +git commit --no-edit diff --git a/gitgud/skills/newbasics/_conflicts/test.spec b/gitgud/skills/newbasics/_conflicts/test.spec new file mode 100644 index 00000000..f21c4bcf --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/test.spec @@ -0,0 +1,5 @@ +1 +2 +3 : 1 (other) +M1 : 2 3 (master) +master diff --git a/gitgud/skills/newbasics/test_levels.py b/gitgud/skills/newbasics/test_levels.py new file mode 100644 index 00000000..5a2467f7 --- /dev/null +++ b/gitgud/skills/newbasics/test_levels.py @@ -0,0 +1,15 @@ +import pytest + +from gitgud.skills.testing import simulate + +from . import skill + + +level_tests = [ + (level, level.solution_list()) for level in skill +] + + +@pytest.mark.parametrize('level,commands', level_tests) +def test_level(gg, level, commands): + simulate(gg, level, commands) diff --git a/setup.py b/setup.py index 6271b645..d42c80c3 100644 --- a/setup.py +++ b/setup.py @@ -18,6 +18,7 @@ 'gitgud', 'gitgud.hooks', 'gitgud.skills', + 'gitgud.skills.newbasics', 'gitgud.skills.basics', 'gitgud.skills.extras', 'gitgud.skills.rampup', @@ -28,6 +29,7 @@ package_data={ 'gitgud': ['version.txt', 'welcome.txt'], 'gitgud.skills.intro': ['_*/*'], + 'gitgud.skills.newbasics': ['_*/*'], 'gitgud.skills.basics': ['_*/*'], 'gitgud.skills.extras': ['_*/*'], 'gitgud.skills.rampup': ['_*/*'],