daigaku 0.2.0 → 1.0.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.
- checksums.yaml +5 -5
- data/.travis.yml +7 -4
- data/CODE_OF_CONDUCT.md +77 -0
- data/README.md +11 -11
- data/bin/daigaku +6 -2
- data/daigaku.gemspec +22 -26
- data/lib/daigaku.rb +0 -1
- data/lib/daigaku/chapter.rb +3 -4
- data/lib/daigaku/coloring.rb +22 -27
- data/lib/daigaku/configuration.rb +25 -28
- data/lib/daigaku/congratulator.rb +17 -5
- data/lib/daigaku/course.rb +9 -8
- data/lib/daigaku/exceptions.rb +0 -2
- data/lib/daigaku/generator.rb +13 -15
- data/lib/daigaku/github_client.rb +5 -5
- data/lib/daigaku/loadable.rb +23 -14
- data/lib/daigaku/loading/chapters.rb +0 -2
- data/lib/daigaku/loading/courses.rb +0 -2
- data/lib/daigaku/loading/units.rb +0 -2
- data/lib/daigaku/markdown.rb +1 -0
- data/lib/daigaku/markdown/printer.rb +89 -0
- data/lib/daigaku/markdown/ruby_doc.rb +15 -15
- data/lib/daigaku/solution.rb +23 -15
- data/lib/daigaku/storeable.rb +11 -12
- data/lib/daigaku/task.rb +1 -1
- data/lib/daigaku/terminal.rb +3 -4
- data/lib/daigaku/terminal/cli.rb +8 -8
- data/lib/daigaku/terminal/courses.rb +22 -19
- data/lib/daigaku/terminal/output.rb +46 -53
- data/lib/daigaku/terminal/setup.rb +13 -18
- data/lib/daigaku/terminal/solutions.rb +27 -32
- data/lib/daigaku/terminal/welcome.rb +9 -11
- data/lib/daigaku/test.rb +7 -10
- data/lib/daigaku/test_result.rb +54 -21
- data/lib/daigaku/unit.rb +2 -4
- data/lib/daigaku/version.rb +1 -1
- data/lib/daigaku/views.rb +29 -33
- data/lib/daigaku/views/chapters_menu.rb +16 -20
- data/lib/daigaku/views/courses_menu.rb +12 -15
- data/lib/daigaku/views/main_menu.rb +23 -23
- data/lib/daigaku/views/menu.rb +14 -18
- data/lib/daigaku/views/splash.rb +11 -13
- data/lib/daigaku/views/subscriber.rb +38 -0
- data/lib/daigaku/views/task_view.rb +97 -80
- data/lib/daigaku/views/top_bar.rb +4 -10
- data/lib/daigaku/views/units_menu.rb +16 -21
- data/lib/daigaku/window.rb +12 -70
- data/spec/daigaku/chapter_spec.rb +23 -18
- data/spec/daigaku/coloring_spec.rb +0 -1
- data/spec/daigaku/configuration_spec.rb +54 -50
- data/spec/daigaku/congratulator_spec.rb +11 -8
- data/spec/daigaku/course_spec.rb +75 -52
- data/spec/daigaku/generator_spec.rb +24 -25
- data/spec/daigaku/github_client_spec.rb +17 -18
- data/spec/daigaku/loading/chapters_spec.rb +2 -3
- data/spec/daigaku/loading/courses_spec.rb +2 -3
- data/spec/daigaku/loading/units_spec.rb +4 -5
- data/spec/daigaku/markdown/ruby_doc_spec.rb +12 -6
- data/spec/daigaku/reference_solution_spec.rb +8 -10
- data/spec/daigaku/solution_spec.rb +21 -22
- data/spec/daigaku/storeable_spec.rb +12 -10
- data/spec/daigaku/task_spec.rb +3 -4
- data/spec/daigaku/terminal/cli_spec.rb +29 -21
- data/spec/daigaku/terminal/courses_spec.rb +104 -99
- data/spec/daigaku/terminal/output_spec.rb +44 -39
- data/spec/daigaku/terminal/setup_spec.rb +1 -3
- data/spec/daigaku/terminal/solutions_spec.rb +0 -2
- data/spec/daigaku/terminal/welcome_spec.rb +0 -2
- data/spec/daigaku/terminal_spec.rb +5 -7
- data/spec/daigaku/test_example_spec.rb +16 -14
- data/spec/daigaku/test_result_spec.rb +21 -25
- data/spec/daigaku/test_spec.rb +11 -12
- data/spec/daigaku/unit_spec.rb +24 -27
- data/spec/daigaku/views/chapters_menu_spec.rb +0 -1
- data/spec/daigaku/views/courses_menu_spec.rb +0 -1
- data/spec/daigaku/views/menu_spec.rb +1 -2
- data/spec/daigaku/views/task_view_spec.rb +0 -2
- data/spec/daigaku/views/units_menu_spec.rb +0 -1
- data/spec/daigaku/views_spec.rb +0 -1
- data/spec/daigaku_spec.rb +9 -12
- data/spec/path_helpers_spec.rb +11 -12
- data/spec/resource_helpers_spec.rb +11 -12
- data/spec/spec_helper.rb +3 -4
- data/spec/support/macros/content_helpers.rb +16 -17
- data/spec/support/macros/mock_helpers.rb +6 -6
- data/spec/support/macros/path_helpers.rb +15 -15
- data/spec/support/macros/resource_helpers.rb +34 -35
- metadata +32 -44
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Daigaku::Terminal::Output do
|
4
|
-
|
5
4
|
subject do
|
6
5
|
require 'thor'
|
7
6
|
class Test < Thor
|
@@ -30,61 +29,64 @@ describe Daigaku::Terminal::Output do
|
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
33
|
-
describe
|
34
|
-
it
|
35
|
-
line =
|
32
|
+
describe '.say' do
|
33
|
+
it 'prints the prescribed output to the $stdout' do
|
34
|
+
line = 'line'
|
36
35
|
expect($stdout).to receive(:puts).with("\t#{line}")
|
37
36
|
subject.send(:say, line)
|
38
37
|
end
|
39
38
|
|
40
|
-
it
|
41
|
-
lines
|
42
|
-
out_lines = lines.split("\n").map {|l| "\t#{l}" }.join("\n")
|
39
|
+
it 'adds the line start in case of multiline inputs' do
|
40
|
+
lines = "first line\nsecond line\nthird line\n"
|
41
|
+
out_lines = lines.split("\n").map { |l| "\t#{l}" }.join("\n")
|
42
|
+
|
43
43
|
expect($stdout).to receive(:puts).with(out_lines)
|
44
44
|
subject.send(:say, lines)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
describe
|
49
|
-
it
|
48
|
+
describe '.empty_line' do
|
49
|
+
it 'prints an empty line to the $stdout' do
|
50
50
|
expect($stdout).to receive(:puts).with('')
|
51
51
|
subject.send(:empty_line)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
describe
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
describe '.get' do
|
56
|
+
let(:text) { 'printed' }
|
57
|
+
|
58
|
+
it 'prints a string to $stdout to get a line on $stdin' do
|
59
|
+
allow($stdin).to receive(:gets).and_return('received')
|
59
60
|
|
60
|
-
|
61
|
-
expect($stdout).to receive(:print).with("\n\t#{printed} ")
|
61
|
+
expect($stdout).to receive(:print).with("\n\t#{text} ")
|
62
62
|
expect($stdin).to receive(:gets)
|
63
|
-
subject.send(:get,
|
63
|
+
subject.send(:get, text)
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
describe
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
describe '.say_info' do
|
68
|
+
let(:line) { 'line' }
|
69
|
+
|
70
|
+
it 'prints the prescribed output to the $stdout' do
|
71
|
+
expect($stdout).to receive(:puts).exactly(4).times.with('')
|
71
72
|
expect($stdout).to receive(:puts).with("\t" + " ℹ #{line}".light_blue)
|
72
|
-
expect($stdout).to receive(:puts).twice.
|
73
|
+
expect($stdout).to receive(:puts).twice.with("\t" + ('-' * 70).light_blue)
|
73
74
|
subject.send(:say_info, line)
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
77
|
-
describe
|
78
|
-
|
79
|
-
|
80
|
-
|
78
|
+
describe '.say_warning' do
|
79
|
+
let(:line) { 'line' }
|
80
|
+
|
81
|
+
it 'prints the prescribed output to the $stdout' do
|
82
|
+
expect($stdout).to receive(:puts).exactly(4).times.with('')
|
81
83
|
expect($stdout).to receive(:puts).with("\t" + "⚠ #{line}".light_red)
|
82
|
-
expect($stdout).to receive(:puts).twice.
|
84
|
+
expect($stdout).to receive(:puts).twice.with("\t" + ('-' * 70).light_red)
|
83
85
|
subject.send(:say_warning, line)
|
84
86
|
end
|
85
87
|
end
|
86
88
|
|
87
|
-
describe
|
89
|
+
describe '.get_command' do
|
88
90
|
before do
|
89
91
|
@correct_command = 'correct command'
|
90
92
|
@description = 'description'
|
@@ -92,27 +94,30 @@ describe Daigaku::Terminal::Output do
|
|
92
94
|
allow(Kernel).to receive(:system) { '' }
|
93
95
|
end
|
94
96
|
|
95
|
-
it
|
97
|
+
it 'prints a description' do
|
96
98
|
expect($stdout).to receive(:puts).once.with("\t#{@description}")
|
97
99
|
subject.send(:get_command, @correct_command, @description)
|
98
100
|
end
|
99
101
|
|
100
|
-
it
|
102
|
+
it 'gets a command from the $stdin' do
|
101
103
|
expect($stdin).to receive(:gets)
|
102
104
|
subject.send(:get_command, @correct_command, @description)
|
103
105
|
end
|
104
106
|
|
105
|
-
context
|
106
|
-
it
|
107
|
+
context 'with the right command typed in' do
|
108
|
+
it 'gets a specified command from the user' do
|
107
109
|
subject.send(:get_command, @correct_command, @description)
|
108
110
|
end
|
109
111
|
end
|
110
112
|
|
111
|
-
context
|
112
|
-
it
|
113
|
+
context 'with a wrong command typed in' do
|
114
|
+
it 'writes a hint' do
|
113
115
|
wrong_command = 'wrong command'
|
114
116
|
error = "This was something else. Try \"#{@correct_command}\"."
|
115
|
-
|
117
|
+
|
118
|
+
allow($stdin)
|
119
|
+
.to receive(:gets)
|
120
|
+
.and_return(wrong_command, @correct_command)
|
116
121
|
|
117
122
|
expect($stdout).to receive(:puts).once.with("\t#{error}")
|
118
123
|
subject.send(:get_command, @correct_command, @description)
|
@@ -120,29 +125,29 @@ describe Daigaku::Terminal::Output do
|
|
120
125
|
end
|
121
126
|
end
|
122
127
|
|
123
|
-
describe
|
128
|
+
describe '.get_confirm' do
|
124
129
|
before do
|
125
130
|
@description = 'description'
|
126
131
|
allow($stdin).to receive(:gets).and_return('yes')
|
127
132
|
end
|
128
133
|
|
129
|
-
it
|
134
|
+
it 'prints a warning with the given description' do
|
130
135
|
expect(subject).to receive(:say_warning).once.with(@description)
|
131
136
|
subject.send(:get_confirm, @description)
|
132
137
|
end
|
133
138
|
|
134
|
-
it
|
139
|
+
it 'gets a command from the $stdin' do
|
135
140
|
expect($stdin).to receive(:gets)
|
136
141
|
subject.send(:get_confirm, @description)
|
137
142
|
end
|
138
143
|
|
139
|
-
it
|
144
|
+
it 'takes a block to run when confirmed' do
|
140
145
|
allow(subject).to receive(:mocked_method).and_return('mocked method')
|
141
146
|
expect(subject).to receive(:mocked_method)
|
142
147
|
subject.send(:get_confirm, @description) { subject.mocked_method }
|
143
148
|
end
|
144
149
|
|
145
|
-
it
|
150
|
+
it 'does not run the given block if not confirmed' do
|
146
151
|
allow(subject).to receive(:get).and_return('no')
|
147
152
|
expect(subject).not_to receive(:mocked_method)
|
148
153
|
subject.send(:get_confirm, @description) { subject.mocked_method }
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Daigaku::Terminal::Welcome do
|
4
|
-
|
5
4
|
[:run, :about].each do |method|
|
6
5
|
it "has the singleton method ::#{method}" do
|
7
6
|
singleton_methods = Daigaku::Terminal::Welcome.singleton_methods
|
8
7
|
expect(singleton_methods.include?(method)).to be_truthy
|
9
8
|
end
|
10
9
|
end
|
11
|
-
|
12
10
|
end
|
@@ -1,24 +1,22 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Daigaku::Terminal do
|
4
|
-
|
5
4
|
it { is_expected.to respond_to :text }
|
6
5
|
|
7
|
-
describe
|
8
|
-
it
|
6
|
+
describe '.text' do
|
7
|
+
it 'loads a text from a file in the terminal/texts' do
|
9
8
|
text = Daigaku::Terminal.text(:welcome)
|
10
9
|
expect(text).to be_a String
|
11
10
|
end
|
12
11
|
|
13
|
-
it
|
12
|
+
it 'returns an empty string if the file does not exist' do
|
14
13
|
text = Daigaku::Terminal.text(:non_existent_text)
|
15
14
|
expect(text).to eq ''
|
16
15
|
end
|
17
16
|
|
18
|
-
it
|
19
|
-
allow(File).to receive(:read)
|
17
|
+
it 'returns an empty string if the file has no content' do
|
18
|
+
allow(File).to receive(:read).and_return('')
|
20
19
|
expect(Daigaku::Terminal.text(:congratulations)).to eq ''
|
21
20
|
end
|
22
21
|
end
|
23
|
-
|
24
22
|
end
|
@@ -1,31 +1,34 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Daigaku::TestExample do
|
4
|
+
subject { Daigaku::TestExample.new(description: '', status: '') }
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
it { is_expected.to respond_to :description }
|
7
|
+
it { is_expected.to respond_to :status }
|
8
|
+
it { is_expected.to respond_to :message }
|
8
9
|
|
9
|
-
context
|
10
|
+
context 'when passed' do
|
10
11
|
let(:description) { test_passed_json_parsed[:examples].first[:description] }
|
11
|
-
let(:status)
|
12
|
+
let(:status) { test_passed_json_parsed[:examples].first[:status] }
|
12
13
|
|
13
|
-
subject
|
14
|
+
subject do
|
15
|
+
Daigaku::TestExample.new(description: description, status: status)
|
16
|
+
end
|
14
17
|
|
15
|
-
it
|
18
|
+
it 'has the prescribed description' do
|
16
19
|
expect(subject.description).to eq description
|
17
20
|
end
|
18
21
|
|
19
|
-
it
|
22
|
+
it 'has the prescribed status' do
|
20
23
|
expect(subject.status).to eq status
|
21
24
|
end
|
22
25
|
|
23
|
-
it
|
26
|
+
it 'has the prescribed message' do
|
24
27
|
expect(subject.message).to eq example_passed_message
|
25
28
|
end
|
26
29
|
end
|
27
30
|
|
28
|
-
context
|
31
|
+
context 'when failed' do
|
29
32
|
let(:description) { test_failed_json_parsed[:examples].first[:description] }
|
30
33
|
let(:status) { test_failed_json_parsed[:examples].first[:status] }
|
31
34
|
let(:message) { test_failed_json_parsed[:examples].first[:exception][:message] }
|
@@ -38,17 +41,16 @@ describe Daigaku::TestExample do
|
|
38
41
|
)
|
39
42
|
end
|
40
43
|
|
41
|
-
it
|
44
|
+
it 'has the prescribed description' do
|
42
45
|
expect(subject.description).to eq description
|
43
46
|
end
|
44
47
|
|
45
|
-
it
|
48
|
+
it 'has the prescribed status' do
|
46
49
|
expect(subject.status).to eq status
|
47
50
|
end
|
48
51
|
|
49
|
-
it
|
52
|
+
it 'has the prescribed message' do
|
50
53
|
expect(subject.message).to eq message
|
51
54
|
end
|
52
55
|
end
|
53
|
-
|
54
56
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Daigaku::TestResult do
|
4
|
-
|
5
4
|
subject { Daigaku::TestResult.new(test_passed_json) }
|
6
5
|
|
7
6
|
it { is_expected.to respond_to :example_count }
|
@@ -11,55 +10,53 @@ describe Daigaku::TestResult do
|
|
11
10
|
it { is_expected.to respond_to :summary }
|
12
11
|
it { is_expected.to respond_to :summary_lines }
|
13
12
|
|
14
|
-
context
|
15
|
-
|
13
|
+
context 'with passed input' do
|
16
14
|
subject { Daigaku::TestResult.new(test_passed_json) }
|
17
15
|
|
18
|
-
it
|
19
|
-
expect(subject.passed?).to
|
16
|
+
it 'is marked passed' do
|
17
|
+
expect(subject.passed?).to be true
|
20
18
|
end
|
21
19
|
|
22
|
-
it
|
20
|
+
it 'has a default summary' do
|
23
21
|
expect(subject.summary).to include test_passed_summary
|
24
22
|
end
|
25
23
|
end
|
26
24
|
|
27
|
-
context
|
28
|
-
|
25
|
+
context 'with failed input' do
|
29
26
|
subject { Daigaku::TestResult.new(test_failed_json) }
|
30
27
|
|
31
|
-
it
|
32
|
-
expect(subject.passed?).to
|
28
|
+
it 'is not marked passed' do
|
29
|
+
expect(subject.passed?).to be false
|
33
30
|
end
|
34
31
|
|
35
|
-
it
|
32
|
+
it 'has the prescribed example count' do
|
36
33
|
example_count = test_failed_json_parsed[:summary][:example_count]
|
37
34
|
expect(subject.example_count).to eq example_count
|
38
35
|
end
|
39
36
|
|
40
|
-
it
|
37
|
+
it 'has the prescribed failure count' do
|
41
38
|
failure_count = test_failed_json_parsed[:summary][:failure_count]
|
42
39
|
expect(subject.failure_count).to eq failure_count
|
43
40
|
end
|
44
41
|
|
45
|
-
describe
|
46
|
-
it
|
42
|
+
describe '#examples' do
|
43
|
+
it 'returns the prescribed number of examples' do
|
47
44
|
examples_count = test_failed_json_parsed[:examples].count
|
48
45
|
expect(subject.examples.count).to eq examples_count
|
49
46
|
end
|
50
47
|
|
51
|
-
it
|
48
|
+
it 'returns examples of type Daigaku::TestExample' do
|
52
49
|
subject.examples.each do |example|
|
53
50
|
expect(example).to be_a Daigaku::TestExample
|
54
51
|
end
|
55
52
|
end
|
56
53
|
|
57
|
-
it
|
54
|
+
it 'return examples with the prescribed info' do
|
58
55
|
subject.examples.each_with_index do |example, index|
|
59
56
|
description = test_failed_json_parsed[:examples][index][:full_description]
|
60
|
-
status
|
61
|
-
exception
|
62
|
-
message
|
57
|
+
status = test_failed_json_parsed[:examples][index][:status]
|
58
|
+
exception = test_failed_json_parsed[:examples][index][:exception]
|
59
|
+
message = exception ? exception[:message] : example_passed_message
|
63
60
|
|
64
61
|
expect(example.description).to eq description
|
65
62
|
expect(example.status).to eq status
|
@@ -68,8 +65,8 @@ describe Daigaku::TestResult do
|
|
68
65
|
end
|
69
66
|
end
|
70
67
|
|
71
|
-
describe
|
72
|
-
it
|
68
|
+
describe '#summary' do
|
69
|
+
it 'returns a string having all example infos' do
|
73
70
|
subject.examples.each do |example|
|
74
71
|
expect(subject.summary).to include example.description
|
75
72
|
expect(subject.summary).to include example.message
|
@@ -79,13 +76,12 @@ describe Daigaku::TestResult do
|
|
79
76
|
end
|
80
77
|
end
|
81
78
|
|
82
|
-
describe
|
83
|
-
it
|
84
|
-
lines =
|
79
|
+
describe '#summary_lines' do
|
80
|
+
it 'returns the summary split into lines' do
|
81
|
+
lines = %w(This is a summary for a test)
|
85
82
|
allow(subject).to receive(:summary) { lines.join("\n") }
|
86
83
|
|
87
84
|
expect(subject.summary_lines).to eq lines
|
88
85
|
end
|
89
86
|
end
|
90
|
-
|
91
87
|
end
|
data/spec/daigaku/test_spec.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Daigaku::Test do
|
4
|
-
|
5
4
|
it { is_expected.to respond_to :path }
|
6
5
|
it { is_expected.to respond_to :run }
|
7
6
|
|
@@ -15,34 +14,34 @@ describe Daigaku::Test do
|
|
15
14
|
|
16
15
|
subject { Daigaku::Test.new(unit_path) }
|
17
16
|
|
18
|
-
it
|
17
|
+
it 'has the appropriate path' do
|
19
18
|
expect(subject.path).to eq test_path
|
20
19
|
end
|
21
20
|
|
22
|
-
describe
|
21
|
+
describe '#run' do
|
23
22
|
before do
|
24
|
-
course_name
|
23
|
+
course_name = course_dir_names.first
|
25
24
|
chapter_name = chapter_dir_names.first
|
26
|
-
unit_name
|
25
|
+
unit_name = unit_dir_names.first
|
26
|
+
|
27
27
|
@code = available_solution(course_name, chapter_name, unit_name).code
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
30
|
+
it 'returns a Daigaku::TestResult' do
|
31
31
|
expect(subject.run(@code)).to be_a Daigaku::TestResult
|
32
32
|
end
|
33
33
|
|
34
|
-
context
|
35
|
-
it
|
34
|
+
context 'when passing' do
|
35
|
+
it 'returns a passing result' do
|
36
36
|
expect(subject.run(@code).passed?).to be_truthy
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
context
|
41
|
-
it
|
42
|
-
code =
|
40
|
+
context 'when failing' do
|
41
|
+
it 'returns a failing result' do
|
42
|
+
code = 'print "BYE WORLD"'
|
43
43
|
expect(subject.run(code).passed?).to be_falsey
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
47
|
-
|
48
47
|
end
|