bddgenx 2.0.5 → 2.2.0
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 +135 -67
- data/Rakefile +33 -39
- data/VERSION +1 -1
- data/lib/bddgenx/configuration.rb +35 -0
- data/lib/bddgenx/ia/chatgtp_cliente.rb +1 -1
- data/lib/bddgenx/ia/gemini_cliente.rb +1 -1
- data/lib/{version.rb → bddgenx/version.rb} +1 -1
- data/lib/env.rb +6 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25401140b3582440879672b4bb6b39e4d8e57ae3ce34aaad5341c2a526ee7a5b
|
4
|
+
data.tar.gz: e18940f3b3408bf0559e9c356bedf519161849e6f75860ccf23910897fc79685
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94c61a829d179d956e57e8ccce68c291be166ed0b54ca764ff4905f6381b649636b12b2473379b4d3426c6841cded41dfc952abb651ef8cf4d7bf52bc0546860
|
7
|
+
data.tar.gz: df64d578f90848f168e80da1e945bbe3bd9106810b5ae5c1f68a9678f30c5be19610e540c668d1223dbcd16f8398eb6696814db63e82755fca13a06e68edac30
|
data/README.md
CHANGED
@@ -3,58 +3,79 @@
|
|
3
3
|
|
4
4
|
## Visão Geral
|
5
5
|
|
6
|
-
Ferramenta Ruby para gerar automaticamente arquivos Gherkin (`.feature`) e definições de passos (`steps.rb`) a partir de histórias em texto. Atende aos padrões ISTQB, suporta parametrização com blocos de exemplos e fornece relatórios de QA (rastreabilidade, backups e PDF).
|
6
|
+
Ferramenta Ruby para gerar automaticamente arquivos Gherkin (`.feature`) e definições de passos (`steps.rb`) a partir de histórias em texto. Atende aos padrões ISTQB, suporta parametrização com blocos de exemplos e fornece relatórios de QA (rastreabilidade, backups e PDF). Também suporta geração via IA (OpenAI / Gemini) e configuração por ambiente.
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
## Estrutura do Projeto
|
7
11
|
|
8
|
-
## Estrutura do projeto
|
9
12
|
```
|
10
13
|
bdd-generation/
|
11
|
-
├── .github/
|
14
|
+
├── .github/ # Workflows de CI/CD
|
12
15
|
│ └── workflows/
|
13
|
-
│ └── main.yml
|
14
|
-
├── bin/
|
15
|
-
│
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
│ └── main.yml # Workflow de build/test
|
17
|
+
├── bin/ # Scripts CLI e de configuração
|
18
|
+
│ ├── bddgenx # Executável CLI para gerar BDD (static/chatgpt/gemini)
|
19
|
+
│ └── setup.rb # Script para preparar o ambiente local (gera .env, input/)
|
20
|
+
├── features/ # Gherkin gerados automaticamente
|
21
|
+
│ └── steps/ # Steps correspondentes aos cenários
|
22
|
+
├── input/ # Arquivos de entrada (.txt com histórias)
|
19
23
|
│ ├── historia.txt
|
20
24
|
│ ├── historia_en.txt
|
21
25
|
│ └── ...
|
22
26
|
├── lib/
|
23
|
-
│
|
24
|
-
│
|
25
|
-
│
|
26
|
-
│
|
27
|
-
│
|
28
|
-
│
|
29
|
-
│
|
30
|
-
│
|
31
|
-
│
|
32
|
-
│
|
33
|
-
│
|
34
|
-
│
|
35
|
-
│
|
36
|
-
│
|
37
|
-
│
|
38
|
-
│
|
39
|
-
│
|
40
|
-
│
|
41
|
-
│
|
42
|
-
│
|
43
|
-
|
44
|
-
│ ├──
|
45
|
-
│
|
46
|
-
│
|
47
|
-
├── .
|
48
|
-
|
49
|
-
├──
|
50
|
-
├──
|
27
|
+
│ ├── bddgenx/
|
28
|
+
│ │ ├── generators/ # Lógica de geração de features e execução geral
|
29
|
+
│ │ │ ├── generator.rb
|
30
|
+
│ │ │ ├── steps_generator.rb
|
31
|
+
│ │ │ └── runner.rb
|
32
|
+
│ │ │
|
33
|
+
│ │ ├── ia/ # Integração com APIs de IA
|
34
|
+
│ │ │ ├── chatgpt_cliente.rb
|
35
|
+
│ │ │ └── gemini_cliente.rb
|
36
|
+
│ │ │
|
37
|
+
│ │ ├── reports/ # Exportação de artefatos QA
|
38
|
+
│ │ │ ├── backup.rb
|
39
|
+
│ │ │ ├── pdf_exporter.rb
|
40
|
+
│ │ │ └── tracer.rb
|
41
|
+
│ │ │
|
42
|
+
│ │ ├── support/ # Utilitários auxiliares e validadores
|
43
|
+
│ │ │ ├── font_loader.rb
|
44
|
+
│ │ │ ├── gherkin_cleaner.rb
|
45
|
+
│ │ │ ├── remover_steps_duplicados.rb
|
46
|
+
│ │ │ └── validator.rb
|
47
|
+
│ │ │
|
48
|
+
│ │ ├── configuration.rb # Configuração global da gem (modo, ENV keys)
|
49
|
+
│ │ └── version.rb # Leitura da versão a partir do arquivo VERSION
|
50
|
+
│ │
|
51
|
+
│ ├── bddgenx.rb # Entrada principal da gem (require env)
|
52
|
+
│ └── parser.rb # Parser de arquivos de entrada
|
53
|
+
├── reports/ # Artefatos gerados
|
54
|
+
│ ├── pdf/ # Features exportadas em PDF
|
55
|
+
│ ├── backup/ # Versões antigas de features
|
56
|
+
│ └── rastreabilidade/ # Arquivos de rastreabilidade (se implementado)
|
57
|
+
├── spec/ # Testes unitários RSpec
|
58
|
+
│ ├── support/
|
59
|
+
│ ├── utils/
|
60
|
+
│ ├── ia/
|
61
|
+
│ ├── spec_helper.rb
|
62
|
+
│ └── version_spec.rb
|
63
|
+
├── .env # Arquivo com chaves reais (não versionado)
|
64
|
+
├── .env.example # Modelo para configurar variáveis de ambiente
|
65
|
+
├── .gitignore # Arquivos/pastas ignoradas pelo Git
|
66
|
+
├── bddgenx.gemspec # Especificação da gem
|
67
|
+
├── bump_version.sh # Script de versionamento automático (semântico)
|
51
68
|
├── Gemfile
|
52
69
|
├── Gemfile.lock
|
53
70
|
├── LICENSE
|
54
|
-
├── Rakefile
|
55
|
-
├── README.md
|
56
|
-
└── VERSION
|
71
|
+
├── Rakefile # Tarefas automatizadas (static, chatgpt, gemini)
|
72
|
+
├── README.md # Documentação principal do projeto
|
73
|
+
└── VERSION # Arquivo contendo a versão atual da gem
|
74
|
+
|
57
75
|
```
|
76
|
+
|
77
|
+
---
|
78
|
+
|
58
79
|
## Instalação
|
59
80
|
|
60
81
|
Adicione ao seu `Gemfile`:
|
@@ -63,44 +84,70 @@ Adicione ao seu `Gemfile`:
|
|
63
84
|
gem 'bddgenx'
|
64
85
|
```
|
65
86
|
|
66
|
-
|
87
|
+
Ou instale diretamente:
|
88
|
+
|
89
|
+
```bash
|
90
|
+
gem install bddgenx
|
91
|
+
```
|
92
|
+
|
93
|
+
---
|
94
|
+
|
95
|
+
## 🔧 Configuração
|
96
|
+
|
97
|
+
### 1. Instale dependências
|
67
98
|
|
68
99
|
```bash
|
69
100
|
bundle install
|
70
101
|
```
|
71
102
|
|
72
|
-
|
103
|
+
### 2. Configure seu `.env`
|
73
104
|
|
74
105
|
```bash
|
75
|
-
|
106
|
+
cp .env.example .env
|
76
107
|
```
|
77
108
|
|
78
|
-
|
109
|
+
Edite o `.env`:
|
79
110
|
|
80
|
-
```
|
81
|
-
|
111
|
+
```env
|
112
|
+
OPENAI_API_KEY=sk-...
|
113
|
+
GEMINI_API_KEY=ya29-...
|
114
|
+
BDDGENX_MODE=chatgpt # static | chatgpt | gemini
|
115
|
+
```
|
82
116
|
|
83
|
-
|
84
|
-
|
117
|
+
> 🔐 Dica: nunca versionar o `.env` — ele já está no `.gitignore`
|
118
|
+
|
119
|
+
---
|
120
|
+
|
121
|
+
## 🚀 Uso com Rake
|
122
|
+
|
123
|
+
Com os arquivos `.txt` dentro da pasta `input/`, execute:
|
124
|
+
|
125
|
+
```bash
|
126
|
+
rake bddgenx:static # geração sem IA
|
127
|
+
rake bddgenx:chatgpt # usando ChatGPT
|
128
|
+
rake bddgenx:gemini # usando Gemini
|
85
129
|
```
|
86
130
|
|
87
|
-
|
131
|
+
> O modo pode ser sobrescrito via ENV ou `Bddgenx.configure`
|
88
132
|
|
89
|
-
|
133
|
+
---
|
134
|
+
|
135
|
+
## 📦 Geração manual via Ruby
|
90
136
|
|
91
137
|
```ruby
|
92
138
|
require 'bddgenx'
|
93
|
-
require 'rake'
|
94
139
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
Bddgenx::Runner.execute
|
99
|
-
end
|
140
|
+
Bddgenx.configure do |config|
|
141
|
+
config.mode = :chatgpt
|
142
|
+
config.openai_api_key_env = 'OPENAI_API_KEY'
|
100
143
|
end
|
144
|
+
|
145
|
+
Bddgenx::Runner.execute
|
101
146
|
```
|
102
147
|
|
103
|
-
|
148
|
+
---
|
149
|
+
|
150
|
+
## 📝 Formato do Arquivo de Entrada (`.txt`)
|
104
151
|
|
105
152
|
```txt
|
106
153
|
# language: pt
|
@@ -113,19 +160,36 @@ Quando preencho <email> e <senha>
|
|
113
160
|
Então vejo a tela inicial
|
114
161
|
|
115
162
|
[EXAMPLES]
|
116
|
-
| email | senha |
|
117
|
-
| user@site.com | 123456 |
|
118
|
-
| errado@site.com | senha |
|
163
|
+
| email | senha |
|
164
|
+
| user@site.com | 123456 |
|
165
|
+
| errado@site.com | senha |
|
119
166
|
```
|
120
167
|
|
121
|
-
|
168
|
+
---
|
122
169
|
|
123
|
-
|
124
|
-
* **PDF**: exporta features em P/B para `reports/pdf` via `PDFExporter`
|
170
|
+
## 🧪 Setup Rápido para Novos Usuários
|
125
171
|
|
126
|
-
|
172
|
+
```bash
|
173
|
+
ruby bin/setup.rb
|
174
|
+
```
|
175
|
+
|
176
|
+
Esse comando:
|
177
|
+
|
178
|
+
- Cria `.env` a partir de `.env.example`
|
179
|
+
- Garante que `input/` existe
|
180
|
+
|
181
|
+
---
|
127
182
|
|
128
|
-
|
183
|
+
## 🧾 Artefatos Gerados
|
184
|
+
|
185
|
+
- ✅ `.feature` → dentro de `features/`
|
186
|
+
- ✅ `steps.rb` → dentro de `features/steps/`
|
187
|
+
- 🗂️ Backup automático → `reports/backup/`
|
188
|
+
- 📄 PDF das features → `reports/pdf/`
|
189
|
+
|
190
|
+
---
|
191
|
+
|
192
|
+
## ⚙️ CI/CD Exemplo com GitHub Actions
|
129
193
|
|
130
194
|
```yaml
|
131
195
|
jobs:
|
@@ -135,11 +199,15 @@ jobs:
|
|
135
199
|
- uses: actions/checkout@v3
|
136
200
|
- uses: ruby/setup-ruby@v1
|
137
201
|
with:
|
138
|
-
ruby-version: '3.
|
202
|
+
ruby-version: '3.1'
|
139
203
|
- run: bundle install
|
140
|
-
- run: bundle exec
|
204
|
+
- run: bundle exec rake bddgenx:chatgpt
|
205
|
+
env:
|
206
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
141
207
|
```
|
142
208
|
|
209
|
+
---
|
210
|
+
|
143
211
|
## Licença
|
144
212
|
|
145
213
|
MIT © 2025 David Nascimento
|
data/Rakefile
CHANGED
@@ -1,55 +1,49 @@
|
|
1
1
|
# Rakefile
|
2
|
-
|
3
|
-
|
2
|
+
require_relative 'lib/env'
|
4
3
|
require 'rake'
|
5
|
-
require 'fileutils'
|
6
|
-
require 'bddgenx'
|
7
4
|
|
8
5
|
namespace :bddgenx do
|
9
|
-
desc '
|
10
|
-
task :
|
11
|
-
|
12
|
-
|
13
|
-
only_new = args.only_new == 'true'
|
14
|
-
input_dir = args.input_dir
|
15
|
-
|
16
|
-
files = FileList["#{input_dir}/*.txt"]
|
17
|
-
if files.empty?
|
18
|
-
puts "❌ Nenhum arquivo encontrado em \#{input_dir}"
|
19
|
-
next
|
20
|
-
end
|
6
|
+
desc 'Inicializar projeto'
|
7
|
+
task :setup do
|
8
|
+
Bddgenx::Setup.inicializar_projeto
|
9
|
+
end
|
21
10
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
next unless Bddgenx::Validator.validar(historia)
|
11
|
+
desc 'Executa a geração BDD usando o modo atual (static, chatgpt, gemini)'
|
12
|
+
task :generate do
|
13
|
+
puts "⚙️ Modo de geração: #{Bddgenx.configuration.mode}"
|
26
14
|
|
27
|
-
|
15
|
+
# Evita que ARGV contenha o nome da task (como "bddgenx:static")
|
16
|
+
ARGV.clear
|
28
17
|
|
29
|
-
|
30
|
-
|
18
|
+
Bddgenx::Runner.execute
|
19
|
+
end
|
31
20
|
|
32
|
-
|
33
|
-
|
21
|
+
desc 'Gera features no modo estático (sem IA)'
|
22
|
+
task :static do
|
23
|
+
Bddgenx.configure do |config|
|
24
|
+
config.mode = :static
|
34
25
|
end
|
35
|
-
|
36
|
-
|
26
|
+
ENV['BDDGENX_MODE'] = 'static'
|
27
|
+
Rake::Task['bddgenx:generate'].invoke
|
37
28
|
end
|
38
29
|
|
39
|
-
desc '
|
40
|
-
task :
|
41
|
-
|
42
|
-
|
43
|
-
|
30
|
+
desc 'Gera features usando ChatGPT'
|
31
|
+
task :chatgpt do
|
32
|
+
Bddgenx.configure do |config|
|
33
|
+
config.mode = :chatgpt
|
34
|
+
config.openai_api_key_env = 'OPENAI_API_KEY'
|
35
|
+
end
|
36
|
+
ENV['BDDGENX_MODE'] = 'chatgpt'
|
37
|
+
Rake::Task['bddgenx:generate'].invoke
|
44
38
|
end
|
45
39
|
|
46
|
-
desc '
|
47
|
-
task :
|
48
|
-
|
49
|
-
|
50
|
-
|
40
|
+
desc 'Gera features usando Gemini'
|
41
|
+
task :gemini do
|
42
|
+
Bddgenx.configure do |config|
|
43
|
+
config.mode = :gemini
|
44
|
+
config.gemini_api_key_env = 'GEMINI_API_KEY'
|
51
45
|
end
|
46
|
+
ENV['BDDGENX_MODE'] = 'gemini'
|
47
|
+
Rake::Task['bddgenx:generate'].invoke
|
52
48
|
end
|
53
49
|
end
|
54
|
-
|
55
|
-
task default: 'bddgenx:gerar'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0
|
1
|
+
2.2.0
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# lib/bddgenx/configuration.rb
|
2
|
+
module Bddgenx
|
3
|
+
class Configuration
|
4
|
+
# :static, :chatgpt ou :gemini
|
5
|
+
attr_accessor :mode
|
6
|
+
|
7
|
+
# Nomes das ENV vars para as chaves
|
8
|
+
attr_accessor :openai_api_key_env, :gemini_api_key_env
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@mode = :static
|
12
|
+
@openai_api_key_env = 'OPENAI_API_KEY'
|
13
|
+
@gemini_api_key_env = 'GEMINI_API_KEY'
|
14
|
+
end
|
15
|
+
|
16
|
+
# Retorna a chave real, carregada do ENV
|
17
|
+
def openai_api_key
|
18
|
+
ENV[@openai_api_key_env]
|
19
|
+
end
|
20
|
+
|
21
|
+
def gemini_api_key
|
22
|
+
ENV[@gemini_api_key_env]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Singleton de configuração
|
27
|
+
def self.configuration
|
28
|
+
@configuration ||= Configuration.new
|
29
|
+
end
|
30
|
+
|
31
|
+
# DSL para configurar
|
32
|
+
def self.configure
|
33
|
+
yield(configuration)
|
34
|
+
end
|
35
|
+
end
|
@@ -21,7 +21,7 @@ module Bddgenx
|
|
21
21
|
# @return [String] Cenários gerados em formato Gherkin com palavras-chave no idioma indicado.
|
22
22
|
#
|
23
23
|
def self.gerar_cenarios(historia, idioma = 'pt')
|
24
|
-
api_key =
|
24
|
+
api_key = Bddgenx.configuration.openai_api_key # para ChatGPT
|
25
25
|
|
26
26
|
unless api_key
|
27
27
|
warn "❌ API Key do ChatGPT não encontrada no .env (OPENAI_API_KEY)"
|
@@ -18,7 +18,7 @@ module Bddgenx
|
|
18
18
|
# @return [String, nil] Cenários no formato Gherkin, ou nil em caso de erro.
|
19
19
|
#
|
20
20
|
def self.gerar_cenarios(historia, idioma = 'pt')
|
21
|
-
api_key =
|
21
|
+
api_key = Bddgenx.configuration.gemini_api_key # para Gemini
|
22
22
|
|
23
23
|
keywords_pt = {
|
24
24
|
feature: "Funcionalidade",
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Bddgenx
|
2
2
|
# Caminho absoluto para o arquivo VERSION, que fica 3 níveis acima deste arquivo:
|
3
3
|
# lib/bddgenx/version.rb → lib/bddgenx → lib → raiz do projeto
|
4
|
-
VERSION_FILE = File.expand_path("
|
4
|
+
VERSION_FILE = File.expand_path("../../../VERSION", __FILE__)
|
5
5
|
|
6
6
|
# Lê o conteúdo do arquivo VERSION para definir a constante VERSION
|
7
7
|
# Se o arquivo não existir, exibe um aviso e define o valor padrão "0.0.0"
|
data/lib/env.rb
CHANGED
@@ -15,6 +15,8 @@ require 'dotenv' # Para carregar variáveis de ambiente de arquivos .env
|
|
15
15
|
require 'unicode' # Para manipulação avançada de strings Unicode (ex: remoção de acentos)
|
16
16
|
require 'bigdecimal' # Para operações matemáticas precisas com decimais
|
17
17
|
|
18
|
+
Dotenv.load
|
19
|
+
|
18
20
|
# Configura o caminho base do projeto e carrega as gems definidas no Gemfile (se existir)
|
19
21
|
require 'bundler/setup' if File.exist?(File.expand_path('../../Gemfile', __FILE__))
|
20
22
|
|
@@ -35,12 +37,15 @@ require_relative 'bddgenx/generators/runner' # Classe responsá
|
|
35
37
|
|
36
38
|
# Parser do arquivo de entrada e versão da gem
|
37
39
|
require_relative 'parser' # Parser para interpretar arquivos de entrada
|
38
|
-
require_relative
|
40
|
+
require_relative 'bddgenx/version' # Informação da versão da gem
|
39
41
|
|
40
42
|
# Relatórios e exportação
|
41
43
|
require_relative 'bddgenx/reports/pdf_exporter' # Exporta relatórios em PDF usando Prawn
|
42
44
|
require_relative 'bddgenx/reports/backup' # Mecanismo de backup dos arquivos gerados
|
43
45
|
require_relative 'bddgenx/reports/tracer' # Rastreabilidade dos processos
|
44
46
|
|
47
|
+
require_relative 'bddgenx/configuration' # Configuração das variaveis de IA
|
48
|
+
require_relative '../bin/setup' # Verifica estrutura do projeto, caso nao exista cria a nova.
|
49
|
+
|
45
50
|
# Define variável de ambiente global para indicar que o ambiente BDDGENX está em modo desenvolvimento
|
46
51
|
ENV['BDDGENX_ENV'] = 'development'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bddgenx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Nascimento
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- lib/bddgenx/assets/fonts/DejaVuSansMono-BoldOblique.ttf
|
127
127
|
- lib/bddgenx/assets/fonts/DejaVuSansMono-Oblique.ttf
|
128
128
|
- lib/bddgenx/assets/fonts/DejaVuSansMono.ttf
|
129
|
+
- lib/bddgenx/configuration.rb
|
129
130
|
- lib/bddgenx/generators/generator.rb
|
130
131
|
- lib/bddgenx/generators/runner.rb
|
131
132
|
- lib/bddgenx/generators/steps_generator.rb
|
@@ -138,9 +139,9 @@ files:
|
|
138
139
|
- lib/bddgenx/support/gherkin_cleaner.rb
|
139
140
|
- lib/bddgenx/support/remover_steps_duplicados.rb
|
140
141
|
- lib/bddgenx/support/validator.rb
|
142
|
+
- lib/bddgenx/version.rb
|
141
143
|
- lib/env.rb
|
142
144
|
- lib/parser.rb
|
143
|
-
- lib/version.rb
|
144
145
|
homepage: https://github.com/David-Nascimento/bdd-generation
|
145
146
|
licenses:
|
146
147
|
- MIT
|