action_prompt 0.1.0 → 0.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/app/controllers/action_prompt/previews_controller.rb +22 -0
- data/app/views/action_prompt/previews/index.html.erb +20 -0
- data/app/views/action_prompt/previews/show.html.erb +12 -0
- data/app/views/layouts/application.html.erb +16 -0
- data/lib/action_prompt/engine.rb +1 -0
- data/lib/action_prompt/preview.rb +62 -0
- data/lib/action_prompt/railtie.rb +16 -0
- data/lib/action_prompt/renderer.rb +13 -0
- data/lib/action_prompt/version.rb +1 -1
- data/lib/action_prompt.rb +3 -2
- metadata +10 -5
- data/lib/action_prompt/base.rb +0 -6
- data/lib/tasks/action_prompt_tasks.rake +0 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: aadef0f0c0b9de5ed1dcc33d550137a92b69fcd84b003dbc081d25f9e741e3f4
|
|
4
|
+
data.tar.gz: 023eabdc185943d87c587f424b20b71cc425ca8d59b13688ffc54133ef19eca0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cfe7c7884e48024e04187aa8a92390994d84300c022fd0f4dc780aa79a01e083f2c79f703a964dcf22be7d81ae26de5d936a741773cc3267a019572d0db99834
|
|
7
|
+
data.tar.gz: 7762444c108aaee485b964e90002ad2361db3fb46f38a5dcb08697af38068535f88126bb3d326157f1d87c0b2f41c0fa86499473c929d3d6780ddb4941f6ba11
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class ActionPrompt::PreviewsController < ActionController::Base
|
|
2
|
+
prepend_view_path ActionPrompt::Engine.root.join("app", "views")
|
|
3
|
+
layout "application"
|
|
4
|
+
# Ideally, we'd like to inhert from Rails::ApplicationController, but that
|
|
5
|
+
# would prevent us from using a Tailwind CDN. So instead, we're using ActionController::Base.
|
|
6
|
+
#
|
|
7
|
+
# If we are able to use Rails::ApplicationController, then re-enable this line
|
|
8
|
+
# before_action :require_local!
|
|
9
|
+
|
|
10
|
+
def index
|
|
11
|
+
@page_title = "Action Prompt Previews"
|
|
12
|
+
@previews = ActionPrompt::Preview.all
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def show
|
|
16
|
+
preview_class_name = params[:preview_name].camelize + "Preview"
|
|
17
|
+
@preview_class = ActionPrompt::Preview.find(preview_class_name)
|
|
18
|
+
slug = "#{params[:preview_name]}/#{params[:prompt_name]}"
|
|
19
|
+
@prompt = @preview_class.find_prompt(slug)
|
|
20
|
+
@prompt_output = @preview_class.new.send(params[:prompt_name].to_sym)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<h1 class="text-xl font-semibold">Action Prompt Previews</h1>
|
|
2
|
+
<div class="py-4">
|
|
3
|
+
<% if @previews.blank? %>
|
|
4
|
+
<p>You have not defined any Action Prompt Previews.</p>
|
|
5
|
+
<!-- TODO: Add a link to the Action Prompt documentation here -->
|
|
6
|
+
<% else %>
|
|
7
|
+
<div class="space-y-4">
|
|
8
|
+
<% @previews.each do |preview| %>
|
|
9
|
+
<div>
|
|
10
|
+
<h2 class="text-lg font-semibold"><%= preview.preview_name.titleize %></h2>
|
|
11
|
+
<ul>
|
|
12
|
+
<% preview.prompts.each do |prompt| %>
|
|
13
|
+
<li><%= link_to prompt.name, "/action_prompt/previews/#{prompt.slug}", class: "cursor-pointer text-blue-500 underline hover:text-blue-600" %></li>
|
|
14
|
+
<% end %>
|
|
15
|
+
</ul>
|
|
16
|
+
</div>
|
|
17
|
+
<% end %>
|
|
18
|
+
</div>
|
|
19
|
+
<% end %>
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<h1 class="text-xl font-semibold">
|
|
2
|
+
<%= @preview_class.name %>: <%= @prompt.name %>
|
|
3
|
+
</h1>
|
|
4
|
+
<div class="pb-2">
|
|
5
|
+
<%= link_to "<< Back to prompts", "/action_prompt/previews", class: "cursor-pointer text-blue-500 underline hover:text-blue-600 text-sm" %>
|
|
6
|
+
</div>
|
|
7
|
+
<div class="py-2">
|
|
8
|
+
<div>
|
|
9
|
+
Output
|
|
10
|
+
</div>
|
|
11
|
+
<div class="bg-gray-100 p-2 rounded-md border shadow-sm" style="word-wrap: break-word; white-space: pre-wrap;"><%= @prompt_output %></div>
|
|
12
|
+
</div>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title><%= @page_title %></title>
|
|
7
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
8
|
+
</head>
|
|
9
|
+
<body class="min-h-screen bg-yellow-100 pt-2">
|
|
10
|
+
|
|
11
|
+
<div class="mx-auto w-2/3 bg-white rounded-lg p-8 shadow-lg">
|
|
12
|
+
<%= yield %>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
data/lib/action_prompt/engine.rb
CHANGED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require "active_support/descendants_tracker"
|
|
2
|
+
|
|
3
|
+
module ActionPrompt
|
|
4
|
+
class Preview
|
|
5
|
+
# We need to be able to do the following:
|
|
6
|
+
# - find all the preview objects
|
|
7
|
+
# - find all the preview methods on those objects
|
|
8
|
+
# - render a preview
|
|
9
|
+
#
|
|
10
|
+
class << self
|
|
11
|
+
def all
|
|
12
|
+
load_previews if descendants.empty?
|
|
13
|
+
descendants.sort_by(&:name)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def load_previews
|
|
17
|
+
# TODO: this preview path could be made configurable in order to have equivalent
|
|
18
|
+
# functionality to Rails mailer previews
|
|
19
|
+
Dir[Rails.root.join("test", "prompts", "**", "*_preview.rb")].each do |path|
|
|
20
|
+
require path
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def preview_name
|
|
25
|
+
name.delete_suffix("Preview").underscore
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def prompts
|
|
29
|
+
# TODO: this might benefit from some memoization
|
|
30
|
+
prompt_methods = public_instance_methods(false).map(&:to_s).sort
|
|
31
|
+
|
|
32
|
+
prompt_methods.map do |method_name|
|
|
33
|
+
Prompt.new(name: method_name.humanize,
|
|
34
|
+
slug: "#{preview_name}/#{method_name}")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def find(name)
|
|
39
|
+
all.find { |preview| preview.name == name }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def find_prompt(slug)
|
|
43
|
+
prompts.find { |p| p.slug == slug }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class Prompt
|
|
49
|
+
attr_reader :name, :slug
|
|
50
|
+
|
|
51
|
+
# NOTE: this could probably be a Struct
|
|
52
|
+
def initialize(name:, slug:)
|
|
53
|
+
@name = name
|
|
54
|
+
@slug = slug
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def render(template_name, locals: {})
|
|
59
|
+
ActionPrompt::Renderer.new.render(template_name, locals: locals)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require "rails/application_controller"
|
|
2
|
+
|
|
3
|
+
module ActionPrompt
|
|
4
|
+
class Railtie < Rails::Railtie
|
|
5
|
+
config.autoload_paths << Rails.root.join("tests/prompts")
|
|
6
|
+
|
|
7
|
+
config.after_initialize do |app|
|
|
8
|
+
if Rails.env.development? || Rails.env.test?
|
|
9
|
+
app.routes.prepend do
|
|
10
|
+
get "/action_prompt/previews", to: "action_prompt/previews#index" # , internal: true
|
|
11
|
+
get "/action_prompt/previews/:preview_name/:prompt_name", to: "action_prompt/previews#show" # , internal: true
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module ActionPrompt
|
|
2
|
+
class Renderer
|
|
3
|
+
def initialize
|
|
4
|
+
# NOOP
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def render(template_name, locals: {})
|
|
8
|
+
controller = ApplicationController.new
|
|
9
|
+
controller.prepend_view_path(Rails.root.join("app", "prompts"))
|
|
10
|
+
controller.render_to_string(template: template_name, locals: locals, layout: false)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/action_prompt.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: action_prompt
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Evan Arnold
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-
|
|
11
|
+
date: 2024-09-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -35,12 +35,17 @@ files:
|
|
|
35
35
|
- README.md
|
|
36
36
|
- Rakefile
|
|
37
37
|
- app/assets/config/action_prompt_manifest.js
|
|
38
|
+
- app/controllers/action_prompt/previews_controller.rb
|
|
39
|
+
- app/views/action_prompt/previews/index.html.erb
|
|
40
|
+
- app/views/action_prompt/previews/show.html.erb
|
|
41
|
+
- app/views/layouts/application.html.erb
|
|
38
42
|
- config/routes.rb
|
|
39
43
|
- lib/action_prompt.rb
|
|
40
|
-
- lib/action_prompt/base.rb
|
|
41
44
|
- lib/action_prompt/engine.rb
|
|
45
|
+
- lib/action_prompt/preview.rb
|
|
46
|
+
- lib/action_prompt/railtie.rb
|
|
47
|
+
- lib/action_prompt/renderer.rb
|
|
42
48
|
- lib/action_prompt/version.rb
|
|
43
|
-
- lib/tasks/action_prompt_tasks.rake
|
|
44
49
|
homepage: https://github.com/evdevdev/action_prompt
|
|
45
50
|
licenses:
|
|
46
51
|
- MIT
|
|
@@ -61,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
61
66
|
- !ruby/object:Gem::Version
|
|
62
67
|
version: '0'
|
|
63
68
|
requirements: []
|
|
64
|
-
rubygems_version: 3.5.
|
|
69
|
+
rubygems_version: 3.5.16
|
|
65
70
|
signing_key:
|
|
66
71
|
specification_version: 4
|
|
67
72
|
summary: ActionPrompt is a Rails plugin for managing templated LLM prompts
|
data/lib/action_prompt/base.rb
DELETED