rorr 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +155 -0
  8. data/Rakefile +9 -0
  9. data/bin/console +14 -0
  10. data/bin/rorr +5 -0
  11. data/bin/setup +8 -0
  12. data/lib/rorr.rb +22 -0
  13. data/lib/rorr/base.rb +15 -0
  14. data/lib/rorr/config.rb +14 -0
  15. data/lib/rorr/dont_ask_me.rb +60 -0
  16. data/lib/rorr/init.rb +24 -0
  17. data/lib/rorr/main.rb +28 -0
  18. data/lib/rorr/return_value.rb +68 -0
  19. data/lib/rorr/score.rb +76 -0
  20. data/lib/rorr/test_pass.rb +96 -0
  21. data/lib/rorr/ui.rb +86 -0
  22. data/lib/rorr/version.rb +3 -0
  23. data/lib/spec_helper.rb +4 -0
  24. data/rorr.gemspec +27 -0
  25. data/spec/check_answer/normal/001_spec.rb +14 -0
  26. data/spec/check_answer/normal/002_spec.rb +14 -0
  27. data/spec/check_answer/normal/003_spec.rb +14 -0
  28. data/spec/check_answer/normal/004_spec.rb +14 -0
  29. data/spec/check_answer/normal/005_spec.rb +11 -0
  30. data/spec/check_answer/normal/006_spec.rb +14 -0
  31. data/spec/check_answer/normal/007_spec.rb +14 -0
  32. data/spec/check_answer/normal/008_spec.rb +14 -0
  33. data/spec/check_answer/normal/009_spec.rb +11 -0
  34. data/spec/check_answer/normal/010_spec.rb +11 -0
  35. data/spec/rorr/config_spec.rb +15 -0
  36. data/spec/rorr/score_spec.rb +70 -0
  37. data/spec/rorr/ui_spec.rb +58 -0
  38. data/spec/spec_helper.rb +6 -0
  39. data/templates/README.erb +2 -0
  40. data/templates/Report.erb +14 -0
  41. data/templates/play.erb +3 -0
  42. data/topic/methods/normal/001.rb +15 -0
  43. data/topic/methods/normal/002.rb +17 -0
  44. data/topic/methods/normal/003.rb +19 -0
  45. data/topic/methods/normal/004.rb +16 -0
  46. data/topic/methods/normal/005.rb +16 -0
  47. data/topic/methods/normal/006.rb +15 -0
  48. data/topic/methods/normal/007.rb +16 -0
  49. data/topic/methods/normal/008.rb +17 -0
  50. data/topic/methods/normal/009.rb +16 -0
  51. data/topic/methods/normal/010.rb +17 -0
  52. data/topic/questions/normal/001.rb +19 -0
  53. data/topic/questions/normal/002.rb +19 -0
  54. data/topic/questions/normal/003.rb +1 -0
  55. data/topic/questions/normal/004.rb +1 -0
  56. data/topic/questions/normal/005.rb +4 -0
  57. data/topic/questions/normal/006.rb +14 -0
  58. data/topic/questions/normal/007.rb +14 -0
  59. data/topic/questions/normal/008.rb +14 -0
  60. data/topic/questions/normal/009.rb +14 -0
  61. data/topic/questions/normal/010.rb +14 -0
  62. data/topic/questions/normal/011.rb +4 -0
  63. data/topic/questions/normal/012.rb +4 -0
  64. data/topic/questions/normal/013.rb +5 -0
  65. data/topic/questions/normal/014.rb +5 -0
  66. data/topic/questions/normal/015.rb +5 -0
  67. data/topic/questions/normal/016.rb +5 -0
  68. data/topic/questions/normal/017.rb +2 -0
  69. data/topic/questions/normal/018.rb +2 -0
  70. data/topic/questions/normal/019.rb +1 -0
  71. data/topic/questions/normal/020.rb +14 -0
  72. data/topic/rails/001.rb +6 -0
  73. data/topic/rails/002.rb +12 -0
  74. data/topic/rails/003.rb +7 -0
  75. data/topic/rails/004.rb +20 -0
  76. data/topic/rails/005.rb +19 -0
  77. data/topic/rails/006.rb +17 -0
  78. data/topic/rails/007.rb +4 -0
  79. data/topic/rails/008.rb +6 -0
  80. data/topic/rails/009.rb +11 -0
  81. data/topic/rails/010.rb +9 -0
  82. data/topic/ruby/001.rb +5 -0
  83. data/topic/ruby/002.rb +9 -0
  84. data/topic/ruby/003.rb +8 -0
  85. data/topic/ruby/004.rb +4 -0
  86. data/topic/ruby/005.rb +5 -0
  87. data/topic/ruby/006.rb +8 -0
  88. data/topic/ruby/007.rb +8 -0
  89. data/topic/ruby/008.rb +7 -0
  90. data/topic/ruby/009.rb +5 -0
  91. data/topic/ruby/010.rb +6 -0
  92. metadata +207 -0
@@ -0,0 +1,76 @@
1
+ module Rorr
2
+ class Score
3
+ extend Base
4
+ @report = []
5
+ @total = { correct: 0, wrong: 0, skip: 0, retry: 0 }
6
+ class << self
7
+ attr_reader :single, :total, :report, :time, :start_time, :finish_time
8
+
9
+ def init(index)
10
+ @single = { question: "#{index}.", correct: '', skip: '', retry: 0, color: '' }
11
+ end
12
+
13
+ def add_correct
14
+ total[:correct] += 1
15
+ single[:correct] = '✓'
16
+ single[:color] = 'green'
17
+ end
18
+
19
+ def add_wrong
20
+ total[:wrong] += 1
21
+ single[:correct] = '✗'
22
+ single[:color] = 'red'
23
+ end
24
+
25
+ def add_skip
26
+ total[:skip] += 1
27
+ single[:skip] = '✓'
28
+ single[:color] = 'light_blue'
29
+ end
30
+
31
+ def add_retry
32
+ total[:retry] += 1
33
+ single[:retry] += 1
34
+ end
35
+
36
+ def add_report
37
+ report << single
38
+ end
39
+
40
+ def total_count
41
+ total[:correct] + total[:wrong] + total[:skip]
42
+ end
43
+
44
+ def correct_rate
45
+ ((total[:correct].to_f / total_count.to_f) * 100).round(2)
46
+ end
47
+
48
+ def wrong_rate
49
+ ((total[:wrong].to_f / total_count.to_f) * 100).round(2)
50
+ end
51
+
52
+ def skip_rate
53
+ ((total[:skip].to_f / total_count.to_f) * 100).round(2)
54
+ end
55
+
56
+ def start
57
+ @start_time = Time.now
58
+ end
59
+
60
+ def finish
61
+ @finish_time = Time.now
62
+ @time = (finish_time - start_time).round(2)
63
+ end
64
+
65
+ def format_time
66
+ Time.at(Score.time).utc.strftime('%H:%M:%S')
67
+ end
68
+
69
+ def export_report
70
+ File.open(generate_file_base_path + '/Report', 'w') do |f|
71
+ f.write read_template(templates_path + '/report.erb')
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,96 @@
1
+ module Rorr
2
+ class TestPass
3
+ include Base
4
+ attr_accessor :index, :questions
5
+
6
+ def initialize
7
+ @questions = []
8
+ create_questions
9
+ end
10
+
11
+ def start
12
+ system 'clear'
13
+ UI.puts "\nWelcome to #{'"Make all tests pass"'.light_cyan}"
14
+ UI.puts "Let's check how much do you proficiency in ruby or rails\n"
15
+ Score.start
16
+ @questions.each.with_index(1) do |question, index|
17
+ UI.sleep_with_setting
18
+ self.index = index - 1
19
+ Score.init(index)
20
+ generate_file(index)
21
+ while answer = UI.gets
22
+ case answer.downcase
23
+ when 'rorr'
24
+ if check_answer(index)
25
+ Score.add_correct
26
+ break
27
+ end
28
+ UI.sleep_with_setting
29
+ UI.puts "\nPlease Try Again. Make all tests pass."
30
+ UI.puts "Type #{'rorr'.green} to check, #{UI.skip}, #{UI.exit}"
31
+ Score.add_retry
32
+ when 'skip'
33
+ UI.puts 'Skip the Question!'.light_blue
34
+ Score.add_skip
35
+ break
36
+ when 'exit' then exit
37
+ else
38
+ UI.puts_with_delay 'Please enter again!'.light_blue
39
+ end
40
+ end
41
+ Score.add_report
42
+ UI.solution(question[:sol])
43
+ end
44
+ Score.finish
45
+ Score.export_report
46
+ UI.report
47
+ end
48
+
49
+ private
50
+
51
+ def create_questions
52
+ Dir[File.expand_path("../../../topic/methods/#{Config.level}/*.rb", __FILE__)].each do |file|
53
+ content = File.open(file).read.split("# methods\n")
54
+ method = content[1].split("\n")[0]
55
+ sol = UI.coderay(content[1])
56
+ @questions << { qu: content[0], me: method, sol: "\n#{sol}" }
57
+ end
58
+ @questions = @questions[0..Config.number]
59
+ end
60
+
61
+ def generate_file(index)
62
+ generate_question(index) unless File.exist?(generate_file_path(index))
63
+ UI.puts "\nQuestion #{basename(index).light_yellow} has been generated."
64
+ UI.puts "See the #{"#{generate_file_path(index)}/README".light_yellow} for instructions."
65
+ UI.puts "\nWhen you're done editing player.rb, type the #{'rorr'.green} to check, #{UI.skip}, #{UI.exit}\n"
66
+ end
67
+
68
+ def generate_question(index)
69
+ FileUtils.mkdir_p(generate_file_path(index))
70
+
71
+ File.open(generate_file_path(index) + '/README', 'w') do |f|
72
+ f.write read_template(templates_path + '/README.erb')
73
+ end
74
+
75
+ File.open(generate_file_path(index) + '/play.rb', 'w') do |f|
76
+ f.write read_template(templates_path + '/play.erb')
77
+ end
78
+ end
79
+
80
+ def generate_file_path(index)
81
+ generate_file_base_path + "/#{basename(index)}"
82
+ end
83
+
84
+ def check_answer(index)
85
+ spec = File.expand_path("../../../spec/check_answer/#{Config.level}/#{basename(index)}_spec.rb", __FILE__)
86
+ load "#{generate_file_path(index)}/play.rb"
87
+ check = RSpec::Core::Runner.run([spec])
88
+ RSpec.clear_examples
89
+ check == 0 ? true : false
90
+ end
91
+
92
+ def basename(index)
93
+ index.to_s.rjust(3, '0')
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,86 @@
1
+ module Rorr
2
+ class UI
3
+ class << self
4
+ def puts(msg)
5
+ Config.stdout.puts(msg) if Config.stdout
6
+ end
7
+
8
+ def gets
9
+ Config.stdin ? Readline.readline('> ', true) : ''
10
+ end
11
+
12
+ def puts_with_delay(msg)
13
+ sleep_with_setting
14
+ puts(msg)
15
+ end
16
+
17
+ def sleep_with_setting
18
+ sleep(Config.delay)
19
+ end
20
+
21
+ def menu
22
+ puts_with_delay "\nWelcom to RorR!".light_red
23
+ sleep_with_setting
24
+ puts "\nChoose the topic you want to start"
25
+ puts "1. Don't ask me Ruby or Rails"
26
+ puts "2. What's the return value?"
27
+ puts "3. Make all test pass"
28
+ puts "0. exit\n\n"
29
+ end
30
+
31
+ def question(question, index)
32
+ sleep_with_setting
33
+ puts "\n------------------------------"
34
+ puts "Question #{index} :"
35
+ puts "------------------------------\n\n"
36
+ puts question.to_s
37
+ puts "------------------------------\n"
38
+ end
39
+
40
+ def solution(sol = nil)
41
+ puts_with_delay "\nsolution:\n".light_magenta + sol.to_s if sol && Config.solution
42
+ puts_with_delay "\nEnter to next"
43
+ gets
44
+ system 'clear'
45
+ end
46
+
47
+ def report
48
+ system 'clear'
49
+ puts_with_delay "\n Test Report \n\n"
50
+ sleep_with_setting
51
+ puts ' Q. | Corr | Skip | Retry '
52
+ puts '-------------------------'
53
+ Score.report.each do |r|
54
+ puts " #{repo_rjust(r[:question], 3)} | #{repo_format(r[:correct], r[:color])} | #{repo_format(r[:skip], r[:color])} | #{repo_format(r[:retry])}"
55
+ end
56
+ puts '-------------------------'
57
+ puts " #{repo_rjust(Score.total_count, 3)} | #{repo_format(Score.total[:correct])} | #{repo_format(Score.total[:skip])} | #{repo_format(Score.total[:retry])}"
58
+ puts "\n#{repo_rjust('Correct Rate:', 14)} #{repo_rjust(Score.correct_rate, 7)}%".green
59
+ puts "#{repo_rjust('Skip Rate:', 14)} #{repo_rjust(Score.skip_rate, 7)}%".light_blue
60
+ puts "\n#{repo_rjust('Spend Time:', 14)} #{repo_rjust(Score.format_time, 7)}".light_magenta
61
+ puts_with_delay "\nEnter to exit\n"
62
+ gets
63
+ end
64
+
65
+ def repo_format(input, color = 'white')
66
+ repo_rjust(input).public_send(color)
67
+ end
68
+
69
+ def repo_rjust(input, length = 2)
70
+ input.to_s.rjust(length)
71
+ end
72
+
73
+ def skip
74
+ "#{'skip'.light_blue} to next question"
75
+ end
76
+
77
+ def exit
78
+ "#{'exit'.red} to exit"
79
+ end
80
+
81
+ def coderay(input)
82
+ CodeRay.scan(input, :ruby).terminal
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,3 @@
1
+ module Rorr
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ RSpec.configure do |config|
2
+ config.backtrace_exclusion_patterns = [/lib/, /spec/, /rorr/]
3
+ config.color = true
4
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rorr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rorr"
8
+ spec.version = Rorr::VERSION
9
+ spec.authors = ["Leon Ji"]
10
+ spec.email = ["mgleon08@gmail.com"]
11
+
12
+ spec.summary = %q{The easiest way to evaluate the Ruby or Rails proficiency in a interactive way.}
13
+ spec.description = %q{This is a test designed to evaluate the Ruby or Rails proficiency and artificial intelligence in a fun, interactive way.}
14
+ spec.homepage = "https://github.com/mgleon08/rorr"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|features)/}) }
18
+ spec.bindir = "bin"
19
+ spec.require_paths = ["lib"]
20
+ spec.executables = ["rorr"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.11"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec", "~> 3.0"
25
+ spec.add_development_dependency "colorize", "~> 0.8.1"
26
+ spec.add_development_dependency "coderay", "~> 1.1"
27
+ end
@@ -0,0 +1,14 @@
1
+ describe '#sort_keys' do
2
+ it do
3
+ hsh = { abc: 'hello', 'another_key' => 123, 4567 => 'third' }
4
+ expect(sort_keys(hsh)).to eq ["abc", "4567", "another_key"]
5
+ end
6
+ it do
7
+ hsh = { 12345 => 'hello', 'rorr' => 123, foo: 'bar' }
8
+ expect(sort_keys(hsh)).to eq ["foo", "rorr", "12345"]
9
+ end
10
+ it do
11
+ hsh = { a: 1, bbb: 2, cc: 3 }
12
+ expect(sort_keys(hsh)).to eq ["a", "cc", "bbb"]
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ describe '#cal_chars' do
2
+ it do
3
+ str = "ababccabcacbc"
4
+ expect(cal_chars(str)).to eq ({ :a=>4, :b=>4, :c=>5 })
5
+ end
6
+ it do
7
+ str = "oooxoxxoxoxoxoxoxoxo"
8
+ expect(cal_chars(str)).to eq ({ :o=>11, :x=>9 })
9
+ end
10
+ it do
11
+ str = "rorrrorrorr"
12
+ expect(cal_chars(str)).to eq ({ :r=>8, :o=>3 })
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ describe '#alphabetize' do
2
+ it do
3
+ ary = ["Ruby", "Rails", "Python", "PHP", "Swift"]
4
+ expect(alphabetize(ary, false)).to eq ["PHP", "Python", "Rails", "Ruby", "Swift"]
5
+ end
6
+ it do
7
+ ary = ["Ruby", "Rails", "Python", "PHP", "Swift"]
8
+ expect(alphabetize(ary, true)).to eq ["Swift", "Ruby", "Rails", "Python", "PHP"]
9
+ end
10
+ it do
11
+ ary = ["Foo", "Bar", "Ruby", "Or", "Rails"]
12
+ expect(alphabetize(ary, true)).to eq ["Ruby", "Rails", "Or", "Foo", "Bar"]
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ describe '#letter_capitalize' do
2
+ it do
3
+ str = "hello world"
4
+ expect(letter_capitalize(str)).to eq "Hello World"
5
+ end
6
+ it do
7
+ str = "i love ruby or rails"
8
+ expect(letter_capitalize(str)).to eq "I Love Ruby Or Rails"
9
+ end
10
+ it do
11
+ str = "this is rorr"
12
+ expect(letter_capitalize(str)).to eq "This Is Rorr"
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ describe '#simple_adding' do
2
+ it do
3
+ expect(simple_adding(8)).to eq 36
4
+ end
5
+ it do
6
+ expect(simple_adding(12)).to eq 78
7
+ end
8
+ it do
9
+ expect(simple_adding(128)).to eq 8256
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ describe '#first_factorial' do
2
+ it do
3
+ str = "Hello"
4
+ expect(first_factorial(str)).to eq "olleH"
5
+ end
6
+ it do
7
+ str = "I Love RorR"
8
+ expect(first_factorial(str)).to eq "RroR evoL I"
9
+ end
10
+ it do
11
+ str = "Foo Bar"
12
+ expect(first_factorial(str)).to eq "raB ooF"
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ describe '#letter_changes' do
2
+ it do
3
+ str = "hello*3"
4
+ expect(letter_changes(str)).to eq "ifmmp*3"
5
+ end
6
+ it do
7
+ str = "have fun!"
8
+ expect(letter_changes(str)).to eq "ibwf gvo!"
9
+ end
10
+ it do
11
+ str = "ruby or rails!"
12
+ expect(letter_changes(str)).to eq "svcz ps sbjmt!"
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ describe '#longest_word' do
2
+ it do
3
+ str = "fun&!! time"
4
+ expect(longest_word(str)).to eq "time"
5
+ end
6
+ it do
7
+ str = "Hello# @@World"
8
+ expect(longest_word(str)).to eq "Hello"
9
+ end
10
+ it do
11
+ str = "ruby or rails"
12
+ expect(longest_word(str)).to eq "rails"
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ describe '#first_factorial' do
2
+ it do
3
+ expect(first_factorial(4)).to eq 24
4
+ end
5
+ it do
6
+ expect(first_factorial(8)).to eq 40320
7
+ end
8
+ it do
9
+ expect(first_factorial(18)).to eq 6402373705728000
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ describe '#fibonacci' do
2
+ it do
3
+ expect(fibonacci(8)).to eq [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
4
+ end
5
+ it do
6
+ expect(fibonacci(15)).to eq [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
7
+ end
8
+ it do
9
+ expect(fibonacci(20)).to eq [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946]
10
+ end
11
+ end