class GobstonesFeedbackHook::GobstonesExplainer

Public Instance Methods

explain_color_typo(_, result) click to toggle source
# File lib/feedback_hook.rb, line 92
def explain_color_typo(_, result)
  if roja_not_defined?(result) || negra_not_defined?(result)
    (result.match color_not_defined).try do |it|
      { color: it[1], rectified_color: rectified_color(it[1]) }
    end
  end
end
explain_lower_builtin_procedure_typo(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 76
def explain_lower_builtin_procedure_typo(submission, result)
  if open_paren_instead_of_assign?(result)
    (submission.match lower_builtin_procedure).try do |it|
      { lower: it[1][0...5], upper: it[1][0...5].capitalize }
    end
  end
end
explain_missing_closing_brace_before_procedure(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 68
def explain_missing_closing_brace_before_procedure(submission, result)
  if procedure_instead_of_command?(result) && missing_brace_end?(submission)
    (error_line(result)).try do |it|
      { line: it[1] }
    end
  end
end
explain_program_before_closing_structure_when_no_program(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 32
def explain_program_before_closing_structure_when_no_program(submission, result)
  if program_instead_of_command?(result) && missing_brace_end?(submission) && function_or_procedure?(submission)
    if /#{program}/ =~ submission
      nil
    else
      { keyword: last_function_or_procedure(submission) }
    end
  end
end
explain_program_before_closing_structure_when_program(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 24
def explain_program_before_closing_structure_when_program(submission, result)
  if program_instead_of_command?(result) && missing_brace_end?(submission) && function_or_procedure?(submission)
    (submission.match program).try do |it|
      { keyword: last_function_or_procedure(submission) }
    end
  end
end
explain_program_has_a_name(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 10
def explain_program_has_a_name(submission, result)
  if identifier_instead_of_brace? result
    (submission.match malformed_program_header_with_name).try do |it|
      { name: it[1] }
    end
  end
end
explain_program_has_no_opening_curly_brace(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 18
def explain_program_has_no_opening_curly_brace(submission, result)
  if identifier_instead_of_brace? result
    /#{malformed_program_header_with_no_curly_braces}/ =~ submission
  end
end
explain_surplus_closing_brace(_, result) click to toggle source
# File lib/feedback_hook.rb, line 42
def explain_surplus_closing_brace(_, result)
  if unbalanced_closing_braces? result
    (error_line(result)).try do |it|
      { line: it[1] }
    end
  end
end
explain_upper_builtin_function_typo(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 84
def explain_upper_builtin_function_typo(submission, result)
  if procedure_invocation_instead_of_expression?(result)
    (submission.match upper_builtin_function).try do |it|
      { upper: it[1], lower: it[1].camelize(:lower) }
    end
  end
end
explain_upper_function_typo(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 50
def explain_upper_function_typo(submission, result)
  if upper_identifier_instead_of_definition? result
    /#{uppercase_function}/ =~ submission
  end
end
explain_upper_procedure_typo(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 56
def explain_upper_procedure_typo(submission, result)
  if upper_identifier_instead_of_definition? result
    /#{uppercase_procedure}/ =~ submission
  end
end
explain_upper_program_typo(submission, result) click to toggle source
# File lib/feedback_hook.rb, line 62
def explain_upper_program_typo(submission, result)
  if upper_identifier_instead_of_definition? result
    /#{uppercase_program}/ =~ submission
  end
end

Private Instance Methods

color_not_defined(color='\w+') click to toggle source
# File lib/feedback_hook.rb, line 202
def color_not_defined(color='\w+')
  /<pre>\[\d+:\d+\]: El constructor "(#{color})" no está definido.<\/pre>/
end
color_not_defined?(result, color) click to toggle source
# File lib/feedback_hook.rb, line 198
def color_not_defined?(result, color)
  result.match?(color_not_defined(color))
end
error_line(result) click to toggle source
# File lib/feedback_hook.rb, line 150
def error_line(result)
  result.match /<pre>\[(\d+):\d+\]:/
end
function_or_procedure() click to toggle source
# File lib/feedback_hook.rb, line 134
def function_or_procedure
  '(function)\s*\w+\s*\([\w\d\s,]*\)\s*{|(procedure)\s*\w+\s*\([\w\d\s,]*\)\s*{'
end
function_or_procedure?(submission) click to toggle source
# File lib/feedback_hook.rb, line 130
def function_or_procedure?(submission)
  submission.match? function_or_procedure
end
identifier_instead_of_brace?(result, capital='...') click to toggle source
# File lib/feedback_hook.rb, line 114
def identifier_instead_of_brace?(result, capital='...')
  result.match? /<pre>\[\d+:\d+\]: Se esperaba una llave izquierda \("{"\).\nSe encontró: un identificador con #{capital}úsculas.<\/pre>/
end
last_function_or_procedure(submission) click to toggle source
# File lib/feedback_hook.rb, line 138
def last_function_or_procedure(submission)
  submission.scan(/#{function_or_procedure}/).last.compact.first
end
lower_builtin_procedure() click to toggle source
# File lib/feedback_hook.rb, line 178
def lower_builtin_procedure
  '(mover[\s(]|poner[\s(]|sacar[\s(])'
end
lower_identifier_instead_of_brace?(result) click to toggle source
# File lib/feedback_hook.rb, line 110
def lower_identifier_instead_of_brace?(result)
  identifier_instead_of_brace?(result, 'min')
end
malformed_program_header_with_name() click to toggle source
# File lib/feedback_hook.rb, line 102
def malformed_program_header_with_name
  '.*program +([A-Za-z]\w*)'
end
malformed_program_header_with_no_curly_braces() click to toggle source
# File lib/feedback_hook.rb, line 118
def malformed_program_header_with_no_curly_braces
  '.*program *[\r\n]\s*[^{]\w+'
end
missing_brace_end?(submission) click to toggle source
# File lib/feedback_hook.rb, line 126
def missing_brace_end?(submission)
  submission.count('{') > submission.count('}')
end
negra_not_defined?(result) click to toggle source
# File lib/feedback_hook.rb, line 194
def negra_not_defined?(result)
  color_not_defined? result, 'Negra'
end
open_paren_instead_of_assign?(result) click to toggle source
# File lib/feedback_hook.rb, line 174
def open_paren_instead_of_assign?(result)
  result.match? /<pre>\[\d+:\d+\]: Se esperaba un operador de asignación \(":="\).\nSe encontró: un paréntesis izquierdo \("\("\).<\/pre>/
end
procedure_instead_of_command?(result) click to toggle source
# File lib/feedback_hook.rb, line 170
def procedure_instead_of_command?(result)
  result.match? /<pre>\[\d+:\d+\]: Se esperaba un comando.\nSe encontró: la palabra clave "procedure".<\/pre>/
end
procedure_invocation_instead_of_expression?(result) click to toggle source
# File lib/feedback_hook.rb, line 182
def procedure_invocation_instead_of_expression?(result)
  result.match? /<pre>\[\d+:\d+\]: Se esperaba una expresión.\nSe encontró: una invocación a un procedimiento.<\/pre>/
end
program() click to toggle source
# File lib/feedback_hook.rb, line 142
def program
  'program\s*{'
end
program_instead_of_command?(result) click to toggle source
# File lib/feedback_hook.rb, line 122
def program_instead_of_command?(result)
  result.match? /<pre>\[\d+:\d+\]: Se esperaba un comando.\nSe encontró: la palabra clave "program".<\/pre>/
end
rectified_color(color) click to toggle source
# File lib/feedback_hook.rb, line 206
def rectified_color(color)
  color.chop + "o"
end
roja_not_defined?(result) click to toggle source
# File lib/feedback_hook.rb, line 190
def roja_not_defined?(result)
  color_not_defined? result, 'Roja'
end
unbalanced_closing_braces?(result) click to toggle source
# File lib/feedback_hook.rb, line 146
def unbalanced_closing_braces?(result)
  result.match? /<pre>\[\d+:\d+\]: Se encontró un "}" pero no había una llave abierta "{".<\/pre>/
end
upper_builtin_function() click to toggle source
# File lib/feedback_hook.rb, line 186
def upper_builtin_function
  '(PuedeMover|NroBolitas|HayBolitas)'
end
upper_identifier_instead_of_brace?(result) click to toggle source
# File lib/feedback_hook.rb, line 106
def upper_identifier_instead_of_brace?(result)
  identifier_instead_of_brace?(result, 'may')
end
upper_identifier_instead_of_definition?(result) click to toggle source
# File lib/feedback_hook.rb, line 154
def upper_identifier_instead_of_definition?(result)
  result.match? /<pre>\[\d+:\d+\]: Se esperaba una definición \(de programa, función, procedimiento, o tipo\).\nSe encontró: un identificador con mayúsculas.<\/pre>/
end
uppercase_function() click to toggle source
# File lib/feedback_hook.rb, line 158
def uppercase_function
  'Function\s'
end
uppercase_procedure() click to toggle source
# File lib/feedback_hook.rb, line 162
def uppercase_procedure
  'Procedure\s'
end
uppercase_program() click to toggle source
# File lib/feedback_hook.rb, line 166
def uppercase_program
  'Program[\s{]*'
end