daigaku 0.0.2 → 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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -0
- data/README.md +25 -3
- data/Rakefile +3 -0
- data/daigaku.gemspec +3 -2
- data/lib/daigaku/configuration.rb +7 -4
- data/lib/daigaku/congratulator.rb +13 -0
- data/lib/daigaku/course.rb +5 -0
- data/lib/daigaku/generator.rb +13 -6
- data/lib/daigaku/github_client.rb +30 -0
- data/lib/daigaku/reference_solution.rb +10 -2
- data/lib/daigaku/solution.rb +19 -8
- data/lib/daigaku/storeable.rb +32 -0
- data/lib/daigaku/terminal/courses.rb +103 -11
- data/lib/daigaku/terminal/output.rb +6 -0
- data/lib/daigaku/terminal/texts/congratulations.txt +12 -0
- data/lib/daigaku/terminal.rb +2 -1
- data/lib/daigaku/test_result.rb +5 -3
- data/lib/daigaku/version.rb +1 -1
- data/lib/daigaku/views/chapters_menu.rb +19 -50
- data/lib/daigaku/views/courses_menu.rb +14 -49
- data/lib/daigaku/views/main_menu.rb +6 -6
- data/lib/daigaku/views/menu.rb +89 -0
- data/lib/daigaku/views/task_view.rb +29 -11
- data/lib/daigaku/views/top_bar.rb +9 -17
- data/lib/daigaku/views/units_menu.rb +21 -52
- data/lib/daigaku/views.rb +4 -12
- data/lib/daigaku/window.rb +46 -3
- data/lib/daigaku.rb +1 -4
- data/spec/daigaku/configuration_spec.rb +11 -11
- data/spec/daigaku/congratulator_spec.rb +24 -0
- data/spec/daigaku/course_spec.rb +18 -0
- data/spec/daigaku/generator_spec.rb +4 -4
- data/spec/daigaku/github_client_spec.rb +53 -0
- data/spec/daigaku/reference_solution_spec.rb +20 -2
- data/spec/daigaku/solution_spec.rb +13 -6
- data/spec/daigaku/storeable_spec.rb +35 -0
- data/spec/daigaku/terminal/courses_spec.rb +215 -5
- data/spec/daigaku/terminal/output_spec.rb +31 -3
- data/spec/daigaku/terminal_spec.rb +12 -2
- data/spec/daigaku/test_result_spec.rb +12 -2
- data/spec/daigaku/views/chapters_menu_spec.rb +1 -3
- data/spec/daigaku/views/courses_menu_spec.rb +1 -3
- data/spec/daigaku/views/menu_spec.rb +19 -0
- data/spec/daigaku/views/task_view_spec.rb +1 -1
- data/spec/daigaku/views/units_menu_spec.rb +1 -3
- data/spec/daigaku/views_spec.rb +0 -2
- data/spec/daigaku_spec.rb +0 -6
- data/spec/support/macros/content_helpers.rb +1 -1
- data/spec/support/macros/mock_helpers.rb +6 -1
- data/spec/support/macros/path_helpers.rb +12 -6
- data/spec/support/macros/resource_helpers.rb +3 -1
- metadata +33 -8
- data/lib/daigaku/database.rb +0 -64
- data/spec/daigaku/database_spec.rb +0 -79
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Daigaku::Views::Menu do
|
4
|
+
|
5
|
+
it { is_expected.to respond_to :enter }
|
6
|
+
it { is_expected.to respond_to :reenter }
|
7
|
+
|
8
|
+
[
|
9
|
+
:show,
|
10
|
+
:draw,
|
11
|
+
:interact_with,
|
12
|
+
:models,
|
13
|
+
:items
|
14
|
+
].each do |method|
|
15
|
+
it "has a protected method ##{method}" do
|
16
|
+
expect(subject.protected_methods).to include(method)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/daigaku/views_spec.rb
CHANGED
data/spec/daigaku_spec.rb
CHANGED
@@ -48,10 +48,4 @@ describe "Daigaku module" do
|
|
48
48
|
expect(Daigaku.config.solutions_path).to eq courses_basepath
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
52
|
-
describe "::database" do
|
53
|
-
it "returns a Diagaku::Database instance" do
|
54
|
-
expect(Daigaku.database).to be_a Daigaku::Database
|
55
|
-
end
|
56
|
-
end
|
57
51
|
end
|
@@ -7,7 +7,12 @@ module MockHelpers
|
|
7
7
|
def use_test_storage_file
|
8
8
|
Daigaku::Configuration.send(:new)
|
9
9
|
Daigaku.config.instance_variable_set(:@storage_file, local_storage_file)
|
10
|
-
|
10
|
+
|
11
|
+
QuickStore.configure do |config|
|
12
|
+
config.file_path = Daigaku.config.storage_file
|
13
|
+
end
|
14
|
+
|
15
|
+
QuickStore.store.send(:new)
|
11
16
|
end
|
12
17
|
|
13
18
|
def suppress_print_out
|
@@ -5,8 +5,8 @@ module PathHelpers
|
|
5
5
|
SOLUTIONS = 'solutions'
|
6
6
|
TEMP_PATH = File.expand_path("../../../../tmp/", __FILE__)
|
7
7
|
COURSE_DIR_NAMES = ['Course_A', 'Course_B']
|
8
|
-
CHAPTER_DIR_NAMES = ['
|
9
|
-
UNIT_DIR_NAMES = ['
|
8
|
+
CHAPTER_DIR_NAMES = ['1_Chapter-A', '2_Chapter-B']
|
9
|
+
UNIT_DIR_NAMES = ['1_unit-a', '2_unit-b']
|
10
10
|
TASK_NAME = 'task.md'
|
11
11
|
REFERENCE_SOLUTION_NAME = 'solution.rb'
|
12
12
|
TEST_NAME = 'solution_spec.rb'
|
@@ -45,7 +45,7 @@ module PathHelpers
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def courses_basepath
|
48
|
-
File.join(test_basepath, COURSES)
|
48
|
+
File.join(test_basepath, LOCAL_DIR, COURSES)
|
49
49
|
end
|
50
50
|
|
51
51
|
def solutions_basepath
|
@@ -86,11 +86,17 @@ module PathHelpers
|
|
86
86
|
|
87
87
|
def all_solution_file_paths
|
88
88
|
all_unit_dirs.map do |unit_dir|
|
89
|
-
underscored_unit_dir = File.basename(unit_dir).gsub(/
|
90
|
-
file_name = underscored_unit_dir + Daigaku::
|
89
|
+
underscored_unit_dir = File.basename(unit_dir).gsub(/[\_\-\.]+/, '_')
|
90
|
+
file_name = underscored_unit_dir + Daigaku::Solution::FILE_SUFFIX
|
91
|
+
|
91
92
|
unit_path = File.join(solutions_basepath, unit_dir.split('/')[-3..-1])
|
93
|
+
parts = File.join(File.dirname(unit_path), file_name).split('/')
|
94
|
+
|
95
|
+
course_parts = parts[-3..-1].map do |part|
|
96
|
+
part.gsub(/^[\d]+\_/, '').gsub(/[\_\-]+/, '_').downcase
|
97
|
+
end
|
92
98
|
|
93
|
-
|
99
|
+
[*parts[0...-3], *course_parts].join('/')
|
94
100
|
end
|
95
101
|
end
|
96
102
|
|
@@ -33,7 +33,9 @@ module ResourceHelpers
|
|
33
33
|
|
34
34
|
Zip::File.open(zip_file_path, Zip::File::CREATE) do |zip_file|
|
35
35
|
Dir[File.join(directory, '**', '**')].each do |file|
|
36
|
-
|
36
|
+
if file.match(course_dir_names.first)
|
37
|
+
zip_file.add(file.sub(directory, '')[1..-1], file) { true }
|
38
|
+
end
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: daigaku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Götze
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: curses
|
@@ -152,6 +152,20 @@ dependencies:
|
|
152
152
|
- - "<"
|
153
153
|
- !ruby/object:Gem::Version
|
154
154
|
version: '3.0'
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: quick_store
|
157
|
+
requirement: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - "~>"
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: 0.1.0
|
162
|
+
type: :runtime
|
163
|
+
prerelease: false
|
164
|
+
version_requirements: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - "~>"
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: 0.1.0
|
155
169
|
- !ruby/object:Gem::Dependency
|
156
170
|
name: bundler
|
157
171
|
requirement: !ruby/object:Gem::Requirement
|
@@ -209,7 +223,7 @@ dependencies:
|
|
209
223
|
- !ruby/object:Gem::Version
|
210
224
|
version: 4.5.0
|
211
225
|
description: Daigaku is the Japanese word for university. With Daigaku you can interactively
|
212
|
-
learn the Ruby
|
226
|
+
learn the Ruby programming language using the command line.
|
213
227
|
email:
|
214
228
|
- paul.christoph.goetze@gmail.com
|
215
229
|
executables:
|
@@ -218,6 +232,7 @@ extensions: []
|
|
218
232
|
extra_rdoc_files: []
|
219
233
|
files:
|
220
234
|
- ".gitignore"
|
235
|
+
- ".travis.yml"
|
221
236
|
- Gemfile
|
222
237
|
- Guardfile
|
223
238
|
- README.md
|
@@ -227,16 +242,18 @@ files:
|
|
227
242
|
- lib/daigaku.rb
|
228
243
|
- lib/daigaku/chapter.rb
|
229
244
|
- lib/daigaku/configuration.rb
|
245
|
+
- lib/daigaku/congratulator.rb
|
230
246
|
- lib/daigaku/course.rb
|
231
|
-
- lib/daigaku/database.rb
|
232
247
|
- lib/daigaku/exceptions.rb
|
233
248
|
- lib/daigaku/generator.rb
|
249
|
+
- lib/daigaku/github_client.rb
|
234
250
|
- lib/daigaku/loadable.rb
|
235
251
|
- lib/daigaku/loading/chapters.rb
|
236
252
|
- lib/daigaku/loading/courses.rb
|
237
253
|
- lib/daigaku/loading/units.rb
|
238
254
|
- lib/daigaku/reference_solution.rb
|
239
255
|
- lib/daigaku/solution.rb
|
256
|
+
- lib/daigaku/storeable.rb
|
240
257
|
- lib/daigaku/task.rb
|
241
258
|
- lib/daigaku/terminal.rb
|
242
259
|
- lib/daigaku/terminal/cli.rb
|
@@ -245,6 +262,7 @@ files:
|
|
245
262
|
- lib/daigaku/terminal/setup.rb
|
246
263
|
- lib/daigaku/terminal/solutions.rb
|
247
264
|
- lib/daigaku/terminal/texts/about.txt
|
265
|
+
- lib/daigaku/terminal/texts/congratulations.txt
|
248
266
|
- lib/daigaku/terminal/texts/courses_empty.txt
|
249
267
|
- lib/daigaku/terminal/texts/hint_course_download.txt
|
250
268
|
- lib/daigaku/terminal/texts/welcome.txt
|
@@ -257,6 +275,7 @@ files:
|
|
257
275
|
- lib/daigaku/views/chapters_menu.rb
|
258
276
|
- lib/daigaku/views/courses_menu.rb
|
259
277
|
- lib/daigaku/views/main_menu.rb
|
278
|
+
- lib/daigaku/views/menu.rb
|
260
279
|
- lib/daigaku/views/splash.rb
|
261
280
|
- lib/daigaku/views/task_view.rb
|
262
281
|
- lib/daigaku/views/top_bar.rb
|
@@ -264,14 +283,16 @@ files:
|
|
264
283
|
- lib/daigaku/window.rb
|
265
284
|
- spec/daigaku/chapter_spec.rb
|
266
285
|
- spec/daigaku/configuration_spec.rb
|
286
|
+
- spec/daigaku/congratulator_spec.rb
|
267
287
|
- spec/daigaku/course_spec.rb
|
268
|
-
- spec/daigaku/database_spec.rb
|
269
288
|
- spec/daigaku/generator_spec.rb
|
289
|
+
- spec/daigaku/github_client_spec.rb
|
270
290
|
- spec/daigaku/loading/chapters_spec.rb
|
271
291
|
- spec/daigaku/loading/courses_spec.rb
|
272
292
|
- spec/daigaku/loading/units_spec.rb
|
273
293
|
- spec/daigaku/reference_solution_spec.rb
|
274
294
|
- spec/daigaku/solution_spec.rb
|
295
|
+
- spec/daigaku/storeable_spec.rb
|
275
296
|
- spec/daigaku/task_spec.rb
|
276
297
|
- spec/daigaku/terminal/cli_spec.rb
|
277
298
|
- spec/daigaku/terminal/courses_spec.rb
|
@@ -286,6 +307,7 @@ files:
|
|
286
307
|
- spec/daigaku/unit_spec.rb
|
287
308
|
- spec/daigaku/views/chapters_menu_spec.rb
|
288
309
|
- spec/daigaku/views/courses_menu_spec.rb
|
310
|
+
- spec/daigaku/views/menu_spec.rb
|
289
311
|
- spec/daigaku/views/task_view_spec.rb
|
290
312
|
- spec/daigaku/views/units_menu_spec.rb
|
291
313
|
- spec/daigaku/views_spec.rb
|
@@ -308,9 +330,9 @@ require_paths:
|
|
308
330
|
- lib
|
309
331
|
required_ruby_version: !ruby/object:Gem::Requirement
|
310
332
|
requirements:
|
311
|
-
- - "
|
333
|
+
- - "~>"
|
312
334
|
- !ruby/object:Gem::Version
|
313
|
-
version: '0'
|
335
|
+
version: '2.0'
|
314
336
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
315
337
|
requirements:
|
316
338
|
- - ">="
|
@@ -325,14 +347,16 @@ summary: Learning Ruby on the command line.
|
|
325
347
|
test_files:
|
326
348
|
- spec/daigaku/chapter_spec.rb
|
327
349
|
- spec/daigaku/configuration_spec.rb
|
350
|
+
- spec/daigaku/congratulator_spec.rb
|
328
351
|
- spec/daigaku/course_spec.rb
|
329
|
-
- spec/daigaku/database_spec.rb
|
330
352
|
- spec/daigaku/generator_spec.rb
|
353
|
+
- spec/daigaku/github_client_spec.rb
|
331
354
|
- spec/daigaku/loading/chapters_spec.rb
|
332
355
|
- spec/daigaku/loading/courses_spec.rb
|
333
356
|
- spec/daigaku/loading/units_spec.rb
|
334
357
|
- spec/daigaku/reference_solution_spec.rb
|
335
358
|
- spec/daigaku/solution_spec.rb
|
359
|
+
- spec/daigaku/storeable_spec.rb
|
336
360
|
- spec/daigaku/task_spec.rb
|
337
361
|
- spec/daigaku/terminal/cli_spec.rb
|
338
362
|
- spec/daigaku/terminal/courses_spec.rb
|
@@ -347,6 +371,7 @@ test_files:
|
|
347
371
|
- spec/daigaku/unit_spec.rb
|
348
372
|
- spec/daigaku/views/chapters_menu_spec.rb
|
349
373
|
- spec/daigaku/views/courses_menu_spec.rb
|
374
|
+
- spec/daigaku/views/menu_spec.rb
|
350
375
|
- spec/daigaku/views/task_view_spec.rb
|
351
376
|
- spec/daigaku/views/units_menu_spec.rb
|
352
377
|
- spec/daigaku/views_spec.rb
|
data/lib/daigaku/database.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'yaml/store'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
module Daigaku
|
5
|
-
|
6
|
-
class Database
|
7
|
-
include Singleton
|
8
|
-
|
9
|
-
attr_reader :file
|
10
|
-
|
11
|
-
def initialize
|
12
|
-
@file = Daigaku.config.storage_file
|
13
|
-
directory = File.dirname(@file)
|
14
|
-
FileUtils.makedirs(directory) unless Dir.exist?(directory)
|
15
|
-
|
16
|
-
@db = YAML::Store.new(@file)
|
17
|
-
end
|
18
|
-
|
19
|
-
def set(key, value)
|
20
|
-
@db.transaction { @db[key.to_s] = value }
|
21
|
-
end
|
22
|
-
|
23
|
-
def get(key)
|
24
|
-
@db.transaction { @db[key.to_s] }
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.get(key)
|
28
|
-
instance.get(key)
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.set(key, value)
|
32
|
-
instance.set(key, value)
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.file
|
36
|
-
instance.file
|
37
|
-
end
|
38
|
-
|
39
|
-
# Defines getter and setter methods for arbitrarily named methods.
|
40
|
-
# @xample
|
41
|
-
# Diagaku::Database.answer = 42
|
42
|
-
# => saves 'answer: 42' to database
|
43
|
-
#
|
44
|
-
# Daigaku::Database.answer
|
45
|
-
# => 42
|
46
|
-
def self.method_missing(method, *args, &block)
|
47
|
-
if method =~ /.*=$/
|
48
|
-
if singleton_methods.include?(method.to_s.chop.to_sym)
|
49
|
-
raise "There is a \"#{method.to_s.chop}\" instance method already " +
|
50
|
-
"defined. This will lead to problems while getting values " +
|
51
|
-
"from the database. Please use another key than " +
|
52
|
-
"#{singleton_methods.map(&:to_s)}."
|
53
|
-
end
|
54
|
-
|
55
|
-
instance.set(method.to_s.gsub(/=$/, ''), args[0])
|
56
|
-
elsif args.count == 0
|
57
|
-
instance.get(method)
|
58
|
-
else
|
59
|
-
super
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Daigaku::Database do
|
4
|
-
|
5
|
-
subject { Daigaku::Database.send(:new) }
|
6
|
-
|
7
|
-
before do
|
8
|
-
Daigaku::Configuration.send(:new)
|
9
|
-
|
10
|
-
allow_any_instance_of(Daigaku::Configuration).to \
|
11
|
-
receive(:storage_file) { local_storage_file }
|
12
|
-
end
|
13
|
-
|
14
|
-
it { is_expected.to respond_to :get }
|
15
|
-
it { is_expected.to respond_to :set }
|
16
|
-
it { is_expected.to respond_to :file }
|
17
|
-
|
18
|
-
it "creates the database file(s) in the .daigaku directory on access" do
|
19
|
-
Daigaku::Database.call_an_arbitrary_method
|
20
|
-
expect(File.exist?(local_storage_file)).to be_truthy
|
21
|
-
end
|
22
|
-
|
23
|
-
it "allows setting arbitrary keys by setter methods" do
|
24
|
-
expect { Daigaku::Database.brownie = "brownie" }
|
25
|
-
.not_to raise_error
|
26
|
-
end
|
27
|
-
|
28
|
-
it "allows getting subsequently set keys" do
|
29
|
-
Daigaku::Database.carrots = "carrots"
|
30
|
-
expect(Daigaku::Database.carrots).to eq "carrots"
|
31
|
-
end
|
32
|
-
|
33
|
-
it "returns nil for not set keys" do
|
34
|
-
expect(Daigaku::Database.hamburger).to be_nil
|
35
|
-
end
|
36
|
-
|
37
|
-
it "raises an method missing errror for non getter/setter methods" do
|
38
|
-
expect { Daigaku::Database.arbitrary_method(1, 2) }
|
39
|
-
.to raise_error NoMethodError
|
40
|
-
end
|
41
|
-
|
42
|
-
it "responds to ::get" do
|
43
|
-
expect(Daigaku::Database).to respond_to :get
|
44
|
-
end
|
45
|
-
|
46
|
-
it "responds to ::set" do
|
47
|
-
expect(Daigaku::Database).to respond_to :set
|
48
|
-
end
|
49
|
-
|
50
|
-
it "responds to ::file" do
|
51
|
-
expect(Daigaku::Database).to respond_to :file
|
52
|
-
end
|
53
|
-
|
54
|
-
describe "::get" do
|
55
|
-
it "returns the value of the given key" do
|
56
|
-
toast = 'toast'
|
57
|
-
Daigaku::Database.toast = toast
|
58
|
-
expect(Daigaku::Database.get :toast).to eq toast
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe "::set" do
|
63
|
-
it "sets the value for the given key" do
|
64
|
-
juice = 'orange juice'
|
65
|
-
Daigaku::Database.set :juice, juice
|
66
|
-
expect(Daigaku::Database.juice).to eq juice
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe "::file" do
|
71
|
-
it "returns the storage file path" do
|
72
|
-
expect(Daigaku::Database.file).to eq Daigaku.config.storage_file
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
it "raises an error if the related getter for a setter is already defined" do
|
77
|
-
expect { Daigaku::Database.clone = 'defined' }.to raise_error
|
78
|
-
end
|
79
|
-
end
|