daigaku 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -3
  3. data/README.md +1 -1
  4. data/daigaku.gemspec +23 -26
  5. data/lib/daigaku.rb +0 -1
  6. data/lib/daigaku/chapter.rb +3 -4
  7. data/lib/daigaku/coloring.rb +13 -13
  8. data/lib/daigaku/configuration.rb +25 -28
  9. data/lib/daigaku/congratulator.rb +17 -5
  10. data/lib/daigaku/course.rb +9 -8
  11. data/lib/daigaku/exceptions.rb +0 -2
  12. data/lib/daigaku/generator.rb +13 -13
  13. data/lib/daigaku/github_client.rb +4 -4
  14. data/lib/daigaku/loadable.rb +11 -15
  15. data/lib/daigaku/loading/chapters.rb +0 -2
  16. data/lib/daigaku/loading/courses.rb +0 -2
  17. data/lib/daigaku/loading/units.rb +0 -2
  18. data/lib/daigaku/markdown.rb +1 -0
  19. data/lib/daigaku/markdown/printer.rb +89 -0
  20. data/lib/daigaku/markdown/ruby_doc.rb +6 -8
  21. data/lib/daigaku/solution.rb +18 -15
  22. data/lib/daigaku/storeable.rb +11 -12
  23. data/lib/daigaku/task.rb +1 -1
  24. data/lib/daigaku/terminal.rb +3 -4
  25. data/lib/daigaku/terminal/cli.rb +6 -8
  26. data/lib/daigaku/terminal/courses.rb +19 -16
  27. data/lib/daigaku/terminal/output.rb +0 -2
  28. data/lib/daigaku/terminal/setup.rb +13 -18
  29. data/lib/daigaku/terminal/solutions.rb +27 -32
  30. data/lib/daigaku/terminal/welcome.rb +9 -11
  31. data/lib/daigaku/test.rb +7 -10
  32. data/lib/daigaku/test_result.rb +13 -16
  33. data/lib/daigaku/unit.rb +1 -3
  34. data/lib/daigaku/version.rb +1 -1
  35. data/lib/daigaku/views.rb +4 -3
  36. data/lib/daigaku/views/chapters_menu.rb +16 -20
  37. data/lib/daigaku/views/courses_menu.rb +12 -15
  38. data/lib/daigaku/views/main_menu.rb +23 -23
  39. data/lib/daigaku/views/menu.rb +9 -13
  40. data/lib/daigaku/views/splash.rb +11 -13
  41. data/lib/daigaku/views/subscriber.rb +38 -0
  42. data/lib/daigaku/views/task_view.rb +80 -78
  43. data/lib/daigaku/views/top_bar.rb +4 -10
  44. data/lib/daigaku/views/units_menu.rb +16 -21
  45. data/lib/daigaku/window.rb +12 -70
  46. data/spec/daigaku/chapter_spec.rb +23 -18
  47. data/spec/daigaku/coloring_spec.rb +0 -1
  48. data/spec/daigaku/configuration_spec.rb +54 -50
  49. data/spec/daigaku/congratulator_spec.rb +11 -8
  50. data/spec/daigaku/course_spec.rb +70 -51
  51. data/spec/daigaku/generator_spec.rb +24 -25
  52. data/spec/daigaku/github_client_spec.rb +17 -18
  53. data/spec/daigaku/loading/chapters_spec.rb +2 -3
  54. data/spec/daigaku/loading/courses_spec.rb +2 -3
  55. data/spec/daigaku/loading/units_spec.rb +4 -5
  56. data/spec/daigaku/markdown/ruby_doc_spec.rb +3 -6
  57. data/spec/daigaku/reference_solution_spec.rb +8 -10
  58. data/spec/daigaku/solution_spec.rb +18 -20
  59. data/spec/daigaku/storeable_spec.rb +12 -10
  60. data/spec/daigaku/task_spec.rb +3 -4
  61. data/spec/daigaku/terminal/cli_spec.rb +29 -21
  62. data/spec/daigaku/terminal/courses_spec.rb +104 -99
  63. data/spec/daigaku/terminal/output_spec.rb +44 -39
  64. data/spec/daigaku/terminal/setup_spec.rb +1 -3
  65. data/spec/daigaku/terminal/solutions_spec.rb +0 -2
  66. data/spec/daigaku/terminal/welcome_spec.rb +0 -2
  67. data/spec/daigaku/terminal_spec.rb +5 -7
  68. data/spec/daigaku/test_example_spec.rb +16 -14
  69. data/spec/daigaku/test_result_spec.rb +21 -25
  70. data/spec/daigaku/test_spec.rb +11 -12
  71. data/spec/daigaku/unit_spec.rb +24 -27
  72. data/spec/daigaku/views/chapters_menu_spec.rb +0 -1
  73. data/spec/daigaku/views/courses_menu_spec.rb +0 -1
  74. data/spec/daigaku/views/menu_spec.rb +1 -2
  75. data/spec/daigaku/views/task_view_spec.rb +0 -2
  76. data/spec/daigaku/views/units_menu_spec.rb +0 -1
  77. data/spec/daigaku/views_spec.rb +0 -1
  78. data/spec/daigaku_spec.rb +9 -12
  79. data/spec/path_helpers_spec.rb +11 -12
  80. data/spec/resource_helpers_spec.rb +11 -12
  81. data/spec/spec_helper.rb +3 -4
  82. data/spec/support/macros/content_helpers.rb +16 -17
  83. data/spec/support/macros/mock_helpers.rb +6 -6
  84. data/spec/support/macros/path_helpers.rb +15 -15
  85. data/spec/support/macros/resource_helpers.rb +34 -35
  86. metadata +12 -10
@@ -1,9 +1,7 @@
1
1
  module Daigaku
2
2
  module Loading
3
-
4
3
  class Chapters
5
4
  extend Daigaku::Loadable
6
5
  end
7
-
8
6
  end
9
7
  end
@@ -1,9 +1,7 @@
1
1
  module Daigaku
2
2
  module Loading
3
-
4
3
  class Courses
5
4
  extend Daigaku::Loadable
6
5
  end
7
-
8
6
  end
9
7
  end
@@ -1,9 +1,7 @@
1
1
  module Daigaku
2
2
  module Loading
3
-
4
3
  class Units
5
4
  extend Daigaku::Loadable
6
5
  end
7
-
8
6
  end
9
7
  end
@@ -1 +1,2 @@
1
1
  require 'daigaku/markdown/ruby_doc'
2
+ require 'daigaku/markdown/printer'
@@ -0,0 +1,89 @@
1
+ require 'curses'
2
+ require_relative 'ruby_doc'
3
+
4
+ module Daigaku
5
+ module Markdown
6
+ class Printer
7
+ H1 = /\A\#{1}[^#]+/ # '# heading'
8
+ H2 = /\A\#{2}[^#]+/ # '## sub heading'
9
+ BOLD = /\*[^*]*\*/ # '*text*'
10
+ LINE = /\A-{3,}/ # '---' vertical line
11
+ CODE = /`[^`]*`/ # '`code line`'
12
+
13
+ attr_reader :window
14
+
15
+ def initialize(window:)
16
+ @window = window
17
+ end
18
+
19
+ def print(text)
20
+ text_line = RubyDoc.parse(text)
21
+
22
+ case text_line
23
+ when H1 then print_h1(text_line)
24
+ when H2 then print_h2(text_line)
25
+ when /(#{CODE}|#{BOLD})/ then print_code_or_bold(text_line)
26
+ when BOLD then print_bold(text_line)
27
+ when LINE then print_line
28
+ else print_escaped(text_line)
29
+ end
30
+ end
31
+
32
+ def print_h1(text)
33
+ window.heading(text.sub(/\A#\s?/, ''))
34
+ end
35
+
36
+ def print_h2(text)
37
+ text_decoration = Curses::A_UNDERLINE | Curses::A_NORMAL
38
+ window.emphasize(text.sub(/\A##\s?/, ''), text_decoration)
39
+ end
40
+
41
+ def print_code_or_bold(text)
42
+ emphasized = false
43
+ highlighted = false
44
+
45
+ text.chars.each_with_index do |char, index|
46
+ if char == '*' && text[index - 1] != '\\'
47
+ emphasized = !emphasized
48
+ next
49
+ end
50
+
51
+ if char == '`'
52
+ highlighted = !highlighted
53
+ next
54
+ end
55
+
56
+ character = text[index..(index + 1)] == '\\*' ? '' : char
57
+
58
+ if highlighted
59
+ window.red(character)
60
+ elsif emphasized
61
+ window.emphasize(character)
62
+ else
63
+ window.write(character)
64
+ end
65
+ end
66
+ end
67
+
68
+ def print_bold(text)
69
+ text.chars.each_with_index do |char, index|
70
+ if char == '*' && text[index - 1] != '\\'
71
+ emphasized = !emphasized
72
+ next
73
+ end
74
+
75
+ character = text[index..(index + 1)].to_s == '\\*' ? '' : char
76
+ emphasized ? window.emphasize(character) : window.write(character)
77
+ end
78
+ end
79
+
80
+ def print_line
81
+ window.write('-' * (Curses.cols - 2))
82
+ end
83
+
84
+ def print_escaped(text)
85
+ window.write(text.gsub(/(\\#)/, '#'))
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,15 +1,14 @@
1
1
  require 'cgi'
2
2
 
3
3
  module Daigaku
4
- class Markdown
4
+ module Markdown
5
5
  class RubyDoc
6
-
7
- RUBY_DOC_URL = "http://ruby-doc.org".freeze
6
+ RUBY_DOC_URL = 'http://ruby-doc.org'.freeze
8
7
  CORE_BASE_URL = "#{RUBY_DOC_URL}/core-#{RUBY_VERSION}".freeze
9
8
  STDLIB_BASE_URL = "#{RUBY_DOC_URL}/stdlib-#{RUBY_VERSION}".freeze
10
9
 
11
- CORE_REGEX = /\(ruby-doc core:\s?(.*)\)/.freeze
12
- STDLIB_REGEX = /\(ruby-doc stdlib:\s?(.*)\)/.freeze
10
+ CORE_REGEX = /\(ruby-doc core:\s?(.*)\)/
11
+ STDLIB_REGEX = /\(ruby-doc stdlib:\s?(.*)\)/
13
12
 
14
13
  class << self
15
14
  def parse(text)
@@ -86,8 +85,8 @@ module Daigaku
86
85
  method = text.split(/::|#/).last
87
86
  return '' unless downcased?(method)
88
87
 
89
- method_type = text.match(/#/) ? 'i' : 'c'
90
- method_name = CGI.escape(method.strip).gsub('%', '-').gsub(/\A-/, '')
88
+ method_type = text =~ /#/ ? 'i' : 'c'
89
+ method_name = CGI.escape(method.strip).tr('%', '-').gsub(/\A-/, '')
91
90
  "#method-#{method_type}-#{method_name}"
92
91
  end
93
92
 
@@ -100,7 +99,6 @@ module Daigaku
100
99
  def downcased?(text)
101
100
  text == text.downcase
102
101
  end
103
-
104
102
  end
105
103
  end
106
104
  end
@@ -1,20 +1,19 @@
1
1
  module Daigaku
2
2
  class Solution
3
-
4
- FILE_SUFFIX = '_solution.rb'
3
+ FILE_SUFFIX = '_solution.rb'.freeze
5
4
 
6
5
  attr_reader :code, :path, :errors
7
6
 
8
7
  def initialize(unit_path)
9
8
  @unit_path = unit_path
10
- @path = solution_path(unit_path)
11
- @code = File.read(@path).strip if File.file?(@path)
12
- @verified = get_store_state
9
+ @path = solution_path(unit_path)
10
+ @code = File.read(@path).strip if File.file?(@path)
11
+ @verified = store_state
13
12
  end
14
13
 
15
14
  def verify!
16
- result = Daigaku::Test.new(@unit_path).run(self.code)
17
- set_store_state(result.passed?)
15
+ result = Daigaku::Test.new(@unit_path).run(code)
16
+ self.store_state = result.passed?
18
17
  result
19
18
  end
20
19
 
@@ -24,7 +23,7 @@ module Daigaku
24
23
 
25
24
  def store_key
26
25
  unless @store_key
27
- part_path = path.split('/')[-3..-1].join('/').gsub(FILE_SUFFIX, '')
26
+ part_path = path.split('/')[-3..-1].join('/').gsub(FILE_SUFFIX, '')
28
27
  @store_key = Storeable.key(part_path, prefix: 'verified')
29
28
  end
30
29
 
@@ -34,20 +33,24 @@ module Daigaku
34
33
  private
35
34
 
36
35
  def solution_path(path)
37
- local_path = Daigaku.config.solutions_path
38
- sub_dirs = Storeable.key(path.split('/')[-3..-2].join('/').gsub(FILE_SUFFIX, ''))
39
- file = Storeable.key(File.basename(path)) + FILE_SUFFIX
36
+ local_path = Daigaku.config.solutions_path
37
+ sub_directory = Storeable.key(directory_from(path))
38
+ file = Storeable.key(File.basename(path)) + FILE_SUFFIX
39
+
40
+ File.join(local_path, sub_directory, file)
41
+ end
40
42
 
41
- File.join(local_path, sub_dirs, file)
43
+ def directory_from(path)
44
+ path.split('/')[-3..-2].join('/').gsub(FILE_SUFFIX, '')
42
45
  end
43
46
 
44
- def set_store_state(verified)
47
+ def store_state=(verified)
45
48
  @verified = verified
46
49
  QuickStore.store.set(store_key, verified?)
47
50
  end
48
51
 
49
- def get_store_state
52
+ def store_state
50
53
  QuickStore.store.get(store_key)
51
54
  end
52
55
  end
53
- end
56
+ end
@@ -1,15 +1,14 @@
1
1
  module Daigaku
2
2
  module Storeable
3
-
4
3
  LEADING_NUMBERS = /^\d+[\_\-\s]+/
5
- PART_JOINTS = /[\_\-\s]+/
4
+ PART_JOINTS = /[\_\-\s]+/
6
5
 
7
6
  class << self
8
7
  def key(text, options = {})
9
- separator = QuickStore.config.key_separator
10
- prefix = options[:prefix]
11
- suffix = clean(options[:suffix])
12
- suffixes = options[:suffixes]
8
+ separator = QuickStore.config.key_separator
9
+ prefix = options[:prefix]
10
+ suffix = clean(options[:suffix])
11
+ suffixes = options[:suffixes]
13
12
  suffixes_items = suffixes ? suffixes.map { |s| clean(s) }.compact : nil
14
13
 
15
14
  [prefix, clean(text), suffix || suffixes_items].compact.join(separator)
@@ -18,15 +17,15 @@ module Daigaku
18
17
  private
19
18
 
20
19
  def clean(text)
21
- if text
22
- parts = text.to_s.split(QuickStore.config.key_separator).map do |key|
23
- key.gsub(LEADING_NUMBERS, '').gsub(PART_JOINTS, '_').downcase
24
- end
20
+ return if text.nil?
21
+ parts(text.to_s).join(QuickStore.config.key_separator)
22
+ end
25
23
 
26
- parts.join(QuickStore.config.key_separator)
24
+ def parts(text)
25
+ text.split(QuickStore.config.key_separator).map do |key|
26
+ key.gsub(LEADING_NUMBERS, '').gsub(PART_JOINTS, '_').downcase
27
27
  end
28
28
  end
29
29
  end
30
-
31
30
  end
32
31
  end
data/lib/daigaku/task.rb CHANGED
@@ -3,7 +3,7 @@ module Daigaku
3
3
  attr_reader :markdown, :path
4
4
 
5
5
  def initialize(path)
6
- @path = Dir[File.join(path, '*.md')].first
6
+ @path = Dir[File.join(path, '*.md')].first
7
7
  @markdown = File.read(@path).strip
8
8
  end
9
9
  end
@@ -1,12 +1,11 @@
1
1
  module Daigaku
2
2
  module Terminal
3
-
4
3
  # text should be of a width of 70 columns or less
5
4
  def self.text(file_name)
6
5
  texts_path = File.expand_path('../terminal/texts', __FILE__)
7
- file = File.join(texts_path, "#{file_name.to_s}.txt")
8
- (File.exist?(file) ? File.read(file).to_s : '')
9
- end
6
+ file = File.join(texts_path, "#{file_name}.txt")
10
7
 
8
+ File.exist?(file) ? File.read(file).to_s : ''
9
+ end
11
10
  end
12
11
  end
@@ -1,13 +1,11 @@
1
1
  require 'thor'
2
+ require_relative 'courses'
3
+ require_relative 'solutions'
4
+ require_relative 'setup'
5
+ require_relative 'output'
2
6
 
3
7
  module Daigaku
4
8
  module Terminal
5
-
6
- require_relative 'courses'
7
- require_relative 'solutions'
8
- require_relative 'setup'
9
- require_relative 'output'
10
-
11
9
  class CLI < Thor
12
10
  include Terminal::Output
13
11
 
@@ -21,7 +19,7 @@ module Daigaku
21
19
  subcommand 'setup', Terminal::Setup
22
20
 
23
21
  def self.start
24
- Daigaku.config.import!
22
+ Daigaku.config.import
25
23
  super
26
24
  end
27
25
 
@@ -40,7 +38,7 @@ module Daigaku
40
38
  generator = Generator.new
41
39
  generator.prepare
42
40
 
43
- courses_path = Daigaku.config.courses_path
41
+ courses_path = Daigaku.config.courses_path
44
42
  solutions_path = Daigaku.config.solutions_path
45
43
 
46
44
  generator.scaffold(courses_path, solutions_path)
@@ -1,14 +1,18 @@
1
+ require 'os'
2
+ require 'open-uri'
3
+ require 'zip'
4
+ require_relative 'output'
5
+
1
6
  module Daigaku
2
7
  module Terminal
3
-
4
- require 'os'
5
- require 'open-uri'
6
- require 'zip'
7
- require_relative 'output'
8
-
9
8
  class Courses < Thor
10
9
  include Terminal::Output
11
10
 
11
+ GITHUB = /github\.com/
12
+ MASTER_ZIP_URL = %r{github.com\/(.*)\/archive\/master.zip}
13
+ URL = /\A#{URI.regexp(%w(http https))}\z/
14
+ ZIP_FILE = /\.zip/
15
+
12
16
  desc 'list', 'List your available daigaku courses'
13
17
  def list
14
18
  courses = Loading::Courses.load(Daigaku.config.courses_path)
@@ -22,11 +26,11 @@ module Daigaku
22
26
  url = GithubClient.master_zip_url(Daigaku.config.initial_course) if use_initial_course
23
27
  url = GithubClient.master_zip_url(options[:github]) if options[:github]
24
28
 
25
- url_given = (url =~ /\A#{URI::regexp(['http', 'https'])}\z/)
26
- github = use_initial_course || options[:github] || url.match(/github\.com/)
29
+ url_given = (url =~ URL)
30
+ github = use_initial_course || options[:github] || url.match(GITHUB)
27
31
 
28
32
  raise Download::NoUrlError unless url_given
29
- raise Download::NoZipFileUrlError unless File.basename(url) =~ /\.zip/
33
+ raise Download::NoZipFileUrlError unless File.basename(url) =~ ZIP_FILE
30
34
 
31
35
  courses_path = Daigaku.config.courses_path
32
36
  FileUtils.makedirs(courses_path) unless Dir.exist?(courses_path)
@@ -37,7 +41,7 @@ module Daigaku
37
41
  course = Course.unzip(file_name, github_repo: github)
38
42
 
39
43
  if github
40
- user_and_repo = url.match(/github.com\/(.*)\/archive\/master.zip/).captures.first
44
+ user_and_repo = url.match(MASTER_ZIP_URL).captures.first
41
45
  store_repo_data(options[:github] || user_and_repo)
42
46
  end
43
47
 
@@ -46,11 +50,11 @@ module Daigaku
46
50
  scaffold_solutions
47
51
 
48
52
  say_info "Successfully #{action} the course \"#{course.title}\"!"
49
- rescue Download::NoUrlError => e
53
+ rescue Download::NoUrlError
50
54
  print_download_warning(url, "\"#{url}\" is not a valid URL!")
51
- rescue Download::NoZipFileUrlError => e
55
+ rescue Download::NoZipFileUrlError
52
56
  print_download_warning(url, "\"#{url}\" is not a URL of a *.zip file!")
53
- rescue Exception => e
57
+ rescue StandardError => e
54
58
  print_download_warning(url, e.message)
55
59
  ensure
56
60
  FileUtils.rm(file_name) if File.exist?(file_name.to_s)
@@ -124,7 +128,7 @@ module Daigaku
124
128
  end
125
129
 
126
130
  def store_repo_data(user_and_repo)
127
- parts = (user_and_repo ||= Daigaku.config.initial_course).split('/')
131
+ parts = (user_and_repo ||= Daigaku.config.initial_course).split('/')
128
132
  author = parts.first
129
133
  course = parts.second
130
134
 
@@ -164,7 +168,7 @@ module Daigaku
164
168
  def print_course_not_available(course_name)
165
169
  text = [
166
170
  "The course \"#{course_name}\" is not available in",
167
- "\"#{Daigaku.config.courses_path}\".\n",
171
+ "\"#{Daigaku.config.courses_path}\".\n"
168
172
  ]
169
173
 
170
174
  say_warning text.join("\n")
@@ -174,6 +178,5 @@ module Daigaku
174
178
  end
175
179
  end
176
180
  end
177
-
178
181
  end
179
182
  end
@@ -4,7 +4,6 @@ require 'colorize'
4
4
 
5
5
  module Daigaku
6
6
  module Terminal
7
-
8
7
  module Output
9
8
  extend ActiveSupport::Concern
10
9
 
@@ -73,6 +72,5 @@ module Daigaku
73
72
  end
74
73
  end
75
74
  end
76
-
77
75
  end
78
76
  end
@@ -1,10 +1,8 @@
1
1
  require 'thor'
2
+ require_relative 'output'
2
3
 
3
4
  module Daigaku
4
5
  module Terminal
5
-
6
- require_relative 'output'
7
-
8
6
  class Setup < Thor
9
7
  include Terminal::Output
10
8
 
@@ -19,7 +17,7 @@ module Daigaku
19
17
  path = get 'path:'
20
18
 
21
19
  begin
22
- @daigaku_path = File.expand_path("#{path}", Dir.pwd)
20
+ @daigaku_path = File.expand_path(path.to_s, Dir.pwd)
23
21
  rescue
24
22
  say_warning "#{path} is no valid path name. Try another!"
25
23
  next
@@ -29,7 +27,7 @@ module Daigaku
29
27
  say "\"#{@daigaku_path}\""
30
28
 
31
29
  confirmation = get '(yes|no)'
32
- break if confirmation.downcase == 'yes'
30
+ break if confirmation.casecmp('yes').zero?
33
31
 
34
32
  empty_line
35
33
  say 'No Problem. Just type another one!'
@@ -61,8 +59,8 @@ module Daigaku
61
59
  solutions_path = options[:paths] || options[:solutions_path]
62
60
 
63
61
  if courses_path.nil? && solutions_path.nil?
64
- say_warning "Please specify options when using this command!"
65
- say %x{ daigaku setup help set }
62
+ say_warning 'Please specify options when using this command!'
63
+ say `daigaku setup help set`
66
64
  return
67
65
  end
68
66
 
@@ -76,11 +74,12 @@ module Daigaku
76
74
  private
77
75
 
78
76
  def prepare_directories(path)
79
- courses_dir = Daigaku::Configuration::COURSES_DIR
77
+ courses_dir = Daigaku::Configuration::COURSES_DIR
80
78
  courses_path = File.join(path, courses_dir)
79
+
81
80
  Daigaku.config.courses_path = courses_path
82
81
 
83
- solutions_dir = Daigaku::Configuration::SOLUTIONS_DIR
82
+ solutions_dir = Daigaku::Configuration::SOLUTIONS_DIR
84
83
  solutions_path = File.join(path, solutions_dir)
85
84
 
86
85
  if Dir.exist? solutions_path
@@ -92,7 +91,7 @@ module Daigaku
92
91
 
93
92
  text = [
94
93
  "Your Daigaku directory is now set up.\n",
95
- "Daigaku created/updated following two paths for you:",
94
+ 'Daigaku created/updated following two paths for you:',
96
95
  courses_path,
97
96
  solutions_path
98
97
  ]
@@ -101,15 +100,11 @@ module Daigaku
101
100
  end
102
101
 
103
102
  def update_config(attribute, value)
104
- begin
105
- path = File.expand_path(value, Dir.pwd)
106
- Daigaku.config.send("#{attribute}=", path)
107
- rescue Exception => e
108
- say_warning e.message
109
- end
103
+ path = File.expand_path(value, Dir.pwd)
104
+ Daigaku.config.send("#{attribute}=", path)
105
+ rescue StandardError => e
106
+ say_warning e.message
110
107
  end
111
-
112
108
  end
113
-
114
109
  end
115
110
  end