githug 0.1.5 → 0.1.6
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.
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/levels/branch_at.rb +25 -0
- data/levels/contribute.rb +1 -1
- data/levels/tag.rb +18 -0
- data/lib/githug/cli.rb +21 -3
- data/lib/githug/game.rb +9 -3
- data/lib/githug/level.rb +21 -7
- data/lib/githug/level.rb.orig +120 -0
- data/lib/githug/version.rb +1 -1
- data/spec/githug/cli_spec.rb +22 -2
- data/spec/githug/game_spec.rb +17 -5
- data/spec/githug/level_spec.rb +32 -1
- metadata +5 -2
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -9,7 +9,7 @@ To install Githug
|
|
9
9
|
|
10
10
|
gem install githug
|
11
11
|
|
12
|
-
After the gem is installed, you can run `githug` where you will be prompted to create a directory.
|
12
|
+
After the gem is installed, you can run `githug` where you will be prompted to create a directory. Githug should work on Linux and OS X.
|
13
13
|
|
14
14
|
##Commands
|
15
15
|
|
data/levels/branch_at.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
difficulty 3
|
2
|
+
description "You forgot to branch at the previous commit and made a commit on top of it. Create branch 'test_branch' at the commit before the last"
|
3
|
+
|
4
|
+
setup do
|
5
|
+
repo.init
|
6
|
+
FileUtils.touch("file1")
|
7
|
+
repo.add("file1")
|
8
|
+
repo.commit_all("Adding file1")
|
9
|
+
File.open("file1", 'w') { |f| f.write("content") }
|
10
|
+
repo.add("file1")
|
11
|
+
repo.commit_all("Updating file1")
|
12
|
+
File.open("file1", 'a') { |f| f.write("\nAdding some more text") }
|
13
|
+
repo.add("file1")
|
14
|
+
repo.commit_all("Updating file1 again")
|
15
|
+
end
|
16
|
+
|
17
|
+
solution do
|
18
|
+
solved = false
|
19
|
+
solved = true if repo.branches.map(&:name).include?("test_branch") and (repo.commits("test_branch").last.message == "Updating file1")
|
20
|
+
solved
|
21
|
+
end
|
22
|
+
|
23
|
+
hint do
|
24
|
+
puts "Just like creating a branch, but you have to pass an extra argument"
|
25
|
+
end
|
data/levels/contribute.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
difficulty 3
|
2
|
-
description "
|
2
|
+
description "This is the final level, the goal is to contribute to this repository by making a pull request on Github. Please note that this level is designed to encourage you to add a valid contribution to Githug, not testing your ability to create a pull request. Contributions that are likely to be accepted are levels, bug fixes and improved documentation."
|
3
3
|
|
4
4
|
solution do
|
5
5
|
location = "/tmp/githug"
|
data/levels/tag.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
difficulty 2
|
2
|
+
|
3
|
+
description "We have a git repo and we want to tag the current commit with new_tag."
|
4
|
+
|
5
|
+
setup do
|
6
|
+
repo.init
|
7
|
+
FileUtils.touch("somefile.txt")
|
8
|
+
repo.add("somefile.txt")
|
9
|
+
repo.commit_all("Added some file to the repo")
|
10
|
+
end
|
11
|
+
|
12
|
+
solution do
|
13
|
+
repo.tags.first.name == "new_tag"
|
14
|
+
end
|
15
|
+
|
16
|
+
hint do
|
17
|
+
puts "Take a look at `git tag`"
|
18
|
+
end
|
data/lib/githug/cli.rb
CHANGED
@@ -15,6 +15,17 @@ module Githug
|
|
15
15
|
game.play_level
|
16
16
|
end
|
17
17
|
|
18
|
+
desc :test, "Test a level from a file path"
|
19
|
+
method_option :errors, :type => :boolean, :default => false
|
20
|
+
|
21
|
+
def test(path)
|
22
|
+
UI.word_box("Githug")
|
23
|
+
make_directory
|
24
|
+
level = Level.load_from_file(path)
|
25
|
+
game = Game.new
|
26
|
+
game.test_level(level, options[:errors])
|
27
|
+
end
|
28
|
+
|
18
29
|
desc :hint, "Get a hint for the current level"
|
19
30
|
|
20
31
|
def hint
|
@@ -25,12 +36,19 @@ module Githug
|
|
25
36
|
|
26
37
|
desc :reset, "Reset the current level"
|
27
38
|
|
28
|
-
def reset
|
29
|
-
if
|
30
|
-
|
39
|
+
def reset(path = nil)
|
40
|
+
if path
|
41
|
+
level = Level.load_from_file(path)
|
42
|
+
else
|
43
|
+
level = load_level
|
44
|
+
end
|
45
|
+
UI.word_box("Githug")
|
46
|
+
if level
|
31
47
|
UI.puts("resetting level")
|
32
48
|
level.setup_level
|
33
49
|
level.full_description
|
50
|
+
else
|
51
|
+
UI.error("Level does not exist")
|
34
52
|
end
|
35
53
|
end
|
36
54
|
|
data/lib/githug/game.rb
CHANGED
@@ -34,9 +34,15 @@ module Githug
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
38
|
-
level
|
39
|
-
|
37
|
+
def test_level(level, errors = nil)
|
38
|
+
UI.puts level.full_description
|
39
|
+
method = :solve
|
40
|
+
method = :test if errors
|
41
|
+
if level.send(method)
|
42
|
+
UI.success "Valid solution"
|
43
|
+
else
|
44
|
+
UI.error "Invalid solution"
|
45
|
+
end
|
40
46
|
end
|
41
47
|
|
42
48
|
def level_bump
|
data/lib/githug/level.rb
CHANGED
@@ -4,21 +4,31 @@ module Githug
|
|
4
4
|
|
5
5
|
LEVELS = [nil, "init", "add", "commit", "config", "clone",
|
6
6
|
"clone_to_folder", "ignore", "status", "rm", "rm_cached", "rename",
|
7
|
-
"log", "commit_ammend", "reset", "checkout_file", "remote",
|
7
|
+
"log", "tag", "commit_ammend", "reset", "checkout_file", "remote",
|
8
8
|
"remote_url", "remote_add", "diff", "blame", "branch", "checkout",
|
9
|
-
"merge", "squash", "contribute"]
|
9
|
+
"branch_at", "merge", "squash", "contribute"]
|
10
10
|
|
11
11
|
attr_accessor :level_no, :level_path
|
12
12
|
|
13
13
|
class << self
|
14
14
|
|
15
15
|
def load(level_name)
|
16
|
+
path = "#{File.dirname(__FILE__)}/../../levels/#{level_name}.rb"
|
17
|
+
setup(path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def load_from_file(path)
|
21
|
+
setup(path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def setup(path)
|
25
|
+
level_name = File.basename(path, File.extname(path))
|
26
|
+
#Remove .rb extension, WTB a better way to do this
|
27
|
+
level_path = path[0..-4]
|
16
28
|
level = new
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
level.instance_eval(File.read(location))
|
21
|
-
level.level_no = LEVELS.index(level_name)
|
29
|
+
return false unless File.exists?(path)
|
30
|
+
level.instance_eval(File.read(path))
|
31
|
+
level.level_no = LEVELS.index(level_name) || 1
|
22
32
|
level.level_path = level_path
|
23
33
|
level
|
24
34
|
end
|
@@ -78,6 +88,10 @@ module Githug
|
|
78
88
|
false
|
79
89
|
end
|
80
90
|
|
91
|
+
def test
|
92
|
+
@solution.call
|
93
|
+
end
|
94
|
+
|
81
95
|
def show_hint
|
82
96
|
UI.word_box("Githug")
|
83
97
|
profile = Profile.load
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module Githug
|
2
|
+
class Level
|
3
|
+
include UI
|
4
|
+
|
5
|
+
LEVELS = [nil, "init", "add", "commit", "config", "clone",
|
6
|
+
"clone_to_folder", "ignore", "status", "rm", "rm_cached", "rename",
|
7
|
+
<<<<<<< HEAD
|
8
|
+
"log", "tag", "commit_ammend", "reset", "checkout_file", "remote",
|
9
|
+
"remote_url", "remote_add", "diff", "blame", "branch", "checkout",
|
10
|
+
=======
|
11
|
+
"log", "commit_ammend", "reset", "checkout_file", "remote",
|
12
|
+
"remote_url", "remote_add", "diff", "blame", "branch", "checkout", "branch_at",
|
13
|
+
>>>>>>> manojlds/master
|
14
|
+
"merge", "squash", "contribute"]
|
15
|
+
|
16
|
+
attr_accessor :level_no, :level_path
|
17
|
+
|
18
|
+
class << self
|
19
|
+
|
20
|
+
def load(level_name)
|
21
|
+
path = "#{File.dirname(__FILE__)}/../../levels/#{level_name}.rb"
|
22
|
+
setup(path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def load_from_file(path)
|
26
|
+
setup(path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def setup(path)
|
30
|
+
level_name = File.basename(path, File.extname(path))
|
31
|
+
#Remove .rb extension, WTB a better way to do this
|
32
|
+
level_path = path[0..-4]
|
33
|
+
level = new
|
34
|
+
return false unless File.exists?(path)
|
35
|
+
level.instance_eval(File.read(path))
|
36
|
+
level.level_no = LEVELS.index(level_name) || 1
|
37
|
+
level.level_path = level_path
|
38
|
+
level
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def init_from_level
|
44
|
+
FileUtils.cp_r("#{level_path}/.", ".")
|
45
|
+
FileUtils.mv(".githug", ".git")
|
46
|
+
end
|
47
|
+
|
48
|
+
def difficulty(num)
|
49
|
+
@difficulty = num
|
50
|
+
end
|
51
|
+
|
52
|
+
def description(description)
|
53
|
+
@description = description
|
54
|
+
end
|
55
|
+
|
56
|
+
def solution(&block)
|
57
|
+
@solution = block
|
58
|
+
end
|
59
|
+
|
60
|
+
def setup(&block)
|
61
|
+
@setup = block
|
62
|
+
end
|
63
|
+
|
64
|
+
def hint(&hint)
|
65
|
+
@hint = hint
|
66
|
+
end
|
67
|
+
|
68
|
+
def hints(hints)
|
69
|
+
@hints = hints
|
70
|
+
end
|
71
|
+
|
72
|
+
def full_description
|
73
|
+
UI.puts
|
74
|
+
UI.puts "Level: #{level_no}"
|
75
|
+
UI.puts "Difficulty: #{"*"*@difficulty}"
|
76
|
+
UI.puts
|
77
|
+
UI.puts @description
|
78
|
+
UI.puts
|
79
|
+
end
|
80
|
+
|
81
|
+
def setup_level
|
82
|
+
repo.reset
|
83
|
+
@setup.call if @setup
|
84
|
+
end
|
85
|
+
|
86
|
+
def repo(location = "")
|
87
|
+
@repo ||= Repository.new(location)
|
88
|
+
end
|
89
|
+
|
90
|
+
def solve
|
91
|
+
@solution.call
|
92
|
+
rescue
|
93
|
+
false
|
94
|
+
end
|
95
|
+
|
96
|
+
def test
|
97
|
+
@solution.call
|
98
|
+
end
|
99
|
+
|
100
|
+
def show_hint
|
101
|
+
UI.word_box("Githug")
|
102
|
+
profile = Profile.load
|
103
|
+
current_hint_index = profile.current_hint_index
|
104
|
+
if @hints
|
105
|
+
puts @hints[current_hint_index]
|
106
|
+
if current_hint_index < @hints.size - 1
|
107
|
+
profile.current_hint_index += 1
|
108
|
+
profile.save
|
109
|
+
else
|
110
|
+
profile.current_hint_index = 0
|
111
|
+
profile.save
|
112
|
+
end
|
113
|
+
elsif @hint
|
114
|
+
@hint.call
|
115
|
+
else
|
116
|
+
UI.puts("No hints available for this level")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/lib/githug/version.rb
CHANGED
data/spec/githug/cli_spec.rb
CHANGED
@@ -40,6 +40,18 @@ describe Githug::CLI do
|
|
40
40
|
lambda {@cli.make_directory}.should raise_error(SystemExit)
|
41
41
|
end
|
42
42
|
|
43
|
+
describe "test" do
|
44
|
+
it "should perform a test run of the level" do
|
45
|
+
level = mock
|
46
|
+
game = mock
|
47
|
+
@cli.stub(:make_directory)
|
48
|
+
Githug::Level.should_receive(:load_from_file).with("/foo/bar/test/level.rb").and_return(level)
|
49
|
+
Githug::Game.stub(:new).and_return(game)
|
50
|
+
game.should_receive(:test_level).with(level, anything)
|
51
|
+
@cli.test("/foo/bar/test/level.rb")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
43
55
|
describe "level methods" do
|
44
56
|
before(:each) do
|
45
57
|
@level = mock
|
@@ -47,6 +59,7 @@ describe Githug::CLI do
|
|
47
59
|
@profile.stub(:level).and_return(1)
|
48
60
|
Githug::Profile.stub(:load).and_return(@profile)
|
49
61
|
Githug::Level.stub(:load).and_return(@level)
|
62
|
+
Githug::Level.stub(:load_from_file).with("/foo/bar/level.rb").and_return(@level)
|
50
63
|
end
|
51
64
|
|
52
65
|
it "should call the hint method on the level" do
|
@@ -69,10 +82,17 @@ describe Githug::CLI do
|
|
69
82
|
Githug::Level.stub(:load).and_return(false)
|
70
83
|
@level.should_not_receive(:setup_level)
|
71
84
|
@level.should_not_receive(:full_description)
|
72
|
-
Githug::UI.
|
73
|
-
Githug::UI.should_not_receive(:puts).with("resetting level")
|
85
|
+
Githug::UI.should_receive(:error).with("Level does not exist")
|
74
86
|
@cli.reset
|
75
87
|
end
|
88
|
+
|
89
|
+
it "should reset the level with a path" do
|
90
|
+
@level.should_receive(:setup_level)
|
91
|
+
@level.should_receive(:full_description)
|
92
|
+
Githug::UI.should_receive(:word_box).with("Githug")
|
93
|
+
Githug::UI.should_receive(:puts).with("resetting level")
|
94
|
+
@cli.reset("/foo/bar/level.rb")
|
95
|
+
end
|
76
96
|
end
|
77
97
|
|
78
98
|
end
|
data/spec/githug/game_spec.rb
CHANGED
@@ -29,7 +29,7 @@ describe Githug::Game do
|
|
29
29
|
@game.play_level
|
30
30
|
end
|
31
31
|
|
32
|
-
describe "
|
32
|
+
describe "play_level" do
|
33
33
|
|
34
34
|
it "should echo congratulations if the level is solved" do
|
35
35
|
@level.stub(:solve).and_return(true)
|
@@ -62,10 +62,22 @@ describe Githug::Game do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
|
65
|
-
describe "
|
66
|
-
it "
|
67
|
-
|
68
|
-
|
65
|
+
describe "test_level" do
|
66
|
+
it "Should output Valid solution if the solution is valid" do
|
67
|
+
@level.stub(:solve).and_return(true)
|
68
|
+
Githug::UI.should_receive(:success).with("Valid solution")
|
69
|
+
@game.test_level(@level)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "Should output Invalid solution if the solution is invalid" do
|
73
|
+
@level.stub(:solve).and_return(false)
|
74
|
+
Githug::UI.should_receive(:error).with("Invalid solution")
|
75
|
+
@game.test_level(@level)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should call test when errors is true" do
|
79
|
+
@level.should_receive(:test)
|
80
|
+
@game.test_level(@level, true)
|
69
81
|
end
|
70
82
|
end
|
71
83
|
|
data/spec/githug/level_spec.rb
CHANGED
@@ -54,6 +54,30 @@ end
|
|
54
54
|
|
55
55
|
end
|
56
56
|
|
57
|
+
describe "load_from_file" do
|
58
|
+
it "should load the level" do
|
59
|
+
File.stub(:dirname).and_return("")
|
60
|
+
File.should_receive(:read).with('/foo/bar/test/level.rb').and_return(@file)
|
61
|
+
level = Githug::Level.load_from_file("/foo/bar/test/level.rb")
|
62
|
+
level.instance_variable_get("@difficulty").should eql(1)
|
63
|
+
level.instance_variable_get("@description").should eql("A test description")
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should return false if the level does not exist" do
|
67
|
+
File.stub(:exists?).and_return(false)
|
68
|
+
Githug::Level.load_from_file("/foo/bar/test/level.rb").should eql(false)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "setup" do
|
73
|
+
|
74
|
+
it "should return false if the level does not exist" do
|
75
|
+
File.stub(:exists?).and_return(false)
|
76
|
+
Githug::Level.setup("/foo/bar/test/level.rb").should eql(false)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
57
81
|
|
58
82
|
describe "solve" do
|
59
83
|
|
@@ -68,6 +92,13 @@ end
|
|
68
92
|
|
69
93
|
end
|
70
94
|
|
95
|
+
describe "test" do
|
96
|
+
it "should call solve" do
|
97
|
+
@level.instance_variable_get("@solution").should_receive(:call)
|
98
|
+
@level.test
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
71
102
|
|
72
103
|
describe "full_description" do
|
73
104
|
|
@@ -148,4 +179,4 @@ end
|
|
148
179
|
@level.init_from_level
|
149
180
|
end
|
150
181
|
end
|
151
|
-
end
|
182
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: githug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Gary Rennie
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-03-
|
13
|
+
date: 2012-03-18 00:00:00 +00:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- levels/blame/.githug/refs/heads/master
|
114
114
|
- levels/blame/config.rb
|
115
115
|
- levels/branch.rb
|
116
|
+
- levels/branch_at.rb
|
116
117
|
- levels/checkout.rb
|
117
118
|
- levels/checkout_file.rb
|
118
119
|
- levels/clone.rb
|
@@ -185,10 +186,12 @@ files:
|
|
185
186
|
- levels/rm_cached.rb
|
186
187
|
- levels/squash.rb
|
187
188
|
- levels/status.rb
|
189
|
+
- levels/tag.rb
|
188
190
|
- lib/githug.rb
|
189
191
|
- lib/githug/cli.rb
|
190
192
|
- lib/githug/game.rb
|
191
193
|
- lib/githug/level.rb
|
194
|
+
- lib/githug/level.rb.orig
|
192
195
|
- lib/githug/profile.rb
|
193
196
|
- lib/githug/repository.rb
|
194
197
|
- lib/githug/ui.rb
|