Module: Italian::Ruby::Errori

Defined in:
lib/italian/ruby/errori.rb

Defined Under Namespace

Classes: StringaNonTerminata

Constant Summary collapse

TRADUZIONI_NOMI_CLASSI_ERRORI =

Nomi classi errori tradotti.

Hash[
  "SyntaxError"   => "ErroreSintassi",
  "LoadError"     => "ErroreCaricamento"
].freeze

Class Method Summary collapse

Class Method Details

.ottieni_archivio_e_numero_linea_da(errore) ⇒ Object

Ottiene l’archivio e il numero della linea errata dalla traccia dell’errore.



61
62
63
64
65
66
67
68
69
# File 'lib/italian/ruby/errori.rb', line 61

def self.ottieni_archivio_e_numero_linea_da(errore)
  traccia = errore.backtrace[0]
  traccia = errore.backtrace[1] if errore.message.start_with? "wrong number of arguments"

  archivio_e_numero_linea = traccia.partition(":in").first
  archivio, numero_linea  = archivio_e_numero_linea.split(":")
  numero_linea            = numero_linea.to_i
  [ archivio, numero_linea ]
end

.ottieni_archivio_e_numero_linea_per_sintassi(errore) ⇒ Object

Ottiene l’archivio e il numero della linea errata dal messaggio di errore. Utilizzato per gli errori di sintassi.



52
53
54
55
56
57
# File 'lib/italian/ruby/errori.rb', line 52

def self.ottieni_archivio_e_numero_linea_per_sintassi(errore)
  archivio_e_numero_linea = errore.message.partition(": ").first
  archivio, numero_linea  = archivio_e_numero_linea.split(":")
  numero_linea            = numero_linea.to_i
  [ archivio, numero_linea ]
end

.ottieni_numero_linea_da(errore, archivio) ⇒ Object

Ottiene il numero della linea errata dal messaggio d’errore.



73
74
75
76
77
78
79
80
# File 'lib/italian/ruby/errori.rb', line 73

def self.ottieni_numero_linea_da(errore, archivio)
  traccia_errore = errore.backtrace.find do |traccia|
    traccia.include? archivio
  end
  traccia_errore.partition(":").last.partition(":").first.to_i
rescue
  nil
end

.recupera(errore, archivio = nil, numero_linea = nil) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/italian/ruby/errori.rb', line 21

def self.recupera(errore, archivio = nil, numero_linea = nil)
  archivio, numero_linea  = ottieni_archivio_e_numero_linea_per_sintassi errore if errore.class.name == "SyntaxError"
  archivio, numero_linea  = ottieni_archivio_e_numero_linea_da errore           if archivio.nil?
  linee_sorgente          = File.readlines archivio
  numero_linea_errata     = numero_linea                                        if numero_linea != nil
  numero_linea_errata     = ottieni_numero_linea_da errore, archivio            if numero_linea_errata.nil?
  linea_errata            = linee_sorgente[numero_linea_errata - 1].strip
  linea_errata_precedente = linee_sorgente[numero_linea_errata - 2].strip       if numero_linea_errata >= 2
  linea_errata_successiva = linee_sorgente[numero_linea_errata].strip           if numero_linea_errata < linee_sorgente.length
  nome_classe_errore      = TRADUZIONI_NOMI_CLASSI_ERRORI.fetch errore.class.name, nil
  nome_classe_errore      = errore.class.name                                   if nome_classe_errore.nil?

  puts "-------".rosso
  puts "Si è verificato un errore: #{nome_classe_errore}.".rosso
  puts
  puts "\t  [#{numero_linea_errata - 1}] #{linea_errata_precedente}".rosso      if linea_errata_precedente != nil
  puts "\t> [#{numero_linea_errata}] #{linea_errata}".rosso
  puts "\t  [#{numero_linea_errata + 1}] #{linea_errata_successiva}".rosso      if linea_errata_successiva != nil
  puts
  puts errore.message.rosso
  puts errore.backtrace.map(&:rosso)
  puts "-------".rosso

  exit
end