Created
May 14, 2019 19:36
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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