githug 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|