bddgenx 0.1.51 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +50 -0
- data/VERSION +1 -1
- data/bin/bddgenx +1 -1
- data/lib/bddgenx/generators/generator.rb +175 -0
- data/lib/bddgenx/{runner.rb → generators/runner.rb} +24 -9
- data/lib/bddgenx/{steps_generator.rb → generators/steps_generator.rb} +32 -34
- data/lib/bddgenx/ia/chatgtp_cliente.rb +147 -0
- data/lib/bddgenx/ia/gemini_cliente.rb +135 -0
- data/lib/bddgenx/{utils → reports}/backup.rb +0 -4
- data/lib/bddgenx/{utils → reports}/pdf_exporter.rb +0 -5
- data/lib/bddgenx/{utils → reports}/tracer.rb +0 -4
- data/lib/bddgenx/{utils/fontLoader.rb → support/font_loader.rb} +0 -4
- data/lib/bddgenx/support/gherkin_cleaner.rb +102 -0
- data/lib/bddgenx/support/remover_steps_duplicados.rb +81 -0
- data/lib/bddgenx/{utils → support}/validator.rb +0 -1
- data/lib/bddgenx.rb +11 -2
- data/lib/env.rb +46 -0
- data/lib/{bddgenx/utils/parser.rb → parser.rb} +5 -3
- data/lib/version.rb +14 -0
- metadata +73 -12
- data/lib/bddgenx/generator.rb +0 -155
- data/lib/bddgenx/version.rb +0 -11
@@ -0,0 +1,135 @@
|
|
1
|
+
# lib/bddgenx/ia/gemini_cliente.rb
|
2
|
+
|
3
|
+
module Bddgenx
|
4
|
+
module IA
|
5
|
+
##
|
6
|
+
# Cliente para interação com a API Gemini do Google para geração
|
7
|
+
# de conteúdo, aqui usado para criar cenários BDD no formato Gherkin.
|
8
|
+
#
|
9
|
+
class GeminiCliente
|
10
|
+
GEMINI_API_URL = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent'.freeze
|
11
|
+
|
12
|
+
##
|
13
|
+
# Gera cenários BDD baseados em uma história, solicitando à API Gemini
|
14
|
+
# o retorno no formato Gherkin com palavras-chave no idioma desejado.
|
15
|
+
#
|
16
|
+
# @param historia [String] Texto base da história para gerar os cenários.
|
17
|
+
# @param idioma [String] Código do idioma, 'pt' por padrão.
|
18
|
+
# @return [String, nil] Cenários no formato Gherkin, ou nil em caso de erro.
|
19
|
+
#
|
20
|
+
def self.gerar_cenarios(historia, idioma = 'pt')
|
21
|
+
api_key = ENV['GEMINI_API_KEY']
|
22
|
+
|
23
|
+
keywords_pt = {
|
24
|
+
feature: "Funcionalidade",
|
25
|
+
scenario: "Cenário",
|
26
|
+
scenario_outline: "Esquema do Cenário",
|
27
|
+
examples: "Exemplos",
|
28
|
+
given: "Dado",
|
29
|
+
when: "Quando",
|
30
|
+
then: "Então",
|
31
|
+
and: "E"
|
32
|
+
}
|
33
|
+
|
34
|
+
keywords_en = {
|
35
|
+
feature: "Feature",
|
36
|
+
scenario: "Scenario",
|
37
|
+
scenario_outline: "Scenario Outline",
|
38
|
+
examples: "Examples",
|
39
|
+
given: "Given",
|
40
|
+
when: "When",
|
41
|
+
then: "Then",
|
42
|
+
and: "And"
|
43
|
+
}
|
44
|
+
|
45
|
+
keywords = idioma == 'en' ? keywords_en : keywords_pt
|
46
|
+
|
47
|
+
# Prompt base que instrui a IA a gerar cenários Gherkin no idioma indicado
|
48
|
+
prompt_base = <<~PROMPT
|
49
|
+
Gere cenários BDD no formato Gherkin, usando as palavras-chave de estrutura no idioma "#{idioma}":
|
50
|
+
Feature: #{keywords[:feature]}
|
51
|
+
Scenario: #{keywords[:scenario]}
|
52
|
+
Scenario Outline: #{keywords[:scenario_outline]}
|
53
|
+
Examples: #{keywords[:examples]}
|
54
|
+
Given: #{keywords[:given]}
|
55
|
+
When: #{keywords[:when]}
|
56
|
+
Then: #{keywords[:then]}
|
57
|
+
And: #{keywords[:and]}
|
58
|
+
|
59
|
+
Atenção: Os textos e descrições dos cenários e passos devem ser escritos em português, mesmo que as palavras-chave estejam em inglês.
|
60
|
+
|
61
|
+
História:
|
62
|
+
#{historia}
|
63
|
+
PROMPT
|
64
|
+
|
65
|
+
unless api_key
|
66
|
+
warn "❌ API Key do Gemini não encontrada no .env (GEMINI_API_KEY)"
|
67
|
+
return nil
|
68
|
+
end
|
69
|
+
|
70
|
+
uri = URI("#{GEMINI_API_URL}?key=#{api_key}")
|
71
|
+
|
72
|
+
# Estrutura do corpo da requisição para a API Gemini
|
73
|
+
request_body = {
|
74
|
+
contents: [
|
75
|
+
{
|
76
|
+
role: "user",
|
77
|
+
parts: [{ text: prompt_base }]
|
78
|
+
}
|
79
|
+
]
|
80
|
+
}
|
81
|
+
|
82
|
+
# Executa requisição POST para a API Gemini
|
83
|
+
response = Net::HTTP.post(uri, request_body.to_json, { "Content-Type" => "application/json" })
|
84
|
+
|
85
|
+
if response.is_a?(Net::HTTPSuccess)
|
86
|
+
json = JSON.parse(response.body)
|
87
|
+
|
88
|
+
unless json["candidates"]&.is_a?(Array) && json["candidates"].any?
|
89
|
+
warn "❌ Resposta da IA sem candidatos válidos:"
|
90
|
+
warn JSON.pretty_generate(json)
|
91
|
+
return nil
|
92
|
+
end
|
93
|
+
|
94
|
+
texto_ia = json["candidates"].first.dig("content", "parts", 0, "text")
|
95
|
+
if texto_ia
|
96
|
+
# Limpeza e sanitização do texto para manter padrão Gherkin
|
97
|
+
texto_limpo = Bddgenx::GherkinCleaner.limpar(texto_ia)
|
98
|
+
Utils::StepCleaner.remover_steps_duplicados(texto_ia, idioma)
|
99
|
+
|
100
|
+
# Ajuste da diretiva de idioma na saída gerada
|
101
|
+
texto_limpo.sub!(/^# language: .*/, "# language: #{idioma}")
|
102
|
+
texto_limpo.prepend("# language: #{idioma}\n") unless texto_limpo.start_with?("# language:")
|
103
|
+
|
104
|
+
return texto_limpo
|
105
|
+
else
|
106
|
+
warn "❌ Resposta da IA sem conteúdo de texto"
|
107
|
+
warn JSON.pretty_generate(json)
|
108
|
+
return nil
|
109
|
+
end
|
110
|
+
else
|
111
|
+
warn "❌ Erro ao chamar Gemini: #{response.code} - #{response.body}"
|
112
|
+
return nil
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
##
|
117
|
+
# Detecta o idioma do arquivo de feature pela linha "# language:".
|
118
|
+
#
|
119
|
+
# @param caminho_arquivo [String] Caminho do arquivo para detecção do idioma.
|
120
|
+
# @return [String] Código do idioma detectado (ex: 'pt'), padrão 'pt'.
|
121
|
+
#
|
122
|
+
def self.detecta_idioma_arquivo(caminho_arquivo)
|
123
|
+
return 'pt' unless File.exist?(caminho_arquivo)
|
124
|
+
|
125
|
+
File.foreach(caminho_arquivo) do |linha|
|
126
|
+
if linha =~ /^#\s*language:\s*(\w{2})/i
|
127
|
+
return $1.downcase
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
'pt' # idioma padrão caso não encontre
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -4,10 +4,6 @@
|
|
4
4
|
# Este arquivo define a classe Backup, responsável por criar cópias de segurança
|
5
5
|
# de arquivos .feature antes de serem sobrescritos.
|
6
6
|
# As cópias são salvas em 'reports/backup' com timestamp no nome.
|
7
|
-
|
8
|
-
require 'fileutils'
|
9
|
-
require 'time'
|
10
|
-
|
11
7
|
module Bddgenx
|
12
8
|
# Gerencia a criação de backups de arquivos .feature
|
13
9
|
class Backup
|
@@ -6,11 +6,6 @@
|
|
6
6
|
# preto e branco.
|
7
7
|
# Utiliza a gem Prawn para renderização de texto e tabelas.
|
8
8
|
|
9
|
-
require 'prawn'
|
10
|
-
require 'prawn/table'
|
11
|
-
require 'fileutils'
|
12
|
-
require_relative 'fontLoader'
|
13
|
-
|
14
9
|
# Suprime aviso de internacionalização para fontes AFM internas
|
15
10
|
Prawn::Fonts::AFM.hide_m17n_warning = true
|
16
11
|
|
@@ -4,10 +4,6 @@
|
|
4
4
|
# Este arquivo define a classe Tracer, responsável por gerar e manter
|
5
5
|
# informações de rastreabilidade de cenários e passos em um arquivo CSV.
|
6
6
|
# Útil para auditoria e análise de cobertura de cenários gerados.
|
7
|
-
|
8
|
-
require 'csv'
|
9
|
-
require 'fileutils'
|
10
|
-
|
11
7
|
module Bddgenx
|
12
8
|
# Classe para adicionar registros de rastreabilidade a um relatório CSV.
|
13
9
|
class Tracer
|
@@ -4,10 +4,6 @@
|
|
4
4
|
# Este arquivo define a classe FontLoader, responsável por localizar e carregar
|
5
5
|
# famílias de fontes TrueType para uso com Prawn em geração de PDFs.
|
6
6
|
# Busca os arquivos de fonte no diretório assets/fonts dentro da gem.
|
7
|
-
|
8
|
-
require 'prawn'
|
9
|
-
require 'rubygems' # para Gem.loaded_specs se necessário
|
10
|
-
|
11
7
|
module Bddgenx
|
12
8
|
# Gerencia o carregamento de fontes TTF para os documentos PDF.
|
13
9
|
class FontLoader
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Bddgenx
|
2
|
+
class GherkinCleaner
|
3
|
+
# Método principal para limpar o texto Gherkin recebido.
|
4
|
+
# Executa uma sequência de operações para deixar o texto formatado e correto.
|
5
|
+
#
|
6
|
+
# Passos:
|
7
|
+
# - Remove blocos de código markdown (```).
|
8
|
+
# - Garante que exista somente uma linha # language: correta.
|
9
|
+
# - Corrige a indentação dos blocos Gherkin para o padrão esperado.
|
10
|
+
# - Remove espaços em branco no início/fim do texto.
|
11
|
+
#
|
12
|
+
# Retorna o texto limpo e formatado.
|
13
|
+
def self.limpar(texto)
|
14
|
+
texto = remover_blocos_markdown(texto)
|
15
|
+
texto = corrigir_language(texto)
|
16
|
+
texto = corrigir_indentacao(texto)
|
17
|
+
texto.strip
|
18
|
+
end
|
19
|
+
|
20
|
+
# Remove blocos markdown que usam as crases tripas (```).
|
21
|
+
# Muitas vezes a IA retorna os textos dentro desses blocos, que precisam ser limpos.
|
22
|
+
#
|
23
|
+
# Exemplo:
|
24
|
+
# ```gherkin
|
25
|
+
# Feature: Exemplo
|
26
|
+
# ```
|
27
|
+
#
|
28
|
+
# Essa função remove as linhas contendo as crases, deixando só o conteúdo.
|
29
|
+
def self.remover_blocos_markdown(texto)
|
30
|
+
texto.gsub(/```[a-z]*\n?/i, '').gsub(/```/, '')
|
31
|
+
end
|
32
|
+
|
33
|
+
# Garante que o arquivo contenha exatamente uma linha "# language: xx" no topo.
|
34
|
+
#
|
35
|
+
# Passos:
|
36
|
+
# - Procura a primeira ocorrência da linha de language no texto.
|
37
|
+
# - Remove todas as outras linhas duplicadas de language.
|
38
|
+
# - Se encontrar, move essa linha para o início do texto.
|
39
|
+
# - Se não encontrar, detecta o idioma do texto e adiciona a linha no topo.
|
40
|
+
#
|
41
|
+
# Isso evita erros de parsing em ferramentas BDD que exigem essa diretiva.
|
42
|
+
def self.corrigir_language(texto)
|
43
|
+
linhas = texto.lines
|
44
|
+
primeira_language = linhas.find { |linha| linha.strip.start_with?('# language:') }
|
45
|
+
|
46
|
+
# Remove todas as linhas duplicadas de language
|
47
|
+
linhas.reject! { |linha| linha.strip.start_with?('# language:') }
|
48
|
+
|
49
|
+
if primeira_language
|
50
|
+
# Insere a linha de language original no topo
|
51
|
+
linhas.unshift(primeira_language.strip + "\n")
|
52
|
+
else
|
53
|
+
# Se não existir, detecta o idioma e insere padrão
|
54
|
+
idioma = detectar_idioma(linhas.join)
|
55
|
+
linhas.unshift("# language: #{idioma}\n")
|
56
|
+
end
|
57
|
+
|
58
|
+
linhas.join
|
59
|
+
end
|
60
|
+
|
61
|
+
# Detecta o idioma do conteúdo baseado nas palavras-chave Gherkin presentes.
|
62
|
+
#
|
63
|
+
# Retorna:
|
64
|
+
# - 'pt' se encontrar palavras-chave em português (Dado, Quando, Então, E).
|
65
|
+
# - 'en' se encontrar palavras-chave em inglês (Given, When, Then, And).
|
66
|
+
# - 'pt' como padrão se não detectar.
|
67
|
+
#
|
68
|
+
# Isso ajuda a definir a diretiva # language: corretamente.
|
69
|
+
def self.detectar_idioma(texto)
|
70
|
+
return 'pt' if texto =~ /Dado|Quando|Então|E /i
|
71
|
+
return 'en' if texto =~ /Given|When|Then|And /i
|
72
|
+
'pt' # padrão
|
73
|
+
end
|
74
|
+
|
75
|
+
# Corrige a indentação das linhas para seguir o padrão Gherkin:
|
76
|
+
#
|
77
|
+
# Feature e Funcionalidade no nível 0 (sem indentação).
|
78
|
+
# Scenario e Scenario Outline com 2 espaços.
|
79
|
+
# Passos (Given, When, Then, And e equivalentes PT) com 4 espaços.
|
80
|
+
# Tabelas (linhas que começam com '|') com 6 espaços.
|
81
|
+
#
|
82
|
+
# Outras linhas recebem indentação padrão de 2 espaços.
|
83
|
+
#
|
84
|
+
# Essa padronização melhora legibilidade e compatibilidade com parsers Gherkin.
|
85
|
+
def self.corrigir_indentacao(texto)
|
86
|
+
linhas = texto.lines.map do |linha|
|
87
|
+
if linha.strip.start_with?('Feature', 'Funcionalidade')
|
88
|
+
linha.strip + "\n"
|
89
|
+
elsif linha.strip.start_with?('Scenario', 'Cenário', 'Scenario Outline', 'Esquema do Cenário')
|
90
|
+
" #{linha.strip}\n"
|
91
|
+
elsif linha.strip.start_with?('Given', 'When', 'Then', 'And', 'Dado', 'Quando', 'Então', 'E')
|
92
|
+
" #{linha.strip}\n"
|
93
|
+
elsif linha.strip.start_with?('|')
|
94
|
+
" #{linha.strip}\n"
|
95
|
+
else
|
96
|
+
" #{linha.strip}\n"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
linhas.join
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Bddgenx
|
2
|
+
module Utils
|
3
|
+
class StepCleaner
|
4
|
+
# Remove passos duplicados em um texto de cenários BDD,
|
5
|
+
# levando em conta o idioma para identificar as keywords (Given, When, Then, And / Dado, Quando, Então, E)
|
6
|
+
#
|
7
|
+
# Parâmetros:
|
8
|
+
# - texto: string contendo o texto do cenário BDD
|
9
|
+
# - idioma: 'en' para inglês ou qualquer outro para português
|
10
|
+
#
|
11
|
+
# Retorna o texto com passos duplicados removidos, preservando a ordem original
|
12
|
+
def self.remover_steps_duplicados(texto, idioma)
|
13
|
+
# Define as keywords principais para o idioma
|
14
|
+
keywords = idioma == 'en' ? %w[Given When Then And] : %w[Dado Quando Então E]
|
15
|
+
|
16
|
+
# Conjunto para rastrear passos já vistos (versão canônica)
|
17
|
+
seen = Set.new
|
18
|
+
resultado = []
|
19
|
+
|
20
|
+
# Percorre linha a linha
|
21
|
+
texto.each_line do |linha|
|
22
|
+
# Verifica se a linha começa com uma das keywords
|
23
|
+
if keywords.any? { |kw| linha.strip.start_with?(kw) }
|
24
|
+
# Canonicaliza o passo para comparação sem variações irrelevantes
|
25
|
+
canonical = canonicalize_step(linha, keywords)
|
26
|
+
|
27
|
+
# Só adiciona se ainda não viu o passo canônico
|
28
|
+
unless seen.include?(canonical)
|
29
|
+
seen.add(canonical)
|
30
|
+
resultado << linha
|
31
|
+
end
|
32
|
+
else
|
33
|
+
# Linhas que não são passos são adicionadas normalmente
|
34
|
+
resultado << linha
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Retorna o texto reconstruído sem duplicatas
|
39
|
+
resultado.join
|
40
|
+
end
|
41
|
+
|
42
|
+
# Gera uma versão canônica (normalizada) do passo para facilitar
|
43
|
+
# a identificação de duplicatas mesmo com variações menores de texto.
|
44
|
+
#
|
45
|
+
# Exemplo: Dado "usuario" fez login e Dado <usuario> fez login
|
46
|
+
# gerarão o mesmo canonical para evitar repetição.
|
47
|
+
#
|
48
|
+
# Passos:
|
49
|
+
# - Remove a keyword (Given, When, etc) do começo
|
50
|
+
# - Substitui textos entre aspas, placeholders <> e números por <param>
|
51
|
+
# - Remove acentuação e pontuação para normalizar
|
52
|
+
# - Converte para minúsculas e remove espaços extras
|
53
|
+
#
|
54
|
+
# Parâmetros:
|
55
|
+
# - linha: string com o passo completo
|
56
|
+
# - keywords: array com as keywords para remoção
|
57
|
+
#
|
58
|
+
# Retorna uma string normalizada representando o passo
|
59
|
+
def self.canonicalize_step(linha, keywords)
|
60
|
+
texto = linha.dup.strip
|
61
|
+
|
62
|
+
# Remove a keyword do início, se existir
|
63
|
+
keywords.each do |kw|
|
64
|
+
texto.sub!(/^#{kw}\s+/i, '')
|
65
|
+
end
|
66
|
+
|
67
|
+
# Substitui textos entre aspas, placeholders e números por <param>
|
68
|
+
texto.gsub!(/"[^"]*"|<[^>]*>|\b\d+\b/, '<param>')
|
69
|
+
|
70
|
+
# Remove acentos usando Unicode Normalization Form KD (decompõe caracteres)
|
71
|
+
texto = Unicode.normalize_KD(texto).gsub(/\p{Mn}/, '')
|
72
|
+
|
73
|
+
# Remove pontuação, deixando apenas letras, números, espaços e <>
|
74
|
+
texto.gsub!(/[^a-zA-Z0-9\s<>]/, '')
|
75
|
+
|
76
|
+
# Converte para minúsculas, remove espaços extras e retorna
|
77
|
+
texto.downcase.strip.squeeze(" ")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -4,7 +4,6 @@
|
|
4
4
|
# Este arquivo define a classe Validator, responsável por validar a estrutura
|
5
5
|
# de uma história antes de gerar cenários ou arquivos .feature.
|
6
6
|
# Verifica presença de cabeçalho obrigatório e integridade dos grupos de passos.
|
7
|
-
|
8
7
|
module Bddgenx
|
9
8
|
# Valida objetos de história garantindo que possuam campos e blocos corretos.
|
10
9
|
class Validator
|
data/lib/bddgenx.rb
CHANGED
@@ -1,7 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
2
|
+
# Shebang para permitir execução direta do script no Linux/macOS, usando o interpretador Ruby do PATH
|
3
3
|
|
4
|
-
|
4
|
+
require_relative 'env'
|
5
|
+
# Carrega o arquivo 'env.rb' relativo a este script. Geralmente contém configurações e carregamento da gem Bddgenx.
|
6
|
+
|
7
|
+
## Evita warns na saida do console
|
8
|
+
Gem::Specification.reset
|
9
|
+
# Reseta as especificações das gems carregadas para evitar warnings no console, comum em alguns ambientes Ruby.
|
10
|
+
|
11
|
+
# Só executa o código abaixo quando este arquivo for o ponto de entrada (entrypoint) da aplicação,
|
12
|
+
# evitando que o código seja executado quando este arquivo for apenas requerido por outro arquivo.
|
5
13
|
if __FILE__ == $PROGRAM_NAME
|
6
14
|
Bddgenx::Runner.execute
|
15
|
+
# Invoca o método principal da gem Bddgenx para iniciar a execução da ferramenta.
|
7
16
|
end
|
data/lib/env.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# lib/bddgenx/env.rb
|
2
|
+
|
3
|
+
# Carregamento de bibliotecas padrão e gems externas usadas no projeto
|
4
|
+
|
5
|
+
require 'json' # Para manipulação de dados JSON
|
6
|
+
require 'net/http' # Para fazer requisições HTTP
|
7
|
+
require 'uri' # Para manipulação de URLs
|
8
|
+
require 'fileutils' # Para manipulação de arquivos e diretórios
|
9
|
+
require 'prawn' # Biblioteca para geração de PDFs
|
10
|
+
require 'prawn/table' # Suporte a tabelas no Prawn PDF
|
11
|
+
require 'prawn-svg' # Para incorporar SVG em PDFs com Prawn
|
12
|
+
require 'open3' # Para executar comandos externos com captura de saída
|
13
|
+
require 'faraday' # Cliente HTTP para Gemini API
|
14
|
+
require 'dotenv' # Para carregar variáveis de ambiente de arquivos .env
|
15
|
+
require 'unicode' # Para manipulação avançada de strings Unicode (ex: remoção de acentos)
|
16
|
+
require 'bigdecimal' # Para operações matemáticas precisas com decimais
|
17
|
+
|
18
|
+
# Configura o caminho base do projeto e carrega as gems definidas no Gemfile (se existir)
|
19
|
+
require 'bundler/setup' if File.exist?(File.expand_path('../../Gemfile', __FILE__))
|
20
|
+
|
21
|
+
# Carregamento dos módulos utilitários (helpers)
|
22
|
+
require_relative 'bddgenx/support/gherkin_cleaner' # Limpeza e normalização de textos Gherkin
|
23
|
+
require_relative 'bddgenx/support/remover_steps_duplicados' # Remoção de steps duplicados em features
|
24
|
+
require_relative 'bddgenx/support/validator' # Validação de dados e entrada
|
25
|
+
require_relative 'bddgenx/support/font_loader' # Carregamento de fontes para geração PDF
|
26
|
+
|
27
|
+
# Carregamento dos clientes para Integração com Inteligência Artificial
|
28
|
+
require_relative 'bddgenx/ia/gemini_cliente' # Cliente para API Gemini (Google)
|
29
|
+
require_relative 'bddgenx/ia/chatgtp_cliente' # Cliente para API ChatGPT (OpenAI)
|
30
|
+
|
31
|
+
# Carregamento dos geradores de BDD (features, steps e runner)
|
32
|
+
require_relative 'bddgenx/generators/generator' # Gerador principal de arquivos .feature
|
33
|
+
require_relative 'bddgenx/generators/steps_generator' # Gerador de arquivos steps.rb
|
34
|
+
require_relative 'bddgenx/generators/runner' # Classe responsável pela execução do processo de geração
|
35
|
+
|
36
|
+
# Parser do arquivo de entrada e versão da gem
|
37
|
+
require_relative 'parser' # Parser para interpretar arquivos de entrada
|
38
|
+
require_relative 'version' # Informação da versão da gem
|
39
|
+
|
40
|
+
# Relatórios e exportação
|
41
|
+
require_relative 'bddgenx/reports/pdf_exporter' # Exporta relatórios em PDF usando Prawn
|
42
|
+
require_relative 'bddgenx/reports/backup' # Mecanismo de backup dos arquivos gerados
|
43
|
+
require_relative 'bddgenx/reports/tracer' # Rastreabilidade dos processos
|
44
|
+
|
45
|
+
# Define variável de ambiente global para indicar que o ambiente BDDGENX está em modo desenvolvimento
|
46
|
+
ENV['BDDGENX_ENV'] = 'development'
|
@@ -4,8 +4,7 @@
|
|
4
4
|
# Este arquivo define a classe Parser, responsável por ler e interpretar
|
5
5
|
# arquivos de história (.txt), extraindo cabeçalho e blocos de passos e exemplos.
|
6
6
|
# Utiliza constantes para identificação de tipos de blocos e suporta idiomas
|
7
|
-
# Português e Inglês na marcação de idioma e blocos de exemplos
|
8
|
-
|
7
|
+
# Português e Inglês na marcação de idioma e blocos de exemplos
|
9
8
|
module Bddgenx
|
10
9
|
# Tipos de blocos reconhecidos na história (.txt), incluindo variações em Português
|
11
10
|
# e Inglês para blocos de exemplo.
|
@@ -42,10 +41,13 @@ module Bddgenx
|
|
42
41
|
def self.ler_historia(caminho_arquivo)
|
43
42
|
# Carrega linhas do arquivo, preservando linhas vazias e encoding UTF-8
|
44
43
|
linhas = File.readlines(caminho_arquivo, encoding: 'utf-8').map(&:rstrip)
|
44
|
+
# parser.rb (durante leitura do .txt)
|
45
|
+
primeira_linha = File.readlines(caminho_arquivo).first
|
46
|
+
idioma_forcado = primeira_linha&.match(/^#\s*lang(?:uage)?\s*:\s*(\w+)/i)&.captures&.first
|
45
47
|
|
46
48
|
# Detecta idioma no topo do arquivo: suporta '# lang: <codigo>' ou '# language: <codigo>'
|
47
49
|
idioma = 'pt'
|
48
|
-
if linhas.first
|
50
|
+
if linhas.first == idioma_forcado
|
49
51
|
idioma = Regexp.last_match(1).downcase
|
50
52
|
linhas.shift
|
51
53
|
end
|
data/lib/version.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Bddgenx
|
2
|
+
# Caminho absoluto para o arquivo VERSION, que fica 3 níveis acima deste arquivo:
|
3
|
+
# lib/bddgenx/version.rb → lib/bddgenx → lib → raiz do projeto
|
4
|
+
VERSION_FILE = File.expand_path("../../VERSION", __FILE__)
|
5
|
+
|
6
|
+
# Lê o conteúdo do arquivo VERSION para definir a constante VERSION
|
7
|
+
# Se o arquivo não existir, exibe um aviso e define o valor padrão "0.0.0"
|
8
|
+
VERSION = if File.exist?(VERSION_FILE)
|
9
|
+
File.read(VERSION_FILE).strip
|
10
|
+
else
|
11
|
+
warn "WARNING: VERSION file not found, defaulting to 0.0.0"
|
12
|
+
"0.0.0"
|
13
|
+
end
|
14
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bddgenx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Nascimento
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-05-
|
11
|
+
date: 2025-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prawn
|
@@ -52,6 +52,62 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.2.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: ruby-openai
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '8.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '8.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: faraday
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.13.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.13.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: dotenv
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.1'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.1'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: unicode
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.4'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.4'
|
55
111
|
description: Transforma arquivos .txt com histórias em arquivos .feature, com steps,
|
56
112
|
rastreabilidade e integração com CI/CD.
|
57
113
|
email:
|
@@ -70,16 +126,21 @@ files:
|
|
70
126
|
- lib/bddgenx/assets/fonts/DejaVuSansMono-BoldOblique.ttf
|
71
127
|
- lib/bddgenx/assets/fonts/DejaVuSansMono-Oblique.ttf
|
72
128
|
- lib/bddgenx/assets/fonts/DejaVuSansMono.ttf
|
73
|
-
- lib/bddgenx/generator.rb
|
74
|
-
- lib/bddgenx/runner.rb
|
75
|
-
- lib/bddgenx/steps_generator.rb
|
76
|
-
- lib/bddgenx/
|
77
|
-
- lib/bddgenx/
|
78
|
-
- lib/bddgenx/
|
79
|
-
- lib/bddgenx/
|
80
|
-
- lib/bddgenx/
|
81
|
-
- lib/bddgenx/
|
82
|
-
- lib/bddgenx/
|
129
|
+
- lib/bddgenx/generators/generator.rb
|
130
|
+
- lib/bddgenx/generators/runner.rb
|
131
|
+
- lib/bddgenx/generators/steps_generator.rb
|
132
|
+
- lib/bddgenx/ia/chatgtp_cliente.rb
|
133
|
+
- lib/bddgenx/ia/gemini_cliente.rb
|
134
|
+
- lib/bddgenx/reports/backup.rb
|
135
|
+
- lib/bddgenx/reports/pdf_exporter.rb
|
136
|
+
- lib/bddgenx/reports/tracer.rb
|
137
|
+
- lib/bddgenx/support/font_loader.rb
|
138
|
+
- lib/bddgenx/support/gherkin_cleaner.rb
|
139
|
+
- lib/bddgenx/support/remover_steps_duplicados.rb
|
140
|
+
- lib/bddgenx/support/validator.rb
|
141
|
+
- lib/env.rb
|
142
|
+
- lib/parser.rb
|
143
|
+
- lib/version.rb
|
83
144
|
homepage: https://github.com/David-Nascimento/bdd-generation
|
84
145
|
licenses:
|
85
146
|
- MIT
|