Class: Bddgenx::Runner
- Inherits:
-
Object
- Object
- Bddgenx::Runner
- Defined in:
- lib/bddgenx/generators/runner.rb
Overview
Ponto de entrada da gem: coordena todo o processo de geração BDD.
Class Method Summary collapse
-
.choose_files(input_dir) ⇒ Array<String>
Seleciona arquivos de entrada para processamento.
-
.choose_input(input_dir) ⇒ Array<String>
Exibe prompt interativo para o usuário escolher qual arquivo processar entre todos os .txt disponíveis em input_dir.
-
.execute ⇒ void
Executa todo o fluxo de geração BDD.
-
.selecionar_arquivos_txt(input_dir) ⇒ Array<String>
Mapeia ARGV para paths de arquivos .txt em input_dir.
Class Method Details
.choose_files(input_dir) ⇒ Array<String>
Seleciona arquivos de entrada para processamento. Se houver argumentos em ARGV, usa-os como nomes de arquivos .txt; caso contrário, exibe prompt interativo para escolha.
18 19 20 |
# File 'lib/bddgenx/generators/runner.rb', line 18 def self.choose_files(input_dir) ARGV.any? ? selecionar_arquivos_txt(input_dir) : choose_input(input_dir) end |
.choose_input(input_dir) ⇒ Array<String>
Exibe prompt interativo para o usuário escolher qual arquivo processar entre todos os .txt disponíveis em input_dir.
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/bddgenx/generators/runner.rb', line 45 def self.choose_input(input_dir) files = Dir.glob(File.join(input_dir, '*.txt')) if files.empty? warn "❌ Não há arquivos .txt no diretório #{input_dir}"; exit 1 end puts "Selecione o arquivo de história para processar:" files.each_with_index { |f, i| puts "#{i+1}. #{File.basename(f)}" } print "Digite o número correspondente (ou ENTER para todos): " choice = STDIN.gets.chomp return files if choice.empty? idx = choice.to_i - 1 unless idx.between?(0, files.size - 1) warn "❌ Escolha inválida."; exit 1 end [files[idx]] end |
.execute ⇒ void
This method returns an undefined value.
Executa todo o fluxo de geração BDD.
-
Cria pasta ‘input’ se não existir
-
Seleciona arquivos de histórias
-
Para cada arquivo:
-
Lê e valida a história
-
Gera arquivo .feature e salva backup da versão anterior
-
Gera definitions de steps
-
Exporta PDFs novos via PDFExporter
-
-
Exibe resumo final com estatísticas
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/bddgenx/generators/runner.rb', line 75 def self.execute modo = ENV['BDDGENX_MODE'] || 'static' input_dir = 'input' Dir.mkdir(input_dir) unless Dir.exist?(input_dir) arquivos = choose_files(input_dir) if arquivos.empty? warn "❌ Nenhum arquivo de história para processar."; exit 1 end # Inicializa contadores total = features = steps = ignored = 0 skipped_steps = [] generated_pdfs = [] skipped_pdfs = [] arquivos.each do |arquivo| total += 1 puts "\n🔍 Processando: #{arquivo}" historia = Parser.ler_historia(arquivo) unless Validator.validar(historia) ignored += 1 puts "❌ História inválida: #{arquivo}" next end # Geração de feature if %w[gemini chatgpt].include?(modo) puts "🤖 Gerando cenários com IA (#{modo.capitalize})..." idioma = IA::GeminiCliente.detecta_idioma_arquivo(arquivo) feature_text = Bddgenx::Support::Loader.run("⏳ Aguardando resposta da IA...") do if modo == 'gemini' IA::GeminiCliente.gerar_cenarios(historia, idioma) else IA::ChatGptCliente.gerar_cenarios(historia, idioma) end end if feature_text feature_path = Generator.path_para_feature(arquivo) feature_content = Bddgenx::GherkinCleaner.limpar(feature_text) else ignored += 1 puts "❌ Falha ao gerar com IA: #{arquivo}" next end else feature_path, feature_content = Bddgenx::Support::Loader.run("⛏️ Gerando feature estática...", :dots) do Generator.gerar_feature(historia) end end Backup.salvar_versao_antiga(feature_path) features += 1 if Generator.salvar_feature(feature_path, feature_content) # Geração de steps if StepsGenerator.gerar_passos(feature_path) steps += 1 else skipped_steps << feature_path end # Exportação de PDF (apenas novos) FileUtils.mkdir_p('reports') result = PDFExporter.exportar_todos(only_new: true) generated_pdfs.concat(result[:generated]) skipped_pdfs.concat(result[:skipped]) end # Exibe relatório final puts "\n✅ Processamento concluído" puts "- Total de histórias: #{total}" puts "- Features geradas: #{features}" puts "- Steps gerados: #{steps}" puts "- Steps ignorados: #{skipped_steps.size}" puts "- PDFs gerados: #{generated_pdfs.size}" puts "- PDFs já existentes: #{skipped_pdfs.size}" puts "- Histórias ignoradas: #{ignored}" end |
.selecionar_arquivos_txt(input_dir) ⇒ Array<String>
Mapeia ARGV para paths de arquivos .txt em input_dir. Adiciona extensão ‘.txt’ se necessário e filtra arquivos inexistentes.
27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/bddgenx/generators/runner.rb', line 27 def self.selecionar_arquivos_txt(input_dir) ARGV.map do |arg| nome = arg.end_with?('.txt') ? arg : "#{arg}.txt" path = File.join(input_dir, nome) unless File.exist?(path) warn "⚠️ Arquivo não encontrado: #{path}" next end path end.compact end |