bddgenx 2.4.6 → 2.4.9
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/VERSION +1 -1
- data/lib/bddgenx/configuration.rb +65 -7
- data/lib/bddgenx/generators/generator.rb +18 -47
- data/lib/bddgenx/generators/runner.rb +63 -38
- data/lib/bddgenx/generators/steps_generator.rb +6 -18
- data/lib/bddgenx/ia/chatgtp_cliente.rb +3 -21
- data/lib/bddgenx/ia/gemini_cliente.rb +3 -21
- data/lib/bddgenx/ia/microsoft_copilot_cliente.rb +133 -0
- data/lib/bddgenx/locales/en.yml +1 -0
- data/lib/bddgenx/locales/pt.yml +1 -0
- data/lib/bddgenx/reports/tracer.rb +101 -30
- data/lib/bddgenx/support/properties_loader.rb +108 -0
- data/lib/bddgenx/{support/gherkin_cleaner.rb → utils/gherkin_cleaner_helper.rb} +1 -1
- data/lib/bddgenx/utils/language_helper.rb +45 -0
- data/lib/bddgenx/utils/remover_steps_duplicados_helper.rb +79 -0
- data/lib/env.rb +65 -50
- metadata +7 -5
- data/Rakefile +0 -36
- data/lib/bddgenx/support/remover_steps_duplicados.rb +0 -81
data/lib/env.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
# lib/bddgenx/env.rb
|
2
1
|
# encoding: utf-8
|
3
2
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
3
|
+
# Este arquivo é responsável por carregar todas as dependências da gem `bddgenx`.
|
4
|
+
#
|
5
|
+
# Ele inclui:
|
6
|
+
# - Gems padrão do Ruby (ex: JSON, net/http, fileutils)
|
7
|
+
# - Gems externas (ex: Prawn, Faraday, Dotenv)
|
8
|
+
# - Módulos internos do projeto `bddgenx`
|
9
|
+
#
|
10
|
+
# Também define o idioma ativo da gem (via I18n), configura variáveis de ambiente
|
11
|
+
# e carrega clientes de IA, geradores, validadores, exportadores e estruturas de projeto.
|
8
12
|
|
9
13
|
# --------------------------------------
|
10
14
|
# 📦 Gems padrão da linguagem Ruby
|
@@ -14,96 +18,107 @@ require 'json' # Manipulação de dados JSON
|
|
14
18
|
require 'net/http' # Requisições HTTP nativas
|
15
19
|
require 'uri' # Manipulação de URLs
|
16
20
|
require 'fileutils' # Operações com arquivos e diretórios
|
17
|
-
require 'open3' # Execução de comandos externos
|
18
|
-
require 'bigdecimal' # Cálculos
|
19
|
-
require 'i18n' # Internacionalização
|
21
|
+
require 'open3' # Execução de comandos externos
|
22
|
+
require 'bigdecimal' # Cálculos com alta precisão
|
23
|
+
require 'i18n' # Internacionalização
|
24
|
+
require 'csv' # Manipulação de arquivos CSV
|
25
|
+
require 'yard' # Documentação automática
|
20
26
|
|
21
27
|
# --------------------------------------
|
22
28
|
# 📚 Gems externas
|
23
29
|
# --------------------------------------
|
24
30
|
|
25
|
-
require 'prawn' # Geração de
|
26
|
-
require 'prawn/table' #
|
31
|
+
require 'prawn' # Geração de PDFs
|
32
|
+
require 'prawn/table' # Tabelas em PDF
|
27
33
|
require 'prawn-svg' # Suporte a SVG no PDF
|
28
|
-
require 'faraday' # Cliente HTTP
|
29
|
-
require 'dotenv' # Carrega variáveis de
|
30
|
-
require 'unicode' # Manipulação
|
34
|
+
require 'faraday' # Cliente HTTP
|
35
|
+
require 'dotenv' # Carrega variáveis de .env
|
36
|
+
require 'unicode' # Manipulação de caracteres unicode
|
37
|
+
require 'java_properties'# Leitura de arquivos .properties
|
38
|
+
require 'stringio' # IO virtual em memória
|
39
|
+
require 'tempfile' # Arquivos temporários
|
31
40
|
|
32
41
|
# --------------------------------------
|
33
42
|
# 🌍 Configuração de idioma (I18n)
|
34
43
|
# --------------------------------------
|
35
44
|
|
36
|
-
Dotenv.load # Carrega variáveis
|
45
|
+
Dotenv.load # Carrega as variáveis do `.env`
|
37
46
|
|
38
|
-
#
|
47
|
+
# Carrega os arquivos de tradução do diretório `locales/`
|
39
48
|
locales_path = File.expand_path('bddgenx/locales/*.yml', __dir__)
|
40
49
|
I18n.load_path += Dir[locales_path]
|
41
50
|
|
42
|
-
# Define o idioma ativo
|
43
|
-
|
44
|
-
if idioma_env && !idioma_env.strip.empty?
|
45
|
-
I18n.locale = idioma_env.strip.to_sym
|
46
|
-
else
|
47
|
-
I18n.locale = :pt
|
48
|
-
end
|
49
|
-
|
51
|
+
# Define o idioma ativo com base em ENV['BDDGENX_LANG'], padrão: :pt
|
52
|
+
I18n.locale = ENV['BDDGENX_LANG']&.strip&.to_sym || :pt
|
50
53
|
|
51
54
|
# --------------------------------------
|
52
|
-
# 🔧 Bundler (para
|
55
|
+
# 🔧 Bundler (para carregar dependências do Gemfile)
|
53
56
|
# --------------------------------------
|
54
57
|
|
55
|
-
# Carrega as dependências listadas no Gemfile (se houver)
|
56
58
|
require 'bundler/setup' if File.exist?(File.expand_path('../../Gemfile', __FILE__))
|
57
59
|
|
58
60
|
# --------------------------------------
|
59
|
-
# 🧩 Módulos utilitários
|
61
|
+
# 🧩 Módulos utilitários internos
|
60
62
|
# --------------------------------------
|
61
63
|
|
62
|
-
require_relative 'bddgenx/support/
|
63
|
-
require_relative 'bddgenx/support/
|
64
|
-
require_relative 'bddgenx/
|
65
|
-
require_relative 'bddgenx/
|
64
|
+
require_relative 'bddgenx/support/validator'
|
65
|
+
require_relative 'bddgenx/support/font_loader'
|
66
|
+
require_relative 'bddgenx/utils/gherkin_cleaner_helper'
|
67
|
+
require_relative 'bddgenx/utils/remover_steps_duplicados_helper'
|
68
|
+
require_relative 'bddgenx/utils/language_helper'
|
66
69
|
|
67
70
|
# --------------------------------------
|
68
|
-
# 🤖 Clientes de IA (
|
71
|
+
# 🤖 Clientes de IA (OpenAI, Gemini, Copilot)
|
69
72
|
# --------------------------------------
|
70
73
|
|
71
|
-
require_relative 'bddgenx/ia/gemini_cliente'
|
72
|
-
require_relative 'bddgenx/ia/chatgtp_cliente'
|
74
|
+
require_relative 'bddgenx/ia/gemini_cliente'
|
75
|
+
require_relative 'bddgenx/ia/chatgtp_cliente'
|
76
|
+
require_relative 'bddgenx/ia/microsoft_copilot_cliente'
|
73
77
|
|
74
78
|
# --------------------------------------
|
75
|
-
# 🛠 Geradores
|
79
|
+
# 🛠 Geradores e Orquestrador
|
76
80
|
# --------------------------------------
|
77
81
|
|
78
|
-
require_relative 'bddgenx/generators/generator'
|
79
|
-
require_relative 'bddgenx/generators/steps_generator'
|
80
|
-
require_relative 'bddgenx/generators/runner'
|
82
|
+
require_relative 'bddgenx/generators/generator'
|
83
|
+
require_relative 'bddgenx/generators/steps_generator'
|
84
|
+
require_relative 'bddgenx/generators/runner'
|
81
85
|
|
82
86
|
# --------------------------------------
|
83
|
-
# 📄 Parser e
|
87
|
+
# 📄 Parser e Metadados
|
84
88
|
# --------------------------------------
|
85
89
|
|
86
|
-
require_relative 'parser'
|
87
|
-
require_relative 'bddgenx/version'
|
90
|
+
require_relative 'parser'
|
91
|
+
require_relative 'bddgenx/version'
|
88
92
|
|
89
93
|
# --------------------------------------
|
90
|
-
# 📤 Relatórios e
|
94
|
+
# 📤 Relatórios e Exportação
|
91
95
|
# --------------------------------------
|
92
96
|
|
93
|
-
require_relative 'bddgenx/reports/pdf_exporter'
|
94
|
-
require_relative 'bddgenx/reports/backup'
|
95
|
-
require_relative 'bddgenx/reports/tracer'
|
97
|
+
require_relative 'bddgenx/reports/pdf_exporter'
|
98
|
+
require_relative 'bddgenx/reports/backup'
|
99
|
+
require_relative 'bddgenx/reports/tracer'
|
96
100
|
|
97
101
|
# --------------------------------------
|
98
|
-
# ⚙️ Configuração
|
102
|
+
# ⚙️ Configuração e Setup
|
99
103
|
# --------------------------------------
|
100
104
|
|
101
|
-
require_relative 'bddgenx/configuration'
|
102
|
-
require_relative 'bddgenx/setup'
|
103
|
-
require_relative 'bddgenx/support/loader'
|
105
|
+
require_relative 'bddgenx/configuration'
|
106
|
+
require_relative 'bddgenx/setup'
|
107
|
+
require_relative 'bddgenx/support/loader'
|
108
|
+
require_relative 'bddgenx/support/properties_loader'
|
104
109
|
|
105
110
|
# --------------------------------------
|
106
|
-
# 🔁
|
111
|
+
# 🔁 Carregamento de propriedades como variáveis de ambiente
|
107
112
|
# --------------------------------------
|
108
113
|
|
109
|
-
|
114
|
+
properties = Bddgenx::PropertiesLoader.load_properties
|
115
|
+
|
116
|
+
# Mapeamento de variáveis .properties → ENV
|
117
|
+
ENV['CHATGPT_API_URL'] ||= properties['openai.api.url']
|
118
|
+
ENV['OPENAI_API_KEY'] ||= properties['openai.api.key']
|
119
|
+
ENV['GEMINI_API_URL'] ||= properties['gemini.api.url']
|
120
|
+
ENV['GEMINI_API_KEY'] ||= properties['gemini.api.key']
|
121
|
+
ENV['MICROSOFT_COPILOT_API_URL'] ||= properties['copilot.api.url']
|
122
|
+
ENV['MICROSOFT_COPILOT_API_KEY'] ||= properties['copilot.api.key']
|
123
|
+
ENV['BDDGENX_MODE'] ||= properties['mode']
|
124
|
+
ENV['BDDGENX_LANG'] ||= properties['lang']
|
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: 2.4.
|
4
|
+
version: 2.4.9
|
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-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prawn
|
@@ -118,7 +118,6 @@ extensions: []
|
|
118
118
|
extra_rdoc_files: []
|
119
119
|
files:
|
120
120
|
- README.md
|
121
|
-
- Rakefile
|
122
121
|
- VERSION
|
123
122
|
- bin/bddgenx
|
124
123
|
- lib/bddgenx.rb
|
@@ -132,6 +131,7 @@ files:
|
|
132
131
|
- lib/bddgenx/generators/steps_generator.rb
|
133
132
|
- lib/bddgenx/ia/chatgtp_cliente.rb
|
134
133
|
- lib/bddgenx/ia/gemini_cliente.rb
|
134
|
+
- lib/bddgenx/ia/microsoft_copilot_cliente.rb
|
135
135
|
- lib/bddgenx/locales/en.yml
|
136
136
|
- lib/bddgenx/locales/pt.yml
|
137
137
|
- lib/bddgenx/reports/backup.rb
|
@@ -139,10 +139,12 @@ files:
|
|
139
139
|
- lib/bddgenx/reports/tracer.rb
|
140
140
|
- lib/bddgenx/setup.rb
|
141
141
|
- lib/bddgenx/support/font_loader.rb
|
142
|
-
- lib/bddgenx/support/gherkin_cleaner.rb
|
143
142
|
- lib/bddgenx/support/loader.rb
|
144
|
-
- lib/bddgenx/support/
|
143
|
+
- lib/bddgenx/support/properties_loader.rb
|
145
144
|
- lib/bddgenx/support/validator.rb
|
145
|
+
- lib/bddgenx/utils/gherkin_cleaner_helper.rb
|
146
|
+
- lib/bddgenx/utils/language_helper.rb
|
147
|
+
- lib/bddgenx/utils/remover_steps_duplicados_helper.rb
|
146
148
|
- lib/bddgenx/version.rb
|
147
149
|
- lib/env.rb
|
148
150
|
- lib/parser.rb
|
data/Rakefile
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'bddgenx'
|
2
|
-
require 'rake'
|
3
|
-
|
4
|
-
namespace :bddgenx do
|
5
|
-
desc 'Executa geração interativa: escolha entre static, chatgpt, gemini ou deepseek'
|
6
|
-
task :generate do
|
7
|
-
puts "=== Qual modo deseja usar para gerar os cenários? ==="
|
8
|
-
puts "1. static (sem IA)"
|
9
|
-
puts "2. chatgpt (via OpenAI)"
|
10
|
-
puts "3. gemini (via Google)"
|
11
|
-
print "Digite o número (1-3): "
|
12
|
-
|
13
|
-
escolha = STDIN.gets.chomp.to_i
|
14
|
-
|
15
|
-
modo = case escolha
|
16
|
-
when 1 then :static
|
17
|
-
when 2 then :chatgpt
|
18
|
-
when 3 then :gemini
|
19
|
-
else
|
20
|
-
puts "❌ Opção inválida. Saindo."; exit 1
|
21
|
-
end
|
22
|
-
|
23
|
-
Bddgenx.configure do |config|
|
24
|
-
config.mode = modo
|
25
|
-
config.openai_api_key_env = 'OPENAI_API_KEY'
|
26
|
-
config.gemini_api_key_env = 'GEMINI_API_KEY'
|
27
|
-
end
|
28
|
-
|
29
|
-
# ⚠️ Limpa o ARGV antes de executar para evitar que [static] seja interpretado como nome de arquivo
|
30
|
-
ARGV.clear
|
31
|
-
|
32
|
-
ENV['BDDGENX_MODE'] = modo.to_s
|
33
|
-
puts "\n⚙️ Modo selecionado: #{modo}\n\n"
|
34
|
-
Bddgenx::Runner.execute
|
35
|
-
end
|
36
|
-
end
|
@@ -1,81 +0,0 @@
|
|
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
|