Class: Bddgenx::Generator
- Inherits:
-
Object
- Object
- Bddgenx::Generator
- Defined in:
- lib/bddgenx/generators/generator.rb
Constant Summary collapse
- GHERKIN_KEYS_PT =
Palavras-chave do Gherkin em Português
%w[Dado Quando Então E Mas].freeze
- GHERKIN_KEYS_EN =
Palavras-chave do Gherkin em Inglês
%w[Given When Then And But].freeze
- GHERKIN_MAP_PT_EN =
Mapeamento PT → EN
GHERKIN_KEYS_PT.zip(GHERKIN_KEYS_EN).to_h
- GHERKIN_MAP_EN_PT =
Mapeamento EN → PT
GHERKIN_KEYS_EN.zip(GHERKIN_KEYS_PT).to_h
- ALL_KEYS =
Todas as palavras-chave reconhecidas pelos parsers
GHERKIN_KEYS_PT + GHERKIN_KEYS_EN
Class Method Summary collapse
-
.dividir_examples(raw) ⇒ Array<String>
Extrai todas as linhas de exemplo de um array de strings.
-
.gerar_feature(input, override_path = nil) ⇒ Array<String, String>
Gera o conteúdo de um arquivo ‘.feature` baseado na história fornecida.
-
.path_para_feature(arquivo_txt) ⇒ String
Retorna o caminho padrão do arquivo ‘.feature` baseado no nome do `.txt`.
-
.salvar_feature(caminho, conteudo) ⇒ void
Salva o conteúdo do arquivo ‘.feature` no disco.
Class Method Details
.dividir_examples(raw) ⇒ Array<String>
Extrai todas as linhas de exemplo de um array de strings.
31 32 33 |
# File 'lib/bddgenx/generators/generator.rb', line 31 def self.dividir_examples(raw) raw.select { |l| l.strip.start_with?('|') } end |
.gerar_feature(input, override_path = nil) ⇒ Array<String, String>
Gera o conteúdo de um arquivo ‘.feature` baseado na história fornecida. Pode operar em três modos:
-
:static (sem IA)
-
:chatgpt (usando OpenAI)
-
:gemini (usando Google Gemini)
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 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 |
# File 'lib/bddgenx/generators/generator.rb', line 45 def self.gerar_feature(input, override_path = nil) modo = ENV['BDD_MODE']&.to_sym || :static if input.is_a?(String) && input.end_with?('.txt') && [:gemini, :chatgpt].include?(modo) # Geração com IA raw_txt = File.read(input) historia = { idioma: 'pt', quero: File.basename(input, '.txt').tr('_', ' ').capitalize, como: '', para: '', grupos: [] } texto_gerado = if modo == :gemini GeminiCliente.gerar_cenarios(raw_txt) else ChatGPTCliente.gerar_cenarios(raw_txt) end historia[:grupos] << { tipo: 'gerado', tag: 'ia', passos: GherkinCleaner.limpar(texto_gerado).lines.map(&:strip).reject(&:empty?) } else # Geração estática historia = input.is_a?(String) ? Parser.ler_historia(input) : input end idioma = historia[:idioma] || 'pt' cont = 1 # Cria nome-base do arquivo .feature nome_base = historia[:quero] .gsub(/[^a-z0-9]/i, '_') .downcase .split('_') .reject(&:empty?) .first(5) .join('_') caminho = override_path || "features/#{nome_base}.feature" # Palavras-chave localizadas palavras = { feature: idioma == 'en' ? 'Feature' : 'Funcionalidade', contexto: idioma == 'en' ? 'Background' : 'Contexto', cenario: idioma == 'en' ? 'Scenario' : 'Cenário', esquema: idioma == 'en' ? 'Scenario Outline' : 'Esquema do Cenário', exemplos: idioma == 'en' ? 'Examples' : 'Exemplos', regra: idioma == 'en' ? 'Rule' : 'Regra' } # Cabeçalho do arquivo .feature conteudo = <<~GHK # language: #{idioma} #{palavras[:feature]}: #{historia[:quero].sub(/^Quero\s*/i,'')} # #{historia[:como]} # #{historia[:quero]} # #{historia[:para]} GHK # Controle para não repetir passos passos_unicos = Set.new pt_map = GHERKIN_MAP_PT_EN en_map = GHERKIN_MAP_EN_PT detect = ALL_KEYS historia[:grupos].each do |grupo| passos = grupo[:passos] || [] exemplos = grupo[:exemplos] || [] next if passos.empty? tag_line = ["@#{grupo[:tipo].downcase}", ("@#{grupo[:tag]}" if grupo[:tag])].compact.join(' ') conteudo << " #{tag_line}\n" if exemplos.any? conteudo << " #{palavras[:esquema]}: Exemplo #{cont}\n" cont += 1 else conteudo << " #{palavras[:cenario]}: #{grupo[:tipo].capitalize}\n" end passos.each do |p| parts = p.strip.split(' ', 2) con_in = detect.find { |k| k.casecmp(parts[0]) == 0 } || parts[0] text = parts[1] || '' out_conn = idioma == 'en' ? pt_map[con_in] || con_in : en_map[con_in] || con_in linha_step = " #{out_conn} #{text}" next if passos_unicos.include?(linha_step) passos_unicos << linha_step conteudo << "#{linha_step}\n" end if exemplos.any? conteudo << "\n #{palavras[:exemplos]}:\n" exemplos.select { |l| l.strip.start_with?('|') }.each do |line| cleaned = line.strip.gsub(/^"|"$/, '') conteudo << " #{cleaned}\n" end end conteudo << "\n" end [caminho, conteudo] end |
.path_para_feature(arquivo_txt) ⇒ String
Retorna o caminho padrão do arquivo ‘.feature` baseado no nome do `.txt`.
161 162 163 164 |
# File 'lib/bddgenx/generators/generator.rb', line 161 def self.path_para_feature(arquivo_txt) nome = File.basename(arquivo_txt, '.txt') File.join('features', "#{nome}.feature") end |
.salvar_feature(caminho, conteudo) ⇒ void
This method returns an undefined value.
Salva o conteúdo do arquivo ‘.feature` no disco. Cria diretórios intermediários, se necessário.
173 174 175 176 177 |
# File 'lib/bddgenx/generators/generator.rb', line 173 def self.salvar_feature(caminho, conteudo) FileUtils.mkdir_p(File.dirname(caminho)) File.write(caminho, conteudo) puts "✅ Arquivo .feature gerado: #{caminho}" end |