daigaku 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +7 -4
  3. data/CODE_OF_CONDUCT.md +77 -0
  4. data/README.md +11 -11
  5. data/bin/daigaku +6 -2
  6. data/daigaku.gemspec +22 -26
  7. data/lib/daigaku.rb +0 -1
  8. data/lib/daigaku/chapter.rb +3 -4
  9. data/lib/daigaku/coloring.rb +22 -27
  10. data/lib/daigaku/configuration.rb +25 -28
  11. data/lib/daigaku/congratulator.rb +17 -5
  12. data/lib/daigaku/course.rb +9 -8
  13. data/lib/daigaku/exceptions.rb +0 -2
  14. data/lib/daigaku/generator.rb +13 -15
  15. data/lib/daigaku/github_client.rb +5 -5
  16. data/lib/daigaku/loadable.rb +23 -14
  17. data/lib/daigaku/loading/chapters.rb +0 -2
  18. data/lib/daigaku/loading/courses.rb +0 -2
  19. data/lib/daigaku/loading/units.rb +0 -2
  20. data/lib/daigaku/markdown.rb +1 -0
  21. data/lib/daigaku/markdown/printer.rb +89 -0
  22. data/lib/daigaku/markdown/ruby_doc.rb +15 -15
  23. data/lib/daigaku/solution.rb +23 -15
  24. data/lib/daigaku/storeable.rb +11 -12
  25. data/lib/daigaku/task.rb +1 -1
  26. data/lib/daigaku/terminal.rb +3 -4
  27. data/lib/daigaku/terminal/cli.rb +8 -8
  28. data/lib/daigaku/terminal/courses.rb +22 -19
  29. data/lib/daigaku/terminal/output.rb +46 -53
  30. data/lib/daigaku/terminal/setup.rb +13 -18
  31. data/lib/daigaku/terminal/solutions.rb +27 -32
  32. data/lib/daigaku/terminal/welcome.rb +9 -11
  33. data/lib/daigaku/test.rb +7 -10
  34. data/lib/daigaku/test_result.rb +54 -21
  35. data/lib/daigaku/unit.rb +2 -4
  36. data/lib/daigaku/version.rb +1 -1
  37. data/lib/daigaku/views.rb +29 -33
  38. data/lib/daigaku/views/chapters_menu.rb +16 -20
  39. data/lib/daigaku/views/courses_menu.rb +12 -15
  40. data/lib/daigaku/views/main_menu.rb +23 -23
  41. data/lib/daigaku/views/menu.rb +14 -18
  42. data/lib/daigaku/views/splash.rb +11 -13
  43. data/lib/daigaku/views/subscriber.rb +38 -0
  44. data/lib/daigaku/views/task_view.rb +97 -80
  45. data/lib/daigaku/views/top_bar.rb +4 -10
  46. data/lib/daigaku/views/units_menu.rb +16 -21
  47. data/lib/daigaku/window.rb +12 -70
  48. data/spec/daigaku/chapter_spec.rb +23 -18
  49. data/spec/daigaku/coloring_spec.rb +0 -1
  50. data/spec/daigaku/configuration_spec.rb +54 -50
  51. data/spec/daigaku/congratulator_spec.rb +11 -8
  52. data/spec/daigaku/course_spec.rb +75 -52
  53. data/spec/daigaku/generator_spec.rb +24 -25
  54. data/spec/daigaku/github_client_spec.rb +17 -18
  55. data/spec/daigaku/loading/chapters_spec.rb +2 -3
  56. data/spec/daigaku/loading/courses_spec.rb +2 -3
  57. data/spec/daigaku/loading/units_spec.rb +4 -5
  58. data/spec/daigaku/markdown/ruby_doc_spec.rb +12 -6
  59. data/spec/daigaku/reference_solution_spec.rb +8 -10
  60. data/spec/daigaku/solution_spec.rb +21 -22
  61. data/spec/daigaku/storeable_spec.rb +12 -10
  62. data/spec/daigaku/task_spec.rb +3 -4
  63. data/spec/daigaku/terminal/cli_spec.rb +29 -21
  64. data/spec/daigaku/terminal/courses_spec.rb +104 -99
  65. data/spec/daigaku/terminal/output_spec.rb +44 -39
  66. data/spec/daigaku/terminal/setup_spec.rb +1 -3
  67. data/spec/daigaku/terminal/solutions_spec.rb +0 -2
  68. data/spec/daigaku/terminal/welcome_spec.rb +0 -2
  69. data/spec/daigaku/terminal_spec.rb +5 -7
  70. data/spec/daigaku/test_example_spec.rb +16 -14
  71. data/spec/daigaku/test_result_spec.rb +21 -25
  72. data/spec/daigaku/test_spec.rb +11 -12
  73. data/spec/daigaku/unit_spec.rb +24 -27
  74. data/spec/daigaku/views/chapters_menu_spec.rb +0 -1
  75. data/spec/daigaku/views/courses_menu_spec.rb +0 -1
  76. data/spec/daigaku/views/menu_spec.rb +1 -2
  77. data/spec/daigaku/views/task_view_spec.rb +0 -2
  78. data/spec/daigaku/views/units_menu_spec.rb +0 -1
  79. data/spec/daigaku/views_spec.rb +0 -1
  80. data/spec/daigaku_spec.rb +9 -12
  81. data/spec/path_helpers_spec.rb +11 -12
  82. data/spec/resource_helpers_spec.rb +11 -12
  83. data/spec/spec_helper.rb +3 -4
  84. data/spec/support/macros/content_helpers.rb +16 -17
  85. data/spec/support/macros/mock_helpers.rb +6 -6
  86. data/spec/support/macros/path_helpers.rb +15 -15
  87. data/spec/support/macros/resource_helpers.rb +34 -35
  88. metadata +32 -44
@@ -1,16 +1,16 @@
1
1
  module PathHelpers
2
- LOCAL_DIR = '.daigaku'
3
- CONFIGURATION_FILE = 'daigaku.settings'
4
- COURSES = 'courses'
5
- SOLUTIONS = 'solutions'
6
- TEMP_PATH = File.expand_path("../../../../tmp/", __FILE__)
7
- COURSE_DIR_NAMES = ['Course_A', 'Course_B']
8
- CHAPTER_DIR_NAMES = ['1_Chapter-A', '2_Chapter-B']
9
- UNIT_DIR_NAMES = ['1_unit-a', '2_unit-b']
10
- TASK_NAME = 'task.md'
11
- REFERENCE_SOLUTION_NAME = 'solution.rb'
12
- TEST_NAME = 'solution_spec.rb'
13
- STORAGE_FILE = 'daigaku.db.yml'
2
+ LOCAL_DIR = '.daigaku'.freeze
3
+ CONFIGURATION_FILE = 'daigaku.settings'.freeze
4
+ COURSES = 'courses'.freeze
5
+ SOLUTIONS = 'solutions'.freeze
6
+ TEMP_PATH = File.expand_path('../../../../tmp/', __FILE__).freeze
7
+ COURSE_DIR_NAMES = %w(Course_A Course_B).freeze
8
+ CHAPTER_DIR_NAMES = %w(1_Chapter-A 2_Chapter-B).freeze
9
+ UNIT_DIR_NAMES = %w(1_unit-a 2_unit-b).freeze
10
+ TASK_NAME = 'task.md'.freeze
11
+ REFERENCE_SOLUTION_NAME = 'solution.rb'.freeze
12
+ TEST_NAME = 'solution_spec.rb'.freeze
13
+ STORAGE_FILE = 'daigaku.db.yml'.freeze
14
14
 
15
15
  def temp_basepath
16
16
  TEMP_PATH
@@ -86,17 +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(/[\_\-\.]+/, '_')
89
+ underscored_unit_dir = File.basename(unit_dir).gsub(/[\_\-\.]+/, '_')
90
90
  file_name = underscored_unit_dir + Daigaku::Solution::FILE_SUFFIX
91
91
 
92
92
  unit_path = File.join(solutions_basepath, unit_dir.split('/')[-3..-1])
93
- parts = File.join(File.dirname(unit_path), file_name).split('/')
93
+ parts = File.join(File.dirname(unit_path), file_name).split('/')
94
94
 
95
95
  course_parts = parts[-3..-1].map do |part|
96
96
  part.gsub(/^[\d]+\_/, '').gsub(/[\_\-]+/, '_').downcase
97
97
  end
98
98
 
99
- [*parts[0...-3], *course_parts].join('/')
99
+ (parts[0...-3] + course_parts).join('/')
100
100
  end
101
101
  end
102
102
 
@@ -1,12 +1,12 @@
1
- module ResourceHelpers
2
- require 'fileutils'
3
- require 'zip'
1
+ require 'fileutils'
2
+ require 'zip'
4
3
 
4
+ module ResourceHelpers
5
5
  def prepare_courses
6
- FileUtils.mkdir_p(courses_basepath) unless Dir.exist?(courses_basepath)
6
+ create_directory(courses_basepath)
7
7
 
8
8
  course_dir_names.each do |course|
9
- chapter_dir_names.each do |chapter|
9
+ chapter_dir_names.each do |_|
10
10
  unit_dirs(course).each do |units|
11
11
  units.each do |unit|
12
12
  create_directory(unit)
@@ -29,23 +29,19 @@ module ResourceHelpers
29
29
  def prepare_solutions
30
30
  all_solution_file_paths.each do |path|
31
31
  base_dir = File.dirname(path)
32
- name = File.basename(path)
32
+ name = File.basename(path)
33
33
  create_file(base_dir, name, solution_content)
34
34
  end
35
35
  end
36
36
 
37
- def prepare_download(zip_file_name, options = {})
37
+ def prepare_download(zip_file_name, multiple_courses: false)
38
38
  zip_file_path = File.join(courses_basepath, zip_file_name)
39
-
40
- unless Dir.exist?(File.dirname(zip_file_path))
41
- FileUtils.makedirs(File.dirname(zip_file_path))
42
- end
39
+ create_directory(File.dirname(zip_file_path))
43
40
 
44
41
  Zip::File.open(zip_file_path, Zip::File::CREATE) do |zip_file|
45
42
  Dir[File.join(courses_basepath, '**', '**')].each do |file|
46
- if course_match?(file, options[:multiple_courses])
47
- zip_file.add(file.sub(courses_basepath, '')[1..-1], file) { true }
48
- end
43
+ next unless course_match?(file, multiple_courses)
44
+ zip_file.add(file.sub(courses_basepath, '')[1..-1], file) { true }
49
45
  end
50
46
  end
51
47
 
@@ -54,16 +50,12 @@ module ResourceHelpers
54
50
 
55
51
  def prepare_github_download(zip_file_name)
56
52
  zip_file_path = File.join(courses_basepath, zip_file_name)
57
-
58
- unless Dir.exist?(File.dirname(zip_file_path))
59
- FileUtils.makedirs(File.dirname(zip_file_path))
60
- end
53
+ create_directory(File.dirname(zip_file_path))
61
54
 
62
55
  Zip::File.open(zip_file_path, Zip::File::CREATE) do |zip_file|
63
56
  Dir[File.join(courses_basepath, '**', '**')].each do |file|
64
- if file.match(/.*\-master/)
65
- zip_file.add(file.sub(courses_basepath, '')[1..-1], file) { true }
66
- end
57
+ next unless file =~ /.*\-master/
58
+ zip_file.add(file.sub(courses_basepath, '')[1..-1], file) { true }
67
59
  end
68
60
  end
69
61
 
@@ -71,34 +63,41 @@ module ResourceHelpers
71
63
  end
72
64
 
73
65
  def course_match?(name, multiple_courses)
66
+ first_course_matches = name.match(course_dirs.first)
67
+
74
68
  if multiple_courses
75
- name.match(course_dirs.first) || name.match(course_dirs.second)
69
+ first_course_matches || name.match(course_dirs[1])
76
70
  else
77
- name.match(course_dirs.first)
71
+ first_course_matches
78
72
  end
79
73
  end
80
74
 
81
75
  def cleanup_download(zip_file_name)
82
76
  directory = course_dirs.first
83
- zip_file = File.join(File.dirname(directory), zip_file_name)
84
- FileUtils.rm(zip_file) if File.exist?(zip_file)
77
+ zip_file = File.join(File.dirname(directory), zip_file_name)
78
+ remove_file(zip_file)
85
79
  end
86
80
 
87
81
  def cleanup_temp_data
88
- FileUtils.remove_dir(temp_basepath) if Dir.exist?(temp_basepath)
82
+ remove_directory(temp_basepath)
83
+ end
84
+
85
+ def remove_directory(dir_path)
86
+ FileUtils.remove_dir(dir_path) if Dir.exist?(dir_path)
89
87
  end
90
88
 
91
89
  def create_directory(dir_path)
92
- FileUtils.mkdir_p(dir_path) unless Dir.exist?(dir_path)
90
+ FileUtils.makedirs(dir_path) unless Dir.exist?(dir_path)
93
91
  end
94
92
 
95
93
  def create_file(base_dir, name, content)
96
- create_directory(base_dir) unless Dir.exist?(base_dir)
94
+ create_directory(base_dir)
97
95
  file_path = File.join(base_dir, name)
96
+ File.open(file_path, 'w') { |f| f.puts content }
97
+ end
98
98
 
99
- if Dir.exist?(base_dir)
100
- File.open(file_path, 'w') { |f| f.puts content }
101
- end
99
+ def remove_file(file)
100
+ FileUtils.rm(file) if File.exist?(file)
102
101
  end
103
102
 
104
103
  def available_courses
@@ -114,8 +113,8 @@ module ResourceHelpers
114
113
  end
115
114
 
116
115
  def available_units(course_name, chapter_name)
117
- units = unit_dirs(course_name).map do |units|
118
- units.map do |path|
116
+ units = unit_dirs(course_name).map do |unit_dir|
117
+ unit_dir.map do |path|
119
118
  next unless path.split('/')[-2] == chapter_name
120
119
  Daigaku::Unit.new(path)
121
120
  end
@@ -128,7 +127,7 @@ module ResourceHelpers
128
127
  task = unit_dirs(course_name).map do |units|
129
128
  units.map do |path|
130
129
  split = path.split('/')
131
- next if (split[-2] != chapter_name || split[-1] != unit_name)
130
+ next if split[-2] != chapter_name || split[-1] != unit_name
132
131
 
133
132
  Daigaku::Task.new(path)
134
133
  end
@@ -141,7 +140,7 @@ module ResourceHelpers
141
140
  solution = unit_dirs(course_name).map do |units|
142
141
  units.map do |path|
143
142
  split = path.split('/')
144
- next if (split[-2] != chapter_name || split[-1] != unit_name)
143
+ next if split[-2] != chapter_name || split[-1] != unit_name
145
144
 
146
145
  Daigaku::ReferenceSolution.new(path)
147
146
  end
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.2.0
4
+ version: 1.0.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-10-05 00:00:00.000000000 Z
11
+ date: 2020-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -16,28 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.0'
27
- - !ruby/object:Gem::Dependency
28
- name: activesupport
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '4.0'
19
+ version: '1.3'
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '4.0'
26
+ version: '1.3'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rspec
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,154 +44,154 @@ dependencies:
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: 0.19.1
47
+ version: '1.0'
62
48
  type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: 0.19.1
54
+ version: '1.0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: os
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: 0.9.6
61
+ version: '1.0'
76
62
  type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: 0.9.6
68
+ version: '1.0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: colorize
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - "~>"
88
74
  - !ruby/object:Gem::Version
89
- version: 0.7.5
75
+ version: '0.8'
90
76
  type: :runtime
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
- version: 0.7.5
82
+ version: '0.8'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: rubyzip
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - "~>"
102
88
  - !ruby/object:Gem::Version
103
- version: '1.0'
89
+ version: '2.0'
104
90
  type: :runtime
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - "~>"
109
95
  - !ruby/object:Gem::Version
110
- version: '1.0'
96
+ version: '2.0'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: wisper
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
101
  - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: 2.0.0.rc1
103
+ version: '2.0'
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: 2.0.0.rc1
110
+ version: '2.0'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: quick_store
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: '0.1'
117
+ version: '1.0'
132
118
  type: :runtime
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: '0.1'
124
+ version: '1.0'
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: code_breaker
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
129
  - - "~>"
144
130
  - !ruby/object:Gem::Version
145
- version: '0.1'
131
+ version: '1.0'
146
132
  type: :runtime
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
136
  - - "~>"
151
137
  - !ruby/object:Gem::Version
152
- version: '0.1'
138
+ version: '1.0'
153
139
  - !ruby/object:Gem::Dependency
154
140
  name: bundler
155
141
  requirement: !ruby/object:Gem::Requirement
156
142
  requirements:
157
143
  - - "~>"
158
144
  - !ruby/object:Gem::Version
159
- version: '1.7'
145
+ version: '2.0'
160
146
  type: :development
161
147
  prerelease: false
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
150
  - - "~>"
165
151
  - !ruby/object:Gem::Version
166
- version: '1.7'
152
+ version: '2.0'
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: rake
169
155
  requirement: !ruby/object:Gem::Requirement
170
156
  requirements:
171
157
  - - "~>"
172
158
  - !ruby/object:Gem::Version
173
- version: '10.0'
159
+ version: '13.0'
174
160
  type: :development
175
161
  prerelease: false
176
162
  version_requirements: !ruby/object:Gem::Requirement
177
163
  requirements:
178
164
  - - "~>"
179
165
  - !ruby/object:Gem::Version
180
- version: '10.0'
166
+ version: '13.0'
181
167
  - !ruby/object:Gem::Dependency
182
168
  name: webmock
183
169
  requirement: !ruby/object:Gem::Requirement
184
170
  requirements:
185
171
  - - "~>"
186
172
  - !ruby/object:Gem::Version
187
- version: 1.20.4
173
+ version: '3.0'
188
174
  type: :development
189
175
  prerelease: false
190
176
  version_requirements: !ruby/object:Gem::Requirement
191
177
  requirements:
192
178
  - - "~>"
193
179
  - !ruby/object:Gem::Version
194
- version: 1.20.4
180
+ version: '3.0'
195
181
  - !ruby/object:Gem::Dependency
196
182
  name: guard-rspec
197
183
  requirement: !ruby/object:Gem::Requirement
198
184
  requirements:
199
185
  - - "~>"
200
186
  - !ruby/object:Gem::Version
201
- version: 4.5.0
187
+ version: '4.7'
202
188
  type: :development
203
189
  prerelease: false
204
190
  version_requirements: !ruby/object:Gem::Requirement
205
191
  requirements:
206
192
  - - "~>"
207
193
  - !ruby/object:Gem::Version
208
- version: 4.5.0
194
+ version: '4.7'
209
195
  description: Daigaku is the Japanese word for university. With Daigaku you can interactively
210
196
  learn the Ruby programming language using the command line.
211
197
  email:
@@ -217,6 +203,7 @@ extra_rdoc_files: []
217
203
  files:
218
204
  - ".gitignore"
219
205
  - ".travis.yml"
206
+ - CODE_OF_CONDUCT.md
220
207
  - Gemfile
221
208
  - Guardfile
222
209
  - README.md
@@ -237,6 +224,7 @@ files:
237
224
  - lib/daigaku/loading/courses.rb
238
225
  - lib/daigaku/loading/units.rb
239
226
  - lib/daigaku/markdown.rb
227
+ - lib/daigaku/markdown/printer.rb
240
228
  - lib/daigaku/markdown/ruby_doc.rb
241
229
  - lib/daigaku/reference_solution.rb
242
230
  - lib/daigaku/solution.rb
@@ -264,6 +252,7 @@ files:
264
252
  - lib/daigaku/views/main_menu.rb
265
253
  - lib/daigaku/views/menu.rb
266
254
  - lib/daigaku/views/splash.rb
255
+ - lib/daigaku/views/subscriber.rb
267
256
  - lib/daigaku/views/task_view.rb
268
257
  - lib/daigaku/views/top_bar.rb
269
258
  - lib/daigaku/views/units_menu.rb
@@ -319,17 +308,16 @@ require_paths:
319
308
  - lib
320
309
  required_ruby_version: !ruby/object:Gem::Requirement
321
310
  requirements:
322
- - - "~>"
311
+ - - ">="
323
312
  - !ruby/object:Gem::Version
324
- version: '2.0'
313
+ version: '2.5'
325
314
  required_rubygems_version: !ruby/object:Gem::Requirement
326
315
  requirements:
327
316
  - - ">="
328
317
  - !ruby/object:Gem::Version
329
318
  version: '0'
330
319
  requirements: []
331
- rubyforge_project:
332
- rubygems_version: 2.4.6
320
+ rubygems_version: 3.1.3
333
321
  signing_key:
334
322
  specification_version: 4
335
323
  summary: Learning Ruby on the command line.