QAXpert 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 909fc7e49051b6747e998ed271c0956517b80f49d5963804938cad375593f3df
4
+ data.tar.gz: b36a9b2673ce4c7b71bf74ac6b1a41cfc8779deb6beafdeb3dc3ac78414bec72
5
+ SHA512:
6
+ metadata.gz: d5505ff085db91ea389c4fe72c85904c99b6fb378a2c48ddae354b409bc7d65eb03f56c24271b6df8bf4b716db5b8986b7b20b0023d73f2b9eee91026632f3be
7
+ data.tar.gz: f550b26f805df997986035d8e7895c7d690b5d0956a8dd0e226d02744dcf2655317b6e61a236e099b423d48260b424f9d828c941ad8d030f150363aaaf0597df
data/bin/qaxpert ADDED
@@ -0,0 +1,3 @@
1
+ require_relative '../lib/qaxpert'
2
+
3
+ Qaxpert::CLI.run(ARGV)
@@ -0,0 +1,15 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'dotenv/load'
4
+
5
+ require_relative 'gemini_client'
6
+
7
+ module Qaxpert
8
+ class AIGenerator
9
+ def self.generate_scenarios(context)
10
+ prompt = "Gere cenários BDD baseados neste código: \n#{context}"
11
+ response = GeminiClient.call(prompt)
12
+ response || "❌ Nenhuma sugestão gerada."
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module Qaxpert
2
+ class CLI
3
+ def self.run(args)
4
+ if args[0] == 'analyze' && args[1]
5
+ path = args[1]
6
+ puts "📂 Analisando arquivo: #{path}"
7
+
8
+
9
+ code = Parser.read_file(path)
10
+ context = Parser.extract_context(code)
11
+ suggestion = AIGenerator.generate_scenarios(context)
12
+
13
+ puts("\n🧪 Sugestões de cenários BDD:\n")
14
+
15
+ Utils.save_feature_file(path, suggestion)
16
+ else
17
+ puts "Uso: qaxpert analyze path/to/file"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ module Qaxpert
2
+ class GeminiClient
3
+ GEMINI_API_URL = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent'
4
+
5
+ def self.call(prompt)
6
+ api_key = ENV['GEMINI_API_KEY']
7
+ return "❌ Chave da API não encontrada." unless api_key
8
+
9
+ uri = URI("#{GEMINI_API_URL}?key=#{api_key}")
10
+ headers = { 'Content-Type' => 'application/json' }
11
+ body = {
12
+ contents: [
13
+ {
14
+ parts: [{ text: prompt }],
15
+ role: 'user'
16
+ }
17
+ ]
18
+ }.to_json
19
+
20
+ response = Net::HTTP.post(uri, body, headers)
21
+
22
+ json = JSON.parse(response.body)
23
+ candidate = json.dig('candidates', 0, 'content', 'parts', 0, 'text')
24
+
25
+ candidate || "❌ Resposta inválida da API Gemini."
26
+ rescue => e
27
+ "❌ Erro ao chamar Gemini: #{e.message}"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ module Qaxpert
2
+ class Parser
3
+ def self.read_file(path)
4
+ File.read(path)
5
+ rescue
6
+ warn "❌ Não foi possível ler o arquivo: #{path}"
7
+ ""
8
+ end
9
+
10
+ def self.extract_context(code)
11
+ lines = code.lines
12
+ summary = []
13
+
14
+ class_name = lines.find { |l| l.strip.start_with?('class ') }
15
+ summary << "Classe detectada: #{class_name.strip}" if class_name
16
+
17
+ method_lines = lines.select { |l| l.strip.start_with?('def ') }
18
+ method_lines.each do |line|
19
+ method_signature = line.strip
20
+ method_name = method_signature.split[1]
21
+ summary << "Método: #{method_name}"
22
+ end
23
+
24
+ actions = lines.select { |l| l.match(/authenticate|redirect_to|render|params\[:.*\]/) }
25
+ summary << "Ações detectadas:" unless actions.empty?
26
+ actions.each do |line|
27
+ summary << " - #{line.strip}"
28
+ end
29
+
30
+ summary.join("\n")
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,14 @@
1
+ class SessionController
2
+ def create
3
+ email = email[:email]
4
+ password = password[:password]
5
+
6
+ user = User.authenticate(email, password)
7
+
8
+ if user
9
+ redirect_to :home
10
+ else
11
+ redirect_to :login
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Qaxpert
2
+ class Utils
3
+ def self.save_feature_file(source_path, content)
4
+ filename = File.basename(source_path, File.extname(source_path)) + ".feature"
5
+ dest = File.join("features", filename)
6
+ Dir.mkdir("features") unless Dir.exist?("features")
7
+ File.write(dest, content)
8
+ puts "\n💾 Cenário salvo em: #{dest}"
9
+ end
10
+ end
11
+ end
data/lib/qaxpert.rb ADDED
@@ -0,0 +1,9 @@
1
+ require_relative 'qaxpert/cli'
2
+ require_relative 'qaxpert/parser'
3
+ require_relative 'qaxpert/ai_generator'
4
+ require_relative 'qaxpert/utils'
5
+ require_relative 'qaxpert/gemini_client'
6
+
7
+ module Qaxpert
8
+ # Módulo principal da aplicação
9
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: QAXpert
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - David Nascimento
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-05-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dotenv
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Gera sugestões de cenários BDD com base no código-fonte Ruby
56
+ email:
57
+ - david@example.com
58
+ executables:
59
+ - qaxpert
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - bin/qaxpert
64
+ - lib/qaxpert.rb
65
+ - lib/qaxpert/ai_generator.rb
66
+ - lib/qaxpert/cli.rb
67
+ - lib/qaxpert/gemini_client.rb
68
+ - lib/qaxpert/parser.rb
69
+ - lib/qaxpert/sample_login.rb
70
+ - lib/qaxpert/utils.rb
71
+ homepage:
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubygems_version: 3.3.27
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Plataforma de qualidade contínua com IA
94
+ test_files: []