Skip to content

Instantly share code, notes, and snippets.

@PedroHLC
Created May 14, 2019 19:36
Show Gist options
  • Save PedroHLC/e6deb1746a81e5a57438cfd9689977ba to your computer and use it in GitHub Desktop.
Save PedroHLC/e6deb1746a81e5a57438cfd9689977ba to your computer and use it in GitHub Desktop.
Gera um latex minimo a partir de um caso de uso de um documento de requisitos
#!/usr/bin/env ruby
def cat(fname)
data = (fname == '-' ? STDIN.read : File.open(fname, 'rb').read)
return data.force_encoding('UTF-8')
end
def output(req)
req[:verb].each do |verb|
single_out(req, verb)
end
end
def gerundio(verb)
if verb =~ /(.*)usão/
return "#{$1}uir"
elsif verb =~ /(.*)ação/
return "#{$1}ar"
elsif verb =~ /(.*)oção/
return "#{$1}over"
else
return verb
end
end
def titlelize(str)
if str.is_a?(Array)
str = str.join(' ')
end
str.gsub!(/[[:word:]]+/, &:capitalize)
str.gsub!(/D[eao]s?/, &:downcase)
end
def propor(verb)
verb = verb.downcase
if verb == 'inclusão'
return 'Gerar um novo'
elsif verb == 'alteração'
return 'Realizar alteração nos dados'
elsif verb == 'remoção'
return 'Realizar remoção'
end
end
def single_out(req, verb)
bid = "%02d" % req[:id]
if (req[:verb].size > 1)
bid = "#{bid}#{('a'.ord+req[:verb].index(verb)).chr}"
end
data= <<-EOF
% #{req[:body]}
\\item \\emph{UC-#{bid}}
\\begin{enumerate}
\\item Preâmbulo:
\\begin{itemize}
\\item ID: UC-#{bid}
\\item Caso de Uso: #{titlelize([gerundio(verb), req[:subj]])}.
\\item Atores: #{req[:who].nil? ? 'Funcionário, Gerente' : req[:who]}.
\\item Propósito: #{propor(verb)} #{req[:subj]}.
\\item Visão Geral: O usuário acessa a opção que permite a #{verb} #{req[:subj]}. \\\\ O usuário entra os dados requeridos. \\\\ O usuário confirma a ação e a operação é finalizada.
\\item Pré-condições: O usuário está logado no sistema com um cadastro de Funcionário ou Gerente previamente cadastrado.
\\item Pós-condições: %TODO
\\item Referências Cruzadas: %TODO
\\item Pontos de Extensão: %TODO
\\item Pontos de Inclusão: %TODO
\\end{itemize}
\\item Fluxo Principal:
\\begin{table}[H]
\\centering
\\begin{tabularx}{\\textwidth}{| p{7cm} | p{7cm} |}
\\hline
Usuário & Sistema \\\\
\\hline \\hline
%TODO
\\end{tabularx}
\\end{table}
\\item Fluxo Alternativo:
\\begin{itemize}
\\item %TODO
\\end{itemize}
\\item Diagrama de Sequência de Sistema:
%TODO
\\end{enumerate}
EOF
file = File.new("uc/#{bid}.tex", 'wb')
file.write(data)
file.close
end
$in_ = cat 'requisitos.txt'
$id_count = 0
$in_.each_line do |line|
if line =~ /^O sistema deve permitir (.*)$/
$id_count += 1
body = $1
req = {
:id => $id_count,
:body => body
}
if body =~ /^([ao]s?) ([[:word:]]+)(?:, ([[:word:]]+))?(?: e ([[:word:]]+))? (.*)$/
req[:verb] = [$2]
if !$3.nil?
req[:verb].push $3
req[:verb].push $4 if !$4.nil?
end
compl = $5
if compl =~ /^([^,.\:]+)[,.\:] (.*)/
req[:subj] = $1
output(req)
else
puts compl
raise 'dead'
end
elsif body =~ /^ao ([[:word:]]+) ([[:word:]]+) (.*)$/
req[:who] = [$1]
req[:verb] = [$2]
compl = $3
if compl =~ /^([^,.\:]+)[,.\:] (.*)/
req[:subj] = $1
output(req)
else
puts compl
raise 'dead'
end
else
puts body
raise 'weird'
end
else
raise 'wtf'
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment