rorr 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.
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