gitscrub 0.0.4 → 0.0.5
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/levels/{2.rb → add.rb} +0 -1
- data/levels/commit.rb +14 -0
- data/levels/contribute.rb +21 -0
- data/levels/{1.rb → init.rb} +0 -4
- data/lib/gitscrub.rb +1 -0
- data/lib/gitscrub/cli.rb +9 -1
- data/lib/gitscrub/game.rb +2 -2
- data/lib/gitscrub/level.rb +18 -10
- data/lib/gitscrub/repository.rb +23 -0
- data/lib/gitscrub/ui.rb +18 -1
- data/lib/gitscrub/version.rb +1 -1
- data/spec/gitscrub/cli_spec.rb +8 -1
- data/spec/gitscrub/game_spec.rb +2 -2
- data/spec/gitscrub/level_spec.rb +72 -23
- data/spec/gitscrub/repository_spec.rb +49 -0
- data/spec/gitscrub/ui_spec.rb +10 -0
- metadata +7 -3
data/levels/{2.rb → add.rb}
RENAMED
data/levels/commit.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
difficulty 3
|
2
|
+
description "Contribute to this repository by making a pull request on Github"
|
3
|
+
|
4
|
+
solution do
|
5
|
+
location = "/tmp/gitscrub"
|
6
|
+
FileUtils.rm_rf(location)
|
7
|
+
puts "Cloning repository to #{location}"
|
8
|
+
`git clone git@github.com:Gazler/gitscrub.git #{location}`
|
9
|
+
|
10
|
+
contributor = false
|
11
|
+
|
12
|
+
repo = Grit::Repo.new(location)
|
13
|
+
repo.commits.each do |commit|
|
14
|
+
if commit.author.name == repo.config["user.name"]
|
15
|
+
if commit.author.email == repo.config["user.email"]
|
16
|
+
contributor = true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
contributor
|
21
|
+
end
|
data/levels/{1.rb → init.rb}
RENAMED
data/lib/gitscrub.rb
CHANGED
data/lib/gitscrub/cli.rb
CHANGED
@@ -37,10 +37,18 @@ module Gitscrub
|
|
37
37
|
no_tasks do
|
38
38
|
|
39
39
|
def make_directory
|
40
|
-
|
40
|
+
if File.exists?("./git_scrub")
|
41
|
+
UI.puts "Please change into the git_scrub directory"
|
42
|
+
exit
|
43
|
+
end
|
44
|
+
|
45
|
+
unless File.basename(Dir.pwd) == "git_scrub"
|
41
46
|
if UI.ask("No gitscrub directory found, do you wish to create one?")
|
42
47
|
Dir.mkdir("./git_scrub")
|
43
48
|
Dir.chdir("git_scrub")
|
49
|
+
File.open(".gitignore", "w") do |file|
|
50
|
+
file.write(".profile.yml")
|
51
|
+
end
|
44
52
|
else
|
45
53
|
UI.puts("Exiting")
|
46
54
|
exit
|
data/lib/gitscrub/game.rb
CHANGED
@@ -17,10 +17,10 @@ module Gitscrub
|
|
17
17
|
level = Level.load(profile.level)
|
18
18
|
if solve && level
|
19
19
|
if level.solve
|
20
|
-
UI.
|
20
|
+
UI.success "Congratulations, you have solved the level"
|
21
21
|
level_bump
|
22
22
|
else
|
23
|
-
UI.
|
23
|
+
UI.error "Sorry, this solution is not quite right!"
|
24
24
|
UI.puts level.full_description
|
25
25
|
end
|
26
26
|
end
|
data/lib/gitscrub/level.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
module Gitscrub
|
2
2
|
class Level
|
3
|
+
include UI
|
3
4
|
|
4
|
-
|
5
|
+
LEVELS = [nil, "init", "add", "commit", "contribute"]
|
6
|
+
|
7
|
+
attr_accessor :level_no
|
5
8
|
|
6
9
|
class << self
|
7
10
|
|
8
11
|
def load(level_no)
|
9
12
|
level = new
|
10
|
-
location = "#{File.dirname(__FILE__)}/../../levels/#{level_no}.rb"
|
13
|
+
location = "#{File.dirname(__FILE__)}/../../levels/#{LEVELS[level_no]}.rb"
|
11
14
|
return false unless File.exists?(location)
|
12
15
|
level.instance_eval(File.read(location))
|
13
16
|
level.level_no = level_no
|
@@ -17,36 +20,41 @@ module Gitscrub
|
|
17
20
|
end
|
18
21
|
|
19
22
|
def difficulty(num)
|
20
|
-
@
|
23
|
+
@difficulty = num
|
21
24
|
end
|
22
25
|
|
23
26
|
def description(description)
|
24
|
-
@
|
27
|
+
@description = description
|
25
28
|
end
|
26
29
|
|
27
30
|
def solution(&block)
|
28
|
-
@
|
31
|
+
@solution = block
|
29
32
|
end
|
30
33
|
|
31
34
|
def setup(&block)
|
32
|
-
@
|
35
|
+
@setup = block
|
33
36
|
end
|
34
37
|
|
35
38
|
def full_description
|
36
39
|
UI.puts
|
37
40
|
UI.puts "Level: #{level_no}"
|
38
|
-
UI.puts "Difficulty: #{"*"
|
41
|
+
UI.puts "Difficulty: #{"*"*@difficulty}"
|
39
42
|
UI.puts
|
40
|
-
UI.puts
|
43
|
+
UI.puts @description
|
41
44
|
UI.puts
|
42
45
|
end
|
43
46
|
|
44
47
|
def setup_level
|
45
|
-
|
48
|
+
repo.reset
|
49
|
+
@setup.call if @setup
|
50
|
+
end
|
51
|
+
|
52
|
+
def repo
|
53
|
+
@repo ||= Repository.new
|
46
54
|
end
|
47
55
|
|
48
56
|
def solve
|
49
|
-
|
57
|
+
@solution.call
|
50
58
|
rescue
|
51
59
|
false
|
52
60
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Gitscrub
|
2
|
+
class Repository
|
3
|
+
|
4
|
+
attr_accessor :grit
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@grit = Grit::Repo.new(".")
|
8
|
+
rescue Grit::InvalidGitRepositoryError
|
9
|
+
@grit = nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def reset
|
13
|
+
dont_delete = ["..", ".", ".gitignore", ".profile.yml"]
|
14
|
+
if File.basename(Dir.pwd) == "git_scrub"
|
15
|
+
Dir.entries(Dir.pwd).each do |file|
|
16
|
+
FileUtils.rm_rf(file) unless dont_delete.include?(file)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
data/lib/gitscrub/ui.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Gitscrub
|
2
|
-
|
2
|
+
module UI
|
3
3
|
|
4
4
|
@@out_stream
|
5
5
|
@@in_stream
|
@@ -50,6 +50,23 @@ module Gitscrub
|
|
50
50
|
request("#{msg} [yn] ") == 'y'
|
51
51
|
end
|
52
52
|
|
53
|
+
def colorize(text, color_code)
|
54
|
+
puts "#{color_code}#{text}\033[0m"
|
55
|
+
end
|
56
|
+
|
57
|
+
def error(text)
|
58
|
+
colorize(text, "\033[31m")
|
59
|
+
end
|
60
|
+
|
61
|
+
def success(text)
|
62
|
+
colorize(text, "\033[32m")
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
def method_missing(method, *args, &block)
|
68
|
+
return UI.send(method, *args) if UI.methods(false).include?(method)
|
69
|
+
super
|
53
70
|
end
|
54
71
|
|
55
72
|
end
|
data/lib/gitscrub/version.rb
CHANGED
data/spec/gitscrub/cli_spec.rb
CHANGED
@@ -19,6 +19,7 @@ describe Gitscrub::CLI do
|
|
19
19
|
Gitscrub::UI.stub(:ask).and_return(true)
|
20
20
|
Dir.should_receive(:mkdir).with("./git_scrub")
|
21
21
|
Dir.should_receive(:chdir).with("git_scrub")
|
22
|
+
File.should_receive(:open).with(".gitignore", "w").and_return(true)
|
22
23
|
@cli.make_directory
|
23
24
|
end
|
24
25
|
|
@@ -28,11 +29,17 @@ describe Gitscrub::CLI do
|
|
28
29
|
@cli.make_directory
|
29
30
|
end
|
30
31
|
|
31
|
-
it "should
|
32
|
+
it "should exit if the user selects no" do
|
32
33
|
Gitscrub::UI.stub(:ask).and_return(false)
|
33
34
|
lambda {@cli.make_directory}.should raise_error(SystemExit)
|
34
35
|
end
|
35
36
|
|
37
|
+
it "should prompt to change into the directory if it exists" do
|
38
|
+
File.stub(:exists?).and_return(true)
|
39
|
+
Gitscrub::UI.should_receive(:puts).with("Please change into the git_scrub directory")
|
40
|
+
lambda {@cli.make_directory}.should raise_error(SystemExit)
|
41
|
+
end
|
42
|
+
|
36
43
|
it "should check the current solution" do
|
37
44
|
@cli.check.should eql(true)
|
38
45
|
end
|
data/spec/gitscrub/game_spec.rb
CHANGED
@@ -31,13 +31,13 @@ describe Gitscrub::Game do
|
|
31
31
|
it "should echo congratulations if the level is solved" do
|
32
32
|
@level.stub(:solve).and_return(true)
|
33
33
|
@profile.should_receive(:level=).with(2)
|
34
|
-
Gitscrub::UI.should_receive(:
|
34
|
+
Gitscrub::UI.should_receive(:success).with("Congratulations, you have solved the level")
|
35
35
|
@game.play_level
|
36
36
|
end
|
37
37
|
|
38
38
|
it "should echo congratulations if the level is solved" do
|
39
39
|
@level.stub(:solve).and_return(false)
|
40
|
-
Gitscrub::UI.should_receive(:
|
40
|
+
Gitscrub::UI.should_receive(:error).with("Sorry, this solution is not quite right!")
|
41
41
|
@game.play_level
|
42
42
|
end
|
43
43
|
|
data/spec/gitscrub/level_spec.rb
CHANGED
@@ -14,43 +14,92 @@ solution do
|
|
14
14
|
Grit::Repo.new("gitscrub/notadir")
|
15
15
|
end
|
16
16
|
eof
|
17
|
+
File.stub(:exists?).and_return(true)
|
17
18
|
File.stub(:read).and_return(@file)
|
18
19
|
@level = Gitscrub::Level.load(1)
|
20
|
+
@repo = mock
|
21
|
+
@repo.stub(:reset)
|
22
|
+
Gitscrub::Repository.stub(:new).and_return(@repo)
|
19
23
|
end
|
20
24
|
|
21
|
-
it "should
|
22
|
-
|
23
|
-
File.stub(:exists?).and_return(true)
|
24
|
-
File.should_receive(:read).with('/../../levels/1.rb').and_return(@file)
|
25
|
-
level = Gitscrub::Level.load(1)
|
26
|
-
level.ldifficulty.should eql(1)
|
27
|
-
level.ldescription.should eql("A test description")
|
25
|
+
it "should mixin UI" do
|
26
|
+
Gitscrub::Level.ancestors.should include(Gitscrub::UI)
|
28
27
|
end
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
|
30
|
+
describe "load" do
|
31
|
+
|
32
|
+
it "should load the level" do
|
33
|
+
File.stub(:dirname).and_return("")
|
34
|
+
File.should_receive(:read).with('/../../levels/init.rb').and_return(@file)
|
35
|
+
level = Gitscrub::Level.load(1)
|
36
|
+
level.instance_variable_get("@difficulty").should eql(1)
|
37
|
+
level.instance_variable_get("@description").should eql("A test description")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return false if the level does not exist" do
|
41
|
+
File.stub(:exists?).and_return(false)
|
42
|
+
Gitscrub::Level.load(1).should eql(false)
|
43
|
+
end
|
44
|
+
|
33
45
|
end
|
34
46
|
|
35
|
-
|
36
|
-
|
47
|
+
|
48
|
+
describe "solve" do
|
49
|
+
|
50
|
+
it "should solve the problem" do
|
51
|
+
@level.solve.should eql(false)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should return true if the requirements have been met" do
|
55
|
+
Grit::Repo.stub(:new).and_return(true)
|
56
|
+
@level.solve.should eql(true)
|
57
|
+
end
|
58
|
+
|
37
59
|
end
|
38
60
|
|
39
|
-
|
40
|
-
|
41
|
-
|
61
|
+
|
62
|
+
describe "full_description" do
|
63
|
+
|
64
|
+
it "should display a full description" do
|
65
|
+
Gitscrub::UI.stub(:puts)
|
66
|
+
Gitscrub::UI.should_receive(:puts).with("Level: 1")
|
67
|
+
Gitscrub::UI.should_receive(:puts).with("Difficulty: *")
|
68
|
+
Gitscrub::UI.should_receive(:puts).with("A test description")
|
69
|
+
@level.full_description
|
70
|
+
end
|
71
|
+
|
42
72
|
end
|
43
73
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
74
|
+
describe "setup" do
|
75
|
+
|
76
|
+
it "should call setup" do
|
77
|
+
@level.setup_level.should eql("test")
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should not call the setup if none exists" do
|
81
|
+
@level.instance_variable_set("@setup", nil)
|
82
|
+
lambda {@level.setup_level}.should_not raise_error(NoMethodError)
|
83
|
+
end
|
84
|
+
|
50
85
|
end
|
86
|
+
|
87
|
+
|
88
|
+
describe "repo" do
|
89
|
+
|
90
|
+
it "should initialize a repository when repo is called" do
|
91
|
+
@level.repo.should equal(@repo)
|
92
|
+
Gitscrub::Repository.should_not_receive(:new)
|
93
|
+
@level.repo.should equal(@repo)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should call reset on setup_level" do
|
97
|
+
@repo.should_receive(:reset)
|
98
|
+
@level.setup_level
|
99
|
+
end
|
51
100
|
|
52
|
-
it "should call setup" do
|
53
|
-
@level.setup_level.should eql("test")
|
54
101
|
end
|
102
|
+
|
103
|
+
|
55
104
|
|
56
105
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Gitscrub::Repository do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@grit = mock
|
7
|
+
Grit::Repo.stub(:new).and_return(@grit)
|
8
|
+
@repository = Gitscrub::Repository.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "initialize" do
|
12
|
+
|
13
|
+
it "should call grit on initialize" do
|
14
|
+
Grit::Repo.should_receive(:new).and_return(@grit)
|
15
|
+
repo = Gitscrub::Repository.new
|
16
|
+
repo.grit.should equal(@grit)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should contain a nil grit if the repo is invalid" do
|
20
|
+
Grit::Repo.should_receive(:new).and_raise(Grit::InvalidGitRepositoryError)
|
21
|
+
repo = Gitscrub::Repository.new
|
22
|
+
repo.grit.should equal(nil)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "reset" do
|
28
|
+
|
29
|
+
before(:each) do
|
30
|
+
FileUtils.stub(:rm_rf)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should do nothing if the current directory isn't git_scrub" do
|
34
|
+
Dir.stub(:pwd).and_return("/tmp/foo")
|
35
|
+
FileUtils.should_not_receive(:rm_rf)
|
36
|
+
@repository.reset
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should remove all the files except .gitignore and .profile.yml" do
|
40
|
+
Dir.stub(:pwd).and_return("/tmp/git_scrub")
|
41
|
+
Dir.stub(:entries).and_return([".profile.yml", ".gitignore", "..", ".", "README", ".git"])
|
42
|
+
FileUtils.should_receive(:rm_rf).with("README")
|
43
|
+
FileUtils.should_receive(:rm_rf).with(".git")
|
44
|
+
@repository.reset
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
end
|
data/spec/gitscrub/ui_spec.rb
CHANGED
@@ -70,5 +70,15 @@ describe Gitscrub::UI do
|
|
70
70
|
@ui.stub(:request).and_return('aklhasdf')
|
71
71
|
@ui.ask("foo?").should be_false
|
72
72
|
end
|
73
|
+
|
74
|
+
it "should print out a success message in green" do
|
75
|
+
@ui.success("success")
|
76
|
+
@out.string.should eql("\033[32msuccess\033[0m\n")
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should print out a error message in red" do
|
80
|
+
@ui.error("error")
|
81
|
+
@out.string.should eql("\033[31merror\033[0m\n")
|
82
|
+
end
|
73
83
|
|
74
84
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: gitscrub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Gary Rennie
|
@@ -62,19 +62,23 @@ files:
|
|
62
62
|
- Rakefile
|
63
63
|
- bin/gitscrub
|
64
64
|
- gitscrub.gemspec
|
65
|
-
- levels/
|
66
|
-
- levels/
|
65
|
+
- levels/add.rb
|
66
|
+
- levels/commit.rb
|
67
|
+
- levels/contribute.rb
|
68
|
+
- levels/init.rb
|
67
69
|
- lib/gitscrub.rb
|
68
70
|
- lib/gitscrub/cli.rb
|
69
71
|
- lib/gitscrub/game.rb
|
70
72
|
- lib/gitscrub/level.rb
|
71
73
|
- lib/gitscrub/profile.rb
|
74
|
+
- lib/gitscrub/repository.rb
|
72
75
|
- lib/gitscrub/ui.rb
|
73
76
|
- lib/gitscrub/version.rb
|
74
77
|
- spec/gitscrub/cli_spec.rb
|
75
78
|
- spec/gitscrub/game_spec.rb
|
76
79
|
- spec/gitscrub/level_spec.rb
|
77
80
|
- spec/gitscrub/profile_spec.rb
|
81
|
+
- spec/gitscrub/repository_spec.rb
|
78
82
|
- spec/gitscrub/ui_spec.rb
|
79
83
|
- spec/spec_helper.rb
|
80
84
|
has_rdoc: true
|