fino-rails 1.3.1 → 1.5.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/lib/fino/rails/app/controllers/fino/rails/archive_controller.rb +7 -0
- data/lib/fino/rails/app/views/fino/rails/archive/index.html.erb +33 -0
- data/lib/fino/rails/app/views/fino/rails/common/_sidebar.html.erb +4 -0
- data/lib/fino/rails/app/views/fino/rails/dashboard/index.html.erb +7 -2
- data/lib/fino/rails/app/views/fino/rails/settings/_setting.html.erb +7 -0
- data/lib/fino/rails/app/views/fino/rails/settings/types/_float.html.erb +9 -1
- data/lib/fino/rails/app/views/fino/rails/settings/types/_integer.html.erb +9 -1
- data/lib/fino/rails/config/routes.rb +7 -3
- data/lib/fino/rails/generators/install/USAGE +12 -0
- data/lib/fino/rails/generators/install/install_generator.rb +39 -0
- data/lib/fino/rails/generators/install/templates/fino.rb.tt +105 -0
- data/lib/fino/rails.rb +1 -0
- data/lib/fino/version.rb +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 44247d542938f2d6d30fcd1cce04f9536a29db60f737b8ab53ec65f322c7ae64
|
|
4
|
+
data.tar.gz: 19d1dcbf0364a5637c14db14937f1533a996cb1a72f951f526a2d16fd75c380d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2068d0fa5051c0e358c690a9aafc838a61cea5d4b62b5cc0096fec08d805172dfb1c66b4cadfd6bcdc9385f046d6f6e7cb1067922814f7e38c18c6fbfc0a3a4e
|
|
7
|
+
data.tar.gz: 02a17fc345a7e4e6e776ac6f357ccb7633637e4fc2662f0ec5944aa944a4d27f6b83b1d829838f91b1eb5eb5812b25404a797b3ad06b0bec8bf79a08108b3711
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<div class="p-3">
|
|
2
|
+
<div class="border-b border-gray-200 pb-3 sm:flex sm:items-center sm:justify-between">
|
|
3
|
+
<h3 class="text-base font-semibold text-gray-900">Archive</h3>
|
|
4
|
+
|
|
5
|
+
<% if !@archived_setting_keys.empty? %>
|
|
6
|
+
<div class="mt-3 flex gap-2 sm:mt-0 sm:ml-4">
|
|
7
|
+
<%= link_to "Clear all", :back, class: "rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-indigo-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" %>
|
|
8
|
+
</div>
|
|
9
|
+
<% end %>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div class="container mx-auto pt-3">
|
|
13
|
+
<% if @archived_setting_keys.empty? %>
|
|
14
|
+
<div class="outline outline-gray-200 rounded-xl">
|
|
15
|
+
<div class="p-3 text-center">
|
|
16
|
+
<h1 class="text-gray-900 font-semibold text-lg">There are no archived settings</h1>
|
|
17
|
+
<p class="text-gray-500">Setting becomes archived when you remove its definition from Fino configuration block</p>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<% else %>
|
|
21
|
+
<div class="outline outline-gray-200 rounded-xl">
|
|
22
|
+
<ul role="list" class="space-y-1 divide-y divide-gray-200">
|
|
23
|
+
<% @archived_setting_keys.each do |key| %>
|
|
24
|
+
<li class="text-sm/6 text-gray-900 font-semibold px-4 py-6 flex justify-between items-center">
|
|
25
|
+
<%= key %>
|
|
26
|
+
<%= link_to "Clear", :back, class: "inline-flex items-center rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-xs inset-ring inset-ring-gray-300 hover:bg-gray-50" %>
|
|
27
|
+
</li>
|
|
28
|
+
<% end %>
|
|
29
|
+
</ul>
|
|
30
|
+
</div>
|
|
31
|
+
<% end %>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
</svg>
|
|
13
13
|
Dashboard
|
|
14
14
|
<% end %>
|
|
15
|
+
|
|
16
|
+
<%= link_to archive_index_path, class: "flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold #{current_page?(:archive_index) ? 'text-indigo-600' : 'text-gray-700'} hover:bg-gray-100 hover:text-indigo-600" do %>
|
|
17
|
+
Archive
|
|
18
|
+
<% end %>
|
|
15
19
|
</div>
|
|
16
20
|
|
|
17
21
|
<div>
|
|
@@ -23,8 +23,6 @@
|
|
|
23
23
|
<h2 class="min-w-0 text-sm/6 font-semibold text-gray-900">
|
|
24
24
|
<span class="whitespace-nowrap"><%= setting.name %></span>
|
|
25
25
|
</h2>
|
|
26
|
-
|
|
27
|
-
<%= setting_type_label(setting) %>
|
|
28
26
|
</div>
|
|
29
27
|
|
|
30
28
|
<div>
|
|
@@ -43,6 +41,13 @@
|
|
|
43
41
|
<div class="truncate text-xl font-semibold text-gray-800">
|
|
44
42
|
"<%= setting.value %>"
|
|
45
43
|
</div>
|
|
44
|
+
<% when Fino::Settings::Numeric %>
|
|
45
|
+
<div class="truncate text-xl font-semibold text-gray-800">
|
|
46
|
+
<span><%= setting.value %></span>
|
|
47
|
+
<% if setting.unit.present? %>
|
|
48
|
+
<span class="text-base font-medium text-gray-600"><%= setting.unit.short_name %></span>
|
|
49
|
+
<% end %>
|
|
50
|
+
</div>
|
|
46
51
|
<% else %>
|
|
47
52
|
<div class="truncate text-xl font-semibold text-gray-800">
|
|
48
53
|
<%= setting.value %>
|
|
@@ -36,6 +36,13 @@
|
|
|
36
36
|
<div class="truncate text-xl font-semibold text-gray-800">
|
|
37
37
|
"<%= setting.value %>"
|
|
38
38
|
</div>
|
|
39
|
+
<% when Fino::Settings::Numeric %>
|
|
40
|
+
<div class="truncate text-xl font-semibold text-gray-800">
|
|
41
|
+
<%= setting.value %>
|
|
42
|
+
<% if setting.unit.present? %>
|
|
43
|
+
<span class="text-base font-medium text-gray-600"><%= setting.unit.short_name %></span>
|
|
44
|
+
<% end %>
|
|
45
|
+
</div>
|
|
39
46
|
<% else %>
|
|
40
47
|
<div class="truncate text-xl font-semibold text-gray-800">
|
|
41
48
|
<%= setting.value %>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
<% setting = local_assigns[:setting] %>
|
|
2
|
+
|
|
1
3
|
<div class="<%= local_assigns[:wrapper_class] || 'flex items-center rounded-md bg-white pl-3 outline-1 -outline-offset-1 outline-gray-300 focus-within:outline-2 focus-within:-outline-offset-2 focus-within:outline-indigo-600' %>">
|
|
2
4
|
<%= form.number_field field_name,
|
|
3
5
|
{
|
|
@@ -6,4 +8,10 @@
|
|
|
6
8
|
step: 0.1,
|
|
7
9
|
class: local_assigns[:input_class] || "block min-w-0 grow bg-white py-1.5 pr-3 pl-1 text-base text-gray-900 placeholder:text-gray-400 focus:outline-none sm:text-sm/6"
|
|
8
10
|
}.merge(field_name_attr ? { name: field_name_attr } : {}) %>
|
|
9
|
-
|
|
11
|
+
|
|
12
|
+
<% if setting.unit.present? %>
|
|
13
|
+
<div class="shrink-0 text-base text-gray-500 select-none sm:text-sm/6 dark:text-gray-400 pr-3">
|
|
14
|
+
<%= setting.unit.short_name %>
|
|
15
|
+
</div>
|
|
16
|
+
<% end %>
|
|
17
|
+
</div>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
<% setting = local_assigns[:setting] %>
|
|
2
|
+
|
|
1
3
|
<div class="<%= local_assigns[:wrapper_class] || 'flex items-center rounded-md bg-white pl-3 outline-1 -outline-offset-1 outline-gray-300 focus-within:outline-2 focus-within:-outline-offset-2 focus-within:outline-indigo-600' %>">
|
|
2
4
|
<%= form.number_field field_name,
|
|
3
5
|
{
|
|
@@ -6,4 +8,10 @@
|
|
|
6
8
|
step: 1,
|
|
7
9
|
class: local_assigns[:input_class] || "block min-w-0 grow bg-white py-1.5 pr-3 pl-1 text-base text-gray-900 placeholder:text-gray-400 focus:outline-none sm:text-sm/6"
|
|
8
10
|
}.merge(field_name_attr ? { name: field_name_attr } : {}) %>
|
|
9
|
-
|
|
11
|
+
|
|
12
|
+
<% if setting.unit.present? %>
|
|
13
|
+
<div class="shrink-0 text-base text-gray-500 select-none sm:text-sm/6 dark:text-gray-400 pr-3">
|
|
14
|
+
<%= setting.unit.short_name %>
|
|
15
|
+
</div>
|
|
16
|
+
<% end %>
|
|
17
|
+
</div>
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
Fino::Rails::Engine.routes.draw do
|
|
4
4
|
root to: "dashboard#index"
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
resources :archive, only: %i[index]
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
scope "settings" do
|
|
9
|
+
get ":section", to: "sections#show", as: :settings_section
|
|
10
|
+
|
|
11
|
+
get ":section/:setting", to: "settings#edit", as: :edit_setting
|
|
12
|
+
put ":section/:setting", to: "settings#update", as: :update_setting
|
|
13
|
+
end
|
|
10
14
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Installs Fino Rails integration by creating an initializer file with default configuration.
|
|
3
|
+
If fino-solid is installed, it will also run the fino:solid:install generator to create the database migration.
|
|
4
|
+
|
|
5
|
+
Example:
|
|
6
|
+
bin/rails generate fino:rails:install
|
|
7
|
+
|
|
8
|
+
This will create:
|
|
9
|
+
config/initializers/fino.rb
|
|
10
|
+
|
|
11
|
+
If fino-solid is installed, it will also create:
|
|
12
|
+
db/migrate/[timestamp]_create_fino_settings.rb
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
|
|
5
|
+
module Fino
|
|
6
|
+
module Rails
|
|
7
|
+
module Generators
|
|
8
|
+
class InstallGenerator < ::Rails::Generators::Base
|
|
9
|
+
source_root File.expand_path("templates", __dir__)
|
|
10
|
+
|
|
11
|
+
def copy_initializer
|
|
12
|
+
template "fino.rb.tt", "config/initializers/fino.rb"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def install_solid_adapter
|
|
16
|
+
return unless fino_solid_available?
|
|
17
|
+
|
|
18
|
+
generate "fino:solid:install"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def fino_solid_available?
|
|
24
|
+
require "fino-solid"
|
|
25
|
+
true
|
|
26
|
+
rescue LoadError
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def fino_redis_available?
|
|
31
|
+
require "fino-redis"
|
|
32
|
+
true
|
|
33
|
+
rescue LoadError
|
|
34
|
+
false
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Rails.application.configure do
|
|
4
|
+
# Configure fino-rails within this block
|
|
5
|
+
|
|
6
|
+
# Whether fino calls should be instrumented. You can implement custom subscribers by subscribing to `fino` namespace
|
|
7
|
+
config.fino.instrument = Rails.env.development?
|
|
8
|
+
|
|
9
|
+
# Fino Rails provides a default log subscriber that logs executed queries and cache hits/misses by subscribing to
|
|
10
|
+
# `fino` instrumentation namespace
|
|
11
|
+
#
|
|
12
|
+
config.fino.log = config.fino.instrument
|
|
13
|
+
|
|
14
|
+
# If setting was read from the adapter within Rails request, it will be cached for the duration of that request to
|
|
15
|
+
# avoid multiple calls to the adapter
|
|
16
|
+
#
|
|
17
|
+
config.fino.cache_within_request = true
|
|
18
|
+
|
|
19
|
+
# Whether fino should preload all registered settings in the beginning of each request by single adapter call.
|
|
20
|
+
# Can be set to:
|
|
21
|
+
#
|
|
22
|
+
# 1. false - do not preload settings
|
|
23
|
+
# 2. true - preload all settings before each request
|
|
24
|
+
# 3. Callable accepting rack request object and returning boolean - preload settings conditionally, e.g:
|
|
25
|
+
#
|
|
26
|
+
# ->(request) {
|
|
27
|
+
# case request.path
|
|
28
|
+
# when "request/using/all/settings"
|
|
29
|
+
# true
|
|
30
|
+
# when "request/not/using/settings"
|
|
31
|
+
# false
|
|
32
|
+
# when "request/using/specific/settings"
|
|
33
|
+
# [
|
|
34
|
+
# :api_rate_limit,
|
|
35
|
+
# openai: [:model, :temperature]
|
|
36
|
+
# ]
|
|
37
|
+
# end
|
|
38
|
+
# }
|
|
39
|
+
#
|
|
40
|
+
config.fino.preload_before_request = false
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
Fino.configure do
|
|
44
|
+
<%- if fino_redis_available? -%>
|
|
45
|
+
adapter do
|
|
46
|
+
Fino::Redis::Adapter.new(
|
|
47
|
+
Redis.new(**Rails.application.config_for(:redis))
|
|
48
|
+
)
|
|
49
|
+
end
|
|
50
|
+
<%- elsif fino_solid_available? -%>
|
|
51
|
+
adapter do
|
|
52
|
+
Fino::Solid::Adapter.new
|
|
53
|
+
end
|
|
54
|
+
<%- else -%>
|
|
55
|
+
adapter do
|
|
56
|
+
raise "No Fino adapter configured. Use `bundle add fino-solid` for a quick start"
|
|
57
|
+
end
|
|
58
|
+
<%- end -%>
|
|
59
|
+
|
|
60
|
+
# Allows to cache settings between requests
|
|
61
|
+
#
|
|
62
|
+
# Memory cache adapter provided out of the box should be used with care as may lead to inconsistencies between
|
|
63
|
+
# running application instances, but might lead to performance improvements by reducing amount of calls to the adapter
|
|
64
|
+
#
|
|
65
|
+
# cache { Fino::Cache::Memory.new(expires_in: 1.minute) }
|
|
66
|
+
|
|
67
|
+
settings do
|
|
68
|
+
# Configure settings within this block
|
|
69
|
+
|
|
70
|
+
# Supported data types:
|
|
71
|
+
# - string
|
|
72
|
+
# - integer
|
|
73
|
+
# - float
|
|
74
|
+
# - boolean
|
|
75
|
+
|
|
76
|
+
# setting :maintenance_mode,
|
|
77
|
+
# :boolean,
|
|
78
|
+
# default: false,
|
|
79
|
+
# description: <<~DESC.strip
|
|
80
|
+
# Enable maintenance mode for the system. Users will see a maintenance page when this is enabled
|
|
81
|
+
# DESC
|
|
82
|
+
#
|
|
83
|
+
# setting :api_rate_limit,
|
|
84
|
+
# :integer,
|
|
85
|
+
# default: 1000,
|
|
86
|
+
# description: "Maximum API requests per minute per user to prevent abuse"
|
|
87
|
+
#
|
|
88
|
+
# section :openai, label: "OpenAI" do
|
|
89
|
+
# setting :model,
|
|
90
|
+
# :string,
|
|
91
|
+
# default: "gpt-5",
|
|
92
|
+
# description: "OpenAI model"
|
|
93
|
+
#
|
|
94
|
+
# setting :temperature,
|
|
95
|
+
# :float,
|
|
96
|
+
# default: 0.7,
|
|
97
|
+
# description: "Model temperature"
|
|
98
|
+
# end
|
|
99
|
+
#
|
|
100
|
+
# section :feature_toggles, label: "Feature Toggles" do
|
|
101
|
+
# setting :new_ui, :boolean, default: true, description: "Enable the new user interface"
|
|
102
|
+
# setting :beta_functionality, :boolean, default: false, description: "Enable beta functionality for testing"
|
|
103
|
+
# end
|
|
104
|
+
end
|
|
105
|
+
end
|
data/lib/fino/rails.rb
CHANGED
data/lib/fino/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fino-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Egor Iskrenkov
|
|
@@ -15,14 +15,14 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - "~>"
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: 1.
|
|
18
|
+
version: 1.5.0
|
|
19
19
|
type: :runtime
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
23
|
- - "~>"
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: 1.
|
|
25
|
+
version: 1.5.0
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: rails
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -49,11 +49,13 @@ files:
|
|
|
49
49
|
- lib/fino/rails.rb
|
|
50
50
|
- lib/fino/rails/app/assets/stylesheets/fino.css
|
|
51
51
|
- lib/fino/rails/app/controllers/fino/rails/application_controller.rb
|
|
52
|
+
- lib/fino/rails/app/controllers/fino/rails/archive_controller.rb
|
|
52
53
|
- lib/fino/rails/app/controllers/fino/rails/dashboard_controller.rb
|
|
53
54
|
- lib/fino/rails/app/controllers/fino/rails/sections_controller.rb
|
|
54
55
|
- lib/fino/rails/app/controllers/fino/rails/settings_controller.rb
|
|
55
56
|
- lib/fino/rails/app/helpers/fino/rails/application_helper.rb
|
|
56
57
|
- lib/fino/rails/app/helpers/fino/rails/settings_helper.rb
|
|
58
|
+
- lib/fino/rails/app/views/fino/rails/archive/index.html.erb
|
|
57
59
|
- lib/fino/rails/app/views/fino/rails/common/_flash.html.erb
|
|
58
60
|
- lib/fino/rails/app/views/fino/rails/common/_sidebar.html.erb
|
|
59
61
|
- lib/fino/rails/app/views/fino/rails/common/_topbar.html.erb
|
|
@@ -69,6 +71,9 @@ files:
|
|
|
69
71
|
- lib/fino/rails/app/views/layouts/fino/rails/application.html.erb
|
|
70
72
|
- lib/fino/rails/config/routes.rb
|
|
71
73
|
- lib/fino/rails/engine.rb
|
|
74
|
+
- lib/fino/rails/generators/install/USAGE
|
|
75
|
+
- lib/fino/rails/generators/install/install_generator.rb
|
|
76
|
+
- lib/fino/rails/generators/install/templates/fino.rb.tt
|
|
72
77
|
- lib/fino/rails/instrumentation/log_subscriber.rb
|
|
73
78
|
- lib/fino/rails/instrumentation/pipe.rb
|
|
74
79
|
- lib/fino/rails/preloading/middleware.rb
|