githug 0.0.10 → 0.1.0

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/README.md CHANGED
@@ -23,13 +23,19 @@ Githug has 3 commands:
23
23
 
24
24
  Get yourself on the [contributors list](https://github.com/Gazler/githug/contributors) by doing the following:
25
25
 
26
- * Fork the repository
27
- * Make a level using the DSL (covered below)
28
- * Add your level to the LEVELS array inside `lib/githug/level.rb` in a position that makes sense (the "commit" level after the "add" and "init" levels for example)
29
- * Make sure your level works (covered below)
30
- * Submit a pull request
26
+ * Fork the repository
27
+ * Make a level in the levels directory (covered below)
28
+ * Add your level to the LEVELS array inside `lib/githug/level.rb` in a position that makes sense (the "commit" level after the "add" and "init" levels for example)
29
+ * Make sure your level works (covered below)
30
+ * Submit a pull request
31
31
 
32
- ##DSL
32
+ ##Todo List
33
+
34
+ * A better way of returning from the solution block
35
+ * A follow up to the level, more information on a specific command, etc.
36
+ * More levels!
37
+
38
+ ##Writing Levels
33
39
 
34
40
  Githug has a DSL for writing levels
35
41
 
@@ -0,0 +1,25 @@
1
+ difficulty 3
2
+
3
+ description "A file has been modified, but you don't want to keep the files. Checkout the `config.rb` file from the last commit."
4
+
5
+ setup do
6
+ repo.init
7
+ File.open("config.rb", "w") do |file|
8
+ file.puts("This is the initial config file")
9
+ end
10
+
11
+ repo.add("config.rb")
12
+ repo.commit_all("Added initial config file")
13
+
14
+ File.open("config.rb", "a") do |file|
15
+ file.puts("These are changed you don't want to keep!")
16
+ end
17
+ end
18
+
19
+ solution do
20
+ repo.status.files["config.rb"].type != "M" && repo.commits.length == 2
21
+ end
22
+
23
+ hint do
24
+ puts "You will need to do some research on the checkout command for this one."
25
+ end
@@ -0,0 +1,18 @@
1
+ difficulty 2
2
+ description "The README file has been committed, but it looks like the file `forgotten_file.rb` was missing from the commit. Add the file and ammend your previous commit to include it."
3
+
4
+ setup do
5
+ repo.init
6
+ FileUtils.touch("README")
7
+ repo.add("README")
8
+ repo.commit_all("Initial commit")
9
+ FileUtils.touch("forgotten_file.rb")
10
+ end
11
+
12
+ solution do
13
+ repo.commits.length == 2 && repo.commits.first.stats.files.length == 2
14
+ end
15
+
16
+ hint do
17
+ puts "Running `git commit --help` will display the man page and possible flags."
18
+ end
data/levels/remote.rb ADDED
@@ -0,0 +1,16 @@
1
+ difficulty 2
2
+
3
+ description "This projects has a remote repository. Identify it."
4
+
5
+ setup do
6
+ repo.init
7
+ repo.remote_add("my_remote_repo", "https://github.com/Gazler/githug")
8
+ end
9
+
10
+ solution do
11
+ "my_remote_repo" == request("What is the name of the remote repository?")
12
+ end
13
+
14
+ hint do
15
+ puts "You are looking for a remote. You can run `git` for a list of commands"
16
+ end
@@ -0,0 +1,16 @@
1
+ difficulty 2
2
+
3
+ description "Add a remote repository called `origin` with the url `https://github.com/githug/githug`"
4
+
5
+ setup do
6
+ repo.init
7
+ end
8
+
9
+ solution do
10
+ result = `git remote -v`
11
+ result.include?("https://github.com/githug/githug")
12
+ end
13
+
14
+ hint do
15
+ puts "You can run `git remote --help` for the man pages"
16
+ end
@@ -0,0 +1,17 @@
1
+ difficulty 2
2
+
3
+ description "The remote repositories have a url associated to them. Please enter the url of remote_location"
4
+
5
+ setup do
6
+ repo.init
7
+ repo.remote_add("my_remote_repo", "https://github.com/Gazler/githug")
8
+ repo.remote_add("remote_location", "https://github.com/githug/not_a_repo")
9
+ end
10
+
11
+ solution do
12
+ "https://github.com/githug/not_a_repo" == request("What is the url of the remote repository?")
13
+ end
14
+
15
+ hint do
16
+ puts "You can run `git remote --help` for the man pages"
17
+ end
data/levels/reset.rb ADDED
@@ -0,0 +1,22 @@
1
+ difficulty 2
2
+ description "There are two files to be committed. The goal was to add each file as a separate commit, however both were added by accident. Unstage the file `to_commit_second` using the reset command"
3
+
4
+ setup do
5
+ repo.init
6
+ FileUtils.touch("README")
7
+ repo.add("README")
8
+ repo.commit_all("Initial commit")
9
+ FileUtils.touch("to_commit_first.rb")
10
+ FileUtils.touch("to_commit_second.rb")
11
+ repo.add(".")
12
+ end
13
+
14
+ solution do
15
+ return false unless (repo.status.files["to_commit_second.rb"].nil? || repo.status.files["to_commit_second.rb"].stage.nil?) && File.exists?("to_commit_second.rb")
16
+ return false if (repo.status.files["to_commit_first.rb"].nil? || repo.status.files["to_commit_first.rb"].stage.nil?)
17
+ true
18
+ end
19
+
20
+ hint do
21
+ puts "You can get some useful information for git status, it will tell you the command you need to run"
22
+ end
data/levels/rm_cached.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  difficulty 2
2
2
 
3
- description "A file has accidentally been added to your staging area, find out which file and remove it from the staging area. *NOTE* Do not remove the file system, only from git."
3
+ description "A file (deleteme.rb) has accidentally been added to your staging area, find out which file and remove it from the staging area. *NOTE* Do not remove the file system, only from git."
4
4
 
5
5
  setup do
6
- repo.init
7
- file = File.new("deleteme.rb", "w")
6
+ repo.init(false)
7
+ FileUtils.touch("deleteme.rb")
8
+ repo.add(".gitignore")
8
9
  repo.add("deleteme.rb")
9
10
  end
10
11
 
data/lib/githug/game.rb CHANGED
@@ -21,6 +21,13 @@ module Githug
21
21
  level_bump
22
22
  else
23
23
  UI.error "Sorry, this solution is not quite right!"
24
+ profile.current_attempts += 1
25
+ profile.save
26
+
27
+ if (profile.current_attempts > 2 && profile.current_attempts % 3 == 0)
28
+ UI.error "Don't forget you can type `githug hint` for a hint and `githug reset` to reset the current level"
29
+ end
30
+
24
31
  UI.puts level.full_description
25
32
  end
26
33
  end
data/lib/githug/level.rb CHANGED
@@ -4,7 +4,8 @@ module Githug
4
4
 
5
5
  LEVELS = [nil, "init", "add", "commit", "config", "clone",
6
6
  "clone_to_folder", "ignore", "status", "rm", "rm_cached", "log",
7
- "diff", "blame", "contribute"]
7
+ "commit_ammend", "reset", "checkout_file", "remote", "remote_url",
8
+ "remote_add", "diff", "blame", "contribute"]
8
9
 
9
10
  attr_accessor :level_no, :level_path
10
11
 
@@ -9,6 +9,7 @@ module Githug
9
9
  def load
10
10
  settings = {
11
11
  :level => nil,
12
+ :current_attempts => 0,
12
13
  :current_levels => [],
13
14
  :completed_levels => []
14
15
  }
@@ -47,6 +48,8 @@ module Githug
47
48
 
48
49
  settings[:current_levels] = levels
49
50
 
51
+ settings[:current_attempts] = 0
52
+
50
53
  next_level = (levels - settings[:completed_levels]).first || levels.last
51
54
 
52
55
  settings[:level] = next_level
@@ -1,3 +1,3 @@
1
1
  module Githug
2
- VERSION = "0.0.10"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -3,12 +3,13 @@ require 'spec_helper'
3
3
  describe Githug::Game do
4
4
 
5
5
  before(:each) do
6
- @profile = mock
6
+ @profile = mock.as_null_object
7
7
  Githug::Profile.stub(:new).and_return(@profile)
8
8
  @game = Githug::Game.new
9
9
  @profile.stub(:level).and_return(1)
10
10
  @profile.stub(:save)
11
11
  @profile.stub(:level_bump)
12
+ @profile.stub(:current_attempts).and_return(0)
12
13
  @level = mock
13
14
  @level.stub(:full_description)
14
15
  @level.stub(:setup_level)
@@ -28,17 +29,36 @@ describe Githug::Game do
28
29
  @game.play_level
29
30
  end
30
31
 
31
- it "should echo congratulations if the level is solved" do
32
- @level.stub(:solve).and_return(true)
33
- @profile.should_receive(:level_bump)
34
- Githug::UI.should_receive(:success).with("Congratulations, you have solved the level")
35
- @game.play_level
36
- end
32
+ describe "solve" do
33
+
34
+ it "should echo congratulations if the level is solved" do
35
+ @level.stub(:solve).and_return(true)
36
+ @profile.should_receive(:level_bump)
37
+ Githug::UI.should_receive(:success).with("Congratulations, you have solved the level")
38
+ @game.play_level
39
+ end
40
+
41
+ it "should echo the solution is not right" do
42
+ @level.stub(:solve).and_return(false)
43
+ Githug::UI.should_receive(:error).with("Sorry, this solution is not quite right!")
44
+ @game.play_level
45
+ end
46
+
47
+ it "should increment the number of failed attempts" do
48
+ @level.stub(:solve).and_return(false)
49
+ @profile.should_receive(:current_attempts=).with(1)
50
+ @profile.should_receive(:save)
51
+ @game.play_level
52
+ end
53
+
54
+ it "should prompt for a hint if the user has failed 3 times." do
55
+ @profile.stub(:current_attempts).and_return(3)
56
+ @level.stub(:solve).and_return(false)
57
+ Githug::UI.should_receive(:error).with("Sorry, this solution is not quite right!")
58
+ Githug::UI.should_receive(:error).with("Don't forget you can type `githug hint` for a hint and `githug reset` to reset the current level")
59
+ @game.play_level
60
+ end
37
61
 
38
- it "should echo congratulations if the level is solved" do
39
- @level.stub(:solve).and_return(false)
40
- Githug::UI.should_receive(:error).with("Sorry, this solution is not quite right!")
41
- @game.play_level
42
62
  end
43
63
 
44
64
  it "should output the description of the next level" do
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Githug::Profile do
4
4
 
5
5
  it "should load the profile" do
6
- settings = {:level => 1, :current_levels => [], :completed_levels => []}
6
+ settings = {:level => 1, :current_attempts => 0, :current_levels => [], :completed_levels => []}
7
7
  File.should_receive(:exists?).with(Githug::Profile::PROFILE_FILE).and_return(true)
8
8
  File.should_receive(:open).with(Githug::Profile::PROFILE_FILE).and_return("settings")
9
9
  YAML.should_receive(:load).with("settings").and_return(settings)
@@ -12,7 +12,7 @@ describe Githug::Profile do
12
12
  end
13
13
 
14
14
  it "should load the defaults if the file does not exist" do
15
- defaults = {:level => nil, :current_levels => [], :completed_levels => []}
15
+ defaults = {:level => nil, :current_attempts => 0, :current_levels => [], :completed_levels => []}
16
16
  File.should_receive(:exists?).with(Githug::Profile::PROFILE_FILE).and_return(false)
17
17
  Githug::Profile.should_receive(:new).with(defaults)
18
18
  Githug::Profile.load
@@ -48,6 +48,12 @@ describe Githug::Profile do
48
48
  @profile.level_bump.should eql("add")
49
49
  end
50
50
 
51
+ it "should reset the current_attempts" do
52
+ @profile.current_attempts = 1
53
+ @profile.level_bump
54
+ @profile.current_attempts.should eql(0)
55
+ end
56
+
51
57
  it "should set the level to the first incomplete level" do
52
58
  @profile.settings.stub(:[]).with(:level).and_return("rm_cached")
53
59
  @profile.settings.stub(:[]).with(:completed_levels).and_return(["init", "add"])
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: githug
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.10
5
+ version: 0.1.0
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-14 00:00:00 +00:00
13
+ date: 2012-03-15 00:00:00 +00:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -100,9 +100,11 @@ files:
100
100
  - levels/blame/.githug/objects/ff/d39c2dbfd94bdbca06d48686e0cbda642f3de7
101
101
  - levels/blame/.githug/refs/heads/master
102
102
  - levels/blame/config.rb
103
+ - levels/checkout_file.rb
103
104
  - levels/clone.rb
104
105
  - levels/clone_to_folder.rb
105
106
  - levels/commit.rb
107
+ - levels/commit_ammend.rb
106
108
  - levels/config.rb
107
109
  - levels/contribute.rb
108
110
  - levels/diff.rb
@@ -132,6 +134,10 @@ files:
132
134
  - levels/ignore.rb
133
135
  - levels/init.rb
134
136
  - levels/log.rb
137
+ - levels/remote.rb
138
+ - levels/remote_add.rb
139
+ - levels/remote_url.rb
140
+ - levels/reset.rb
135
141
  - levels/rm.rb
136
142
  - levels/rm_cached.rb
137
143
  - levels/status.rb