-
Notifications
You must be signed in to change notification settings - Fork 1k
/
level.rb
83 lines (66 loc) · 1.56 KB
/
level.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
module Githug
class Level
include UI
LEVELS = [nil, "init", "add", "commit", "config", "clone", "clone_to_folder", "status", "diff", "blame", "contribute"]
attr_accessor :level_no, :level_path
class << self
def load(level_no)
level = new
level_path = "#{File.dirname(__FILE__)}/../../levels/#{LEVELS[level_no]}"
location = "#{level_path}.rb"
return false unless File.exists?(location)
level.instance_eval(File.read(location))
level.level_no = level_no
level.level_path = level_path
level
end
end
def init_from_level
FileUtils.cp_r("#{level_path}/.", ".")
FileUtils.mv(".githug", ".git")
end
def difficulty(num)
@difficulty = num
end
def description(description)
@description = description
end
def solution(&block)
@solution = block
end
def setup(&block)
@setup = block
end
def hint(&hint)
@hint = hint
end
def full_description
UI.puts
UI.puts "Level: #{level_no}"
UI.puts "Difficulty: #{"*"*@difficulty}"
UI.puts
UI.puts @description
UI.puts
end
def setup_level
repo.reset
@setup.call if @setup
end
def repo(location = "")
@repo ||= Repository.new(location)
end
def solve
@solution.call
rescue
false
end
def show_hint
UI.word_box("Githug")
if @hint
@hint.call
else
UI.puts("No hints available for this level")
end
end
end
end