tina4ruby 3.11.17 → 3.11.19
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/tina4/background.rb +81 -0
- data/lib/tina4/dev_admin.rb +106 -0
- data/lib/tina4/docs.rb +636 -0
- data/lib/tina4/mcp.rb +15 -0
- data/lib/tina4/public/js/tina4-dev-admin.js +260 -111
- data/lib/tina4/public/js/tina4-dev-admin.min.js +260 -111
- data/lib/tina4/rack_app.rb +46 -1
- data/lib/tina4/response.rb +3 -0
- data/lib/tina4/shutdown.rb +10 -0
- data/lib/tina4/version.rb +1 -1
- data/lib/tina4.rb +12 -0
- metadata +3 -1
data/lib/tina4/rack_app.rb
CHANGED
|
@@ -714,10 +714,55 @@ module Tina4
|
|
|
714
714
|
<span style="color:#ffeb3b;">req:#{request_id}</span>
|
|
715
715
|
<span style="color:#90caf9;">#{route_count} routes</span>
|
|
716
716
|
<span style="color:#888;">Ruby #{RUBY_VERSION}</span>
|
|
717
|
-
<a href="#" onclick="
|
|
717
|
+
<a href="#" onclick="window.__tina4ToggleOverlay(event)" style="color:#ef9a9a;margin-left:auto;text-decoration:none;cursor:pointer;">Dashboard ↗</a>
|
|
718
718
|
<span onclick="this.parentElement.style.display='none'" style="cursor:pointer;color:#888;margin-left:8px;">✕</span>
|
|
719
719
|
</div>
|
|
720
720
|
<script>
|
|
721
|
+
// Overlay open/toggle helper + auto-restore. Persist the dev-admin
|
|
722
|
+
// iframe's open/closed state across parent reloads so saving a
|
|
723
|
+
// file doesn't lose the user's dev-admin context. Cross-framework
|
|
724
|
+
// parity with PHP / Python / Node — same localStorage key.
|
|
725
|
+
(function(){
|
|
726
|
+
var STATE_KEY = 'tina4_dev_overlay_open';
|
|
727
|
+
function buildOverlay() {
|
|
728
|
+
var c = document.createElement('div');
|
|
729
|
+
c.id = 'tina4-dev-panel';
|
|
730
|
+
c.style.cssText = 'position:fixed;top:3rem;left:0;right:0;bottom:2rem;z-index:99998;transition:all 0.2s';
|
|
731
|
+
var f = document.createElement('iframe');
|
|
732
|
+
f.src = '/__dev';
|
|
733
|
+
f.style.cssText = 'width:100%;height:100%;border:1px solid #CC342D;border-radius:0.5rem;box-shadow:0 8px 32px rgba(0,0,0,0.5);background:#0f172a';
|
|
734
|
+
c.appendChild(f);
|
|
735
|
+
document.body.appendChild(c);
|
|
736
|
+
return c;
|
|
737
|
+
}
|
|
738
|
+
window.__tina4ToggleOverlay = function(e) {
|
|
739
|
+
if (e) e.preventDefault();
|
|
740
|
+
var p = document.getElementById('tina4-dev-panel');
|
|
741
|
+
if (p) {
|
|
742
|
+
var hide = p.style.display !== 'none';
|
|
743
|
+
p.style.display = hide ? 'none' : 'block';
|
|
744
|
+
try { localStorage.setItem(STATE_KEY, hide ? '0' : '1'); } catch (_) {}
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
buildOverlay();
|
|
748
|
+
try { localStorage.setItem(STATE_KEY, '1'); } catch (_) {}
|
|
749
|
+
};
|
|
750
|
+
function restoreIfOpen() {
|
|
751
|
+
try {
|
|
752
|
+
if (location.pathname.indexOf('/__dev') === 0) return;
|
|
753
|
+
if (localStorage.getItem(STATE_KEY) === '1' && !document.getElementById('tina4-dev-panel')) {
|
|
754
|
+
buildOverlay();
|
|
755
|
+
}
|
|
756
|
+
} catch (_) {}
|
|
757
|
+
}
|
|
758
|
+
if (document.readyState === 'loading') {
|
|
759
|
+
document.addEventListener('DOMContentLoaded', restoreIfOpen);
|
|
760
|
+
} else {
|
|
761
|
+
restoreIfOpen();
|
|
762
|
+
}
|
|
763
|
+
})();
|
|
764
|
+
</script>
|
|
765
|
+
<script>
|
|
721
766
|
function tina4VersionModal(){
|
|
722
767
|
var m=document.getElementById('tina4-ver-modal');
|
|
723
768
|
if(m.style.display==='block'){m.style.display='none';return;}
|
data/lib/tina4/response.rb
CHANGED
|
@@ -151,6 +151,9 @@ module Tina4
|
|
|
151
151
|
self
|
|
152
152
|
end
|
|
153
153
|
|
|
154
|
+
# Render a Frond/Twig template file with data and return self. Tries
|
|
155
|
+
# the user template directory first, falling back to the framework's
|
|
156
|
+
# built-in templates. Sets the response body to the rendered HTML.
|
|
154
157
|
def render(template_path, data = {}, status: 200, template_dir: nil)
|
|
155
158
|
@status_code = status
|
|
156
159
|
@headers["content-type"] = HTML_CONTENT_TYPE
|
data/lib/tina4/shutdown.rb
CHANGED
|
@@ -53,6 +53,16 @@ module Tina4
|
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
+
# Stop background tasks
|
|
57
|
+
if defined?(Tina4::Background)
|
|
58
|
+
begin
|
|
59
|
+
Tina4::Background.stop_all
|
|
60
|
+
Tina4::Log.info("Background tasks stopped")
|
|
61
|
+
rescue => e
|
|
62
|
+
Tina4::Log.error("Error stopping background tasks: #{e.message}")
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
56
66
|
# Close database connections
|
|
57
67
|
if Tina4.database
|
|
58
68
|
begin
|
data/lib/tina4/version.rb
CHANGED
data/lib/tina4.rb
CHANGED
|
@@ -35,6 +35,7 @@ require_relative "tina4/cors"
|
|
|
35
35
|
require_relative "tina4/rate_limiter"
|
|
36
36
|
require_relative "tina4/health"
|
|
37
37
|
require_relative "tina4/shutdown"
|
|
38
|
+
require_relative "tina4/background"
|
|
38
39
|
require_relative "tina4/localization"
|
|
39
40
|
require_relative "tina4/container"
|
|
40
41
|
require_relative "tina4/queue"
|
|
@@ -52,6 +53,7 @@ require_relative "tina4/response_cache"
|
|
|
52
53
|
require_relative "tina4/html_element"
|
|
53
54
|
require_relative "tina4/error_overlay"
|
|
54
55
|
require_relative "tina4/test_client"
|
|
56
|
+
require_relative "tina4/docs"
|
|
55
57
|
require_relative "tina4/mcp"
|
|
56
58
|
|
|
57
59
|
module Tina4
|
|
@@ -385,6 +387,16 @@ module Tina4
|
|
|
385
387
|
Tina4::ServiceRunner.register(name, nil, options, &block)
|
|
386
388
|
end
|
|
387
389
|
|
|
390
|
+
# Register a periodic background task.
|
|
391
|
+
# Mirrors Python's tina4_python.core.server.background(fn, interval) and
|
|
392
|
+
# PHP's $app->background($callback, $interval).
|
|
393
|
+
#
|
|
394
|
+
# Tina4.background(interval: 5.0) { drain_queue }
|
|
395
|
+
# Tina4.background(method(:health_check), interval: 30.0)
|
|
396
|
+
def background(callback = nil, interval: 1.0, &block)
|
|
397
|
+
Tina4::Background.register(callback, interval: interval, &block)
|
|
398
|
+
end
|
|
399
|
+
|
|
388
400
|
# DI container shortcuts
|
|
389
401
|
def register(name, instance = nil, &block)
|
|
390
402
|
Tina4::Container.register(name, instance, &block)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tina4ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.11.
|
|
4
|
+
version: 3.11.19
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Tina4 Team
|
|
@@ -281,6 +281,7 @@ files:
|
|
|
281
281
|
- lib/tina4/api.rb
|
|
282
282
|
- lib/tina4/auth.rb
|
|
283
283
|
- lib/tina4/auto_crud.rb
|
|
284
|
+
- lib/tina4/background.rb
|
|
284
285
|
- lib/tina4/cache.rb
|
|
285
286
|
- lib/tina4/cli.rb
|
|
286
287
|
- lib/tina4/constants.rb
|
|
@@ -294,6 +295,7 @@ files:
|
|
|
294
295
|
- lib/tina4/dev.rb
|
|
295
296
|
- lib/tina4/dev_admin.rb
|
|
296
297
|
- lib/tina4/dev_mailbox.rb
|
|
298
|
+
- lib/tina4/docs.rb
|
|
297
299
|
- lib/tina4/drivers/firebird_driver.rb
|
|
298
300
|
- lib/tina4/drivers/mongodb_driver.rb
|
|
299
301
|
- lib/tina4/drivers/mssql_driver.rb
|