mokkku 0.0.1 → 0.0.2
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/bin/mokkku +41 -0
- data/lib/mokkku/cli/prompt.rb +27 -0
- data/lib/mokkku/cli/runner.rb +31 -0
- data/lib/mokkku/cli/validator.rb +15 -0
- data/lib/mokkku/generators/builder.rb +18 -0
- data/lib/mokkku/generators/gpt.rb +23 -0
- data/lib/mokkku/version.rb +1 -1
- data/lib/mokkku.rb +1 -0
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 234a86d569711e52239d937a81d56f24f2b15df2fc70d3bdc534cb95775e1d7b
|
4
|
+
data.tar.gz: 2f25efb4d4351948b99991f698621cb9a44ba512146ecf2834bb60cf2c9db818
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4f7e2e15f31417967cd38fa3141197e8515b9e58fe867a79a5a8e0fbe826579002afb16676dfdaba0aa3fca8d3d75dac162ba516b14036b4d12c87800d0ebad
|
7
|
+
data.tar.gz: 9bf25b64bcc41d563c8b5f64f395b6d2325f42fb2599b5c2d16c6ed5810544f7ea461646e61b12d7b02b22436216680a1b50310b8a65dae25be37b6096447a4f
|
data/bin/mokkku
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'mokkku'
|
5
|
+
require 'optionparser'
|
6
|
+
|
7
|
+
options = {}
|
8
|
+
|
9
|
+
OptionParser.new do |opts|
|
10
|
+
opts.banner = 'Usage: mokkku [options]'
|
11
|
+
|
12
|
+
opts.on('-m', '--model Model', 'Provide model name to generate mocks for') do |opt|
|
13
|
+
options[:models] = [opt]
|
14
|
+
end
|
15
|
+
|
16
|
+
opts.on('--models Model1,Model2', 'Provide model names to generate mocks for') do |opt|
|
17
|
+
options[:models] = opt.split(',')
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.on('-a', '--api-key value', 'API key for LLM') do |opt|
|
21
|
+
options[:llm_api_key] = opt
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on('-llm', '--llm-model value', 'Type of LLM: GPT, Gemini, or Claude') do |opt|
|
25
|
+
options[:llm_model] = opt
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on('-p', '--mocks-path value', 'Location where files will be created, default to ./spec/mocks') do |opt|
|
29
|
+
options[:mocks_path] = opt
|
30
|
+
end
|
31
|
+
|
32
|
+
opts.on('-c', '--count value', 'Number of entries to generate in mock file, 10 by default') do |opt|
|
33
|
+
options[:mocks_count] = opt
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on('-l', '--language value', 'The language of mocks, english by default') do |opt|
|
37
|
+
options[:language] = opt
|
38
|
+
end
|
39
|
+
end.parse!
|
40
|
+
|
41
|
+
Mokkku::Cli::Runner.start(options)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Mokkku
|
2
|
+
module Cli
|
3
|
+
class Prompt
|
4
|
+
IGNORED_COLUMNS = %w[id created_at updated_at].freeze
|
5
|
+
|
6
|
+
def self.generate(model_name, columns, mocks_count, language)
|
7
|
+
columns_for_prompt = columns.reject { |col| IGNORED_COLUMNS.include?(col.name) || col.name.match?(/.*\_id$/) }
|
8
|
+
.inject({}) { |hash, col| hash[col.name] = col.sql_type_metadata.type; hash }
|
9
|
+
|
10
|
+
prompt_start = "Act like a virtual assistant that generates YAML file with the test data for a given Ruby on Rails model. Generate #{mocks_count.to_i} entries for the following model named #{model_name}:"
|
11
|
+
|
12
|
+
yaml_attributes = columns_for_prompt.map do |name, type|
|
13
|
+
" #{name}: #{type}\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
prompt_yaml_part = "- #{yaml_attributes.join}"
|
17
|
+
prompt_summary = 'Reply only with the content of the YAML file.'
|
18
|
+
|
19
|
+
if language != 'english'
|
20
|
+
prompt_summary += " Translate test data to #{language} language."
|
21
|
+
end
|
22
|
+
|
23
|
+
"#{prompt_start}\n\n#{prompt_yaml_part}\n\n#{prompt_summary}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'validator'
|
2
|
+
require_relative 'prompt'
|
3
|
+
require_relative '../generators/builder'
|
4
|
+
|
5
|
+
module Mokkku
|
6
|
+
module Cli
|
7
|
+
class Runner
|
8
|
+
def self.start(options = {})
|
9
|
+
::Mokkku::Cli::Validator.validate_options!(options)
|
10
|
+
|
11
|
+
options[:models].each do |model_name|
|
12
|
+
columns = Object.const_get(model_name).columns
|
13
|
+
prompt = ::Mokkku::Cli::Prompt.generate(model_name, columns, options.fetch(:mocks_count, 10), options.fetch(:language, 'english'))
|
14
|
+
generator = ::Mokkku::Generators::Builder.call(
|
15
|
+
generator: options[:llm_model],
|
16
|
+
api_key: options[:llm_api_key],
|
17
|
+
prompt: prompt
|
18
|
+
)
|
19
|
+
|
20
|
+
yaml_mock = generator.call(api_key: options[:llm_api_key], prompt: prompt)
|
21
|
+
mock_file_name = model_name.to_s.gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase
|
22
|
+
|
23
|
+
puts "Write mocks for #{model_name} model in #{mock_file_name}.yml"
|
24
|
+
File.write(File.join(options.fetch(:mocks_path, './spec/mocks'), "#{mock_file_name}.yml"), yaml_mock)
|
25
|
+
end
|
26
|
+
|
27
|
+
puts 'Done!'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Mokkku
|
2
|
+
module Cli
|
3
|
+
module Validator
|
4
|
+
ModelsNotProvided = Class.new(StandardError)
|
5
|
+
InvalidLlmModel = Class.new(StandardError)
|
6
|
+
LlmApiKeyNotProvided = Class.new(StandardError)
|
7
|
+
|
8
|
+
def self.validate_options!(options)
|
9
|
+
raise ModelsNotProvided if options.fetch(:models, []).empty?
|
10
|
+
raise InvalidLlmModel unless %w[gpt gemini claude].include?(options[:llm_model].to_s.downcase)
|
11
|
+
raise LlmApiKeyNotProvided if options[:llm_api_key].to_s == ''
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'gpt'
|
2
|
+
|
3
|
+
module Mokkku
|
4
|
+
module Generators
|
5
|
+
class Builder
|
6
|
+
UnsupportedGenerator = Class.new(StandardError)
|
7
|
+
|
8
|
+
def self.call(generator:, api_key:, prompt:)
|
9
|
+
case generator
|
10
|
+
when 'gpt'
|
11
|
+
Mokkku::Generators::Gpt
|
12
|
+
else
|
13
|
+
raise UnsupportedGenerator
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'openai'
|
2
|
+
|
3
|
+
module Mokkku
|
4
|
+
module Generators
|
5
|
+
class Gpt
|
6
|
+
def self.call(api_key:, prompt:)
|
7
|
+
client = OpenAI::Client.new(access_token: api_key)
|
8
|
+
|
9
|
+
response = client.completions(parameters: {
|
10
|
+
prompt: prompt,
|
11
|
+
model: 'gpt-3.5-turbo-instruct',
|
12
|
+
temperature: 0,
|
13
|
+
max_tokens: 1_000,
|
14
|
+
top_p: 1.0,
|
15
|
+
frequency_penalty: 0.0,
|
16
|
+
presence_penalty: 0.0
|
17
|
+
})
|
18
|
+
|
19
|
+
response['choices'].first['text']
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/mokkku/version.rb
CHANGED
data/lib/mokkku.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mokkku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paweł Dąbrowski
|
@@ -44,13 +44,34 @@ dependencies:
|
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ruby-openai
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 7.1.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 7.1.0
|
47
61
|
description: Generate mock data that is unique for your application
|
48
62
|
email: contact@paweldabrowski.com
|
49
|
-
executables:
|
63
|
+
executables:
|
64
|
+
- mokkku
|
50
65
|
extensions: []
|
51
66
|
extra_rdoc_files: []
|
52
67
|
files:
|
68
|
+
- bin/mokkku
|
53
69
|
- lib/mokkku.rb
|
70
|
+
- lib/mokkku/cli/prompt.rb
|
71
|
+
- lib/mokkku/cli/runner.rb
|
72
|
+
- lib/mokkku/cli/validator.rb
|
73
|
+
- lib/mokkku/generators/builder.rb
|
74
|
+
- lib/mokkku/generators/gpt.rb
|
54
75
|
- lib/mokkku/mocked_object.rb
|
55
76
|
- lib/mokkku/utils.rb
|
56
77
|
- lib/mokkku/version.rb
|