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.
data/lib/env.rb CHANGED
@@ -1,10 +1,14 @@
1
- # lib/bddgenx/env.rb
2
1
  # encoding: utf-8
3
2
  #
4
- # Responsável por carregar todas as dependências da gem bddgenx.
5
- # Inclui bibliotecas padrão, gems externas e arquivos internos
6
- # essenciais para o funcionamento da geração BDD, com suporte a I18n,
7
- # IA (ChatGPT, Gemini), geração de PDF, validações e estrutura de projeto.
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 com captura de saída
18
- require 'bigdecimal' # Cálculos matemáticos de alta precisão
19
- require 'i18n' # Internacionalização (traduções dinâmicas)
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 documentos PDF
26
- require 'prawn/table' # Suporte a tabelas no Prawn
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 para integração com APIs (ex: Gemini)
29
- require 'dotenv' # Carrega variáveis de ambiente do arquivo `.env`
30
- require 'unicode' # Manipulação e normalização de caracteres Unicode
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 como BDDGENX_LANG e APIs
45
+ Dotenv.load # Carrega as variáveis do `.env`
37
46
 
38
- # Define o caminho de arquivos de tradução YAML
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 somente se estiver presente e válido
43
- idioma_env = ENV['BDDGENX_LANG']
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 projetos com Gemfile)
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 da gem
61
+ # 🧩 Módulos utilitários internos
60
62
  # --------------------------------------
61
63
 
62
- require_relative 'bddgenx/support/gherkin_cleaner' # Sanitização de Gherkin gerado
63
- require_relative 'bddgenx/support/remover_steps_duplicados' # Remove passos duplicados
64
- require_relative 'bddgenx/support/validator' # Valida estrutura de entrada
65
- require_relative 'bddgenx/support/font_loader' # Carrega fontes do PDF
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 (ChatGPT, Gemini)
71
+ # 🤖 Clientes de IA (OpenAI, Gemini, Copilot)
69
72
  # --------------------------------------
70
73
 
71
- require_relative 'bddgenx/ia/gemini_cliente' # Integração com Google Gemini
72
- require_relative 'bddgenx/ia/chatgtp_cliente' # Integração com OpenAI (ChatGPT)
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 (features, steps e execução)
79
+ # 🛠 Geradores e Orquestrador
76
80
  # --------------------------------------
77
81
 
78
- require_relative 'bddgenx/generators/generator' # Geração do conteúdo `.feature`
79
- require_relative 'bddgenx/generators/steps_generator' # Geração de arquivos `*_steps.rb`
80
- require_relative 'bddgenx/generators/runner' # Orquestrador da execução CLI
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 metadados
87
+ # 📄 Parser e Metadados
84
88
  # --------------------------------------
85
89
 
86
- require_relative 'parser' # Interpreta arquivos `.txt` de entrada
87
- require_relative 'bddgenx/version' # Lê versão do arquivo `VERSION`
90
+ require_relative 'parser'
91
+ require_relative 'bddgenx/version'
88
92
 
89
93
  # --------------------------------------
90
- # 📤 Relatórios e exportação
94
+ # 📤 Relatórios e Exportação
91
95
  # --------------------------------------
92
96
 
93
- require_relative 'bddgenx/reports/pdf_exporter' # Exporta features para PDF
94
- require_relative 'bddgenx/reports/backup' # Gera backups de arquivos
95
- require_relative 'bddgenx/reports/tracer' # Rastreabilidade de geração
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 da gem e loaders auxiliares
102
+ # ⚙️ Configuração e Setup
99
103
  # --------------------------------------
100
104
 
101
- require_relative 'bddgenx/configuration' # Variáveis de configuração (modo, APIs, etc.)
102
- require_relative 'bddgenx/setup' # Inicializa estrutura do projeto (input/, features/, etc.)
103
- require_relative 'bddgenx/support/loader' # Exibe loaders/spinners no terminal
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
- # 🔁 Define modo de execução (ambiente de dev por padrão)
111
+ # 🔁 Carregamento de propriedades como variáveis de ambiente
107
112
  # --------------------------------------
108
113
 
109
- ENV['BDDGENX_ENV'] = 'development'
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.6
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-18 00:00:00.000000000 Z
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/remover_steps_duplicados.rb
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