tina4ruby 0.4.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.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +80 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +768 -0
  5. data/exe/tina4 +4 -0
  6. data/lib/tina4/api.rb +152 -0
  7. data/lib/tina4/auth.rb +139 -0
  8. data/lib/tina4/cli.rb +349 -0
  9. data/lib/tina4/crud.rb +124 -0
  10. data/lib/tina4/database.rb +135 -0
  11. data/lib/tina4/database_result.rb +89 -0
  12. data/lib/tina4/debug.rb +83 -0
  13. data/lib/tina4/dev.rb +15 -0
  14. data/lib/tina4/dev_reload.rb +68 -0
  15. data/lib/tina4/drivers/firebird_driver.rb +94 -0
  16. data/lib/tina4/drivers/mssql_driver.rb +112 -0
  17. data/lib/tina4/drivers/mysql_driver.rb +90 -0
  18. data/lib/tina4/drivers/postgres_driver.rb +99 -0
  19. data/lib/tina4/drivers/sqlite_driver.rb +85 -0
  20. data/lib/tina4/env.rb +55 -0
  21. data/lib/tina4/field_types.rb +84 -0
  22. data/lib/tina4/graphql.rb +837 -0
  23. data/lib/tina4/localization.rb +100 -0
  24. data/lib/tina4/middleware.rb +59 -0
  25. data/lib/tina4/migration.rb +124 -0
  26. data/lib/tina4/orm.rb +168 -0
  27. data/lib/tina4/public/css/tina4.css +2286 -0
  28. data/lib/tina4/public/css/tina4.min.css +2 -0
  29. data/lib/tina4/public/js/tina4.js +134 -0
  30. data/lib/tina4/public/js/tina4helper.js +387 -0
  31. data/lib/tina4/queue.rb +117 -0
  32. data/lib/tina4/queue_backends/kafka_backend.rb +80 -0
  33. data/lib/tina4/queue_backends/lite_backend.rb +79 -0
  34. data/lib/tina4/queue_backends/rabbitmq_backend.rb +73 -0
  35. data/lib/tina4/rack_app.rb +150 -0
  36. data/lib/tina4/request.rb +158 -0
  37. data/lib/tina4/response.rb +172 -0
  38. data/lib/tina4/router.rb +148 -0
  39. data/lib/tina4/scss/tina4css/_alerts.scss +34 -0
  40. data/lib/tina4/scss/tina4css/_badges.scss +22 -0
  41. data/lib/tina4/scss/tina4css/_buttons.scss +69 -0
  42. data/lib/tina4/scss/tina4css/_cards.scss +49 -0
  43. data/lib/tina4/scss/tina4css/_forms.scss +156 -0
  44. data/lib/tina4/scss/tina4css/_grid.scss +81 -0
  45. data/lib/tina4/scss/tina4css/_modals.scss +84 -0
  46. data/lib/tina4/scss/tina4css/_nav.scss +149 -0
  47. data/lib/tina4/scss/tina4css/_reset.scss +94 -0
  48. data/lib/tina4/scss/tina4css/_tables.scss +54 -0
  49. data/lib/tina4/scss/tina4css/_typography.scss +55 -0
  50. data/lib/tina4/scss/tina4css/_utilities.scss +197 -0
  51. data/lib/tina4/scss/tina4css/_variables.scss +117 -0
  52. data/lib/tina4/scss/tina4css/base.scss +1 -0
  53. data/lib/tina4/scss/tina4css/colors.scss +48 -0
  54. data/lib/tina4/scss/tina4css/tina4.scss +17 -0
  55. data/lib/tina4/scss_compiler.rb +131 -0
  56. data/lib/tina4/seeder.rb +529 -0
  57. data/lib/tina4/session.rb +145 -0
  58. data/lib/tina4/session_handlers/file_handler.rb +55 -0
  59. data/lib/tina4/session_handlers/mongo_handler.rb +49 -0
  60. data/lib/tina4/session_handlers/redis_handler.rb +43 -0
  61. data/lib/tina4/swagger.rb +123 -0
  62. data/lib/tina4/template.rb +478 -0
  63. data/lib/tina4/templates/base.twig +26 -0
  64. data/lib/tina4/templates/errors/403.twig +22 -0
  65. data/lib/tina4/templates/errors/404.twig +22 -0
  66. data/lib/tina4/templates/errors/500.twig +22 -0
  67. data/lib/tina4/testing.rb +213 -0
  68. data/lib/tina4/version.rb +5 -0
  69. data/lib/tina4/webserver.rb +101 -0
  70. data/lib/tina4/websocket.rb +167 -0
  71. data/lib/tina4/wsdl.rb +164 -0
  72. data/lib/tina4.rb +259 -0
  73. data/lib/tina4ruby.rb +4 -0
  74. metadata +324 -0
data/lib/tina4.rb ADDED
@@ -0,0 +1,259 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ── Core (always loaded) ──────────────────────────────────────────────
4
+ require_relative "tina4/version"
5
+ require_relative "tina4/debug"
6
+ require_relative "tina4/env"
7
+ require_relative "tina4/router"
8
+ require_relative "tina4/request"
9
+ require_relative "tina4/response"
10
+ require_relative "tina4/rack_app"
11
+ require_relative "tina4/database"
12
+ require_relative "tina4/database_result"
13
+ require_relative "tina4/field_types"
14
+ require_relative "tina4/orm"
15
+ require_relative "tina4/migration"
16
+ require_relative "tina4/template"
17
+ require_relative "tina4/auth"
18
+ require_relative "tina4/session"
19
+ require_relative "tina4/middleware"
20
+ require_relative "tina4/localization"
21
+ require_relative "tina4/queue"
22
+
23
+ module Tina4
24
+ # ── Lazy-loaded: database drivers ─────────────────────────────────────
25
+ module Drivers
26
+ autoload :SqliteDriver, File.expand_path("tina4/drivers/sqlite_driver", __dir__)
27
+ autoload :PostgresDriver, File.expand_path("tina4/drivers/postgres_driver", __dir__)
28
+ autoload :MysqlDriver, File.expand_path("tina4/drivers/mysql_driver", __dir__)
29
+ autoload :MssqlDriver, File.expand_path("tina4/drivers/mssql_driver", __dir__)
30
+ autoload :FirebirdDriver, File.expand_path("tina4/drivers/firebird_driver", __dir__)
31
+ end
32
+
33
+ # ── Lazy-loaded: session handlers ─────────────────────────────────────
34
+ module SessionHandlers
35
+ autoload :FileHandler, File.expand_path("tina4/session_handlers/file_handler", __dir__)
36
+ autoload :RedisHandler, File.expand_path("tina4/session_handlers/redis_handler", __dir__)
37
+ autoload :MongoHandler, File.expand_path("tina4/session_handlers/mongo_handler", __dir__)
38
+ end
39
+
40
+ # ── Lazy-loaded: queue backends ───────────────────────────────────────
41
+ module QueueBackends
42
+ autoload :LiteBackend, File.expand_path("tina4/queue_backends/lite_backend", __dir__)
43
+ autoload :RabbitmqBackend, File.expand_path("tina4/queue_backends/rabbitmq_backend", __dir__)
44
+ autoload :KafkaBackend, File.expand_path("tina4/queue_backends/kafka_backend", __dir__)
45
+ end
46
+
47
+ # ── Lazy-loaded: web server ───────────────────────────────────────────
48
+ autoload :WebServer, File.expand_path("tina4/webserver", __dir__)
49
+
50
+ # ── Lazy-loaded: optional modules ─────────────────────────────────────
51
+ autoload :Swagger, File.expand_path("tina4/swagger", __dir__)
52
+ autoload :Crud, File.expand_path("tina4/crud", __dir__)
53
+ autoload :API, File.expand_path("tina4/api", __dir__)
54
+ autoload :APIResponse, File.expand_path("tina4/api", __dir__)
55
+ autoload :GraphQLType, File.expand_path("tina4/graphql", __dir__)
56
+ autoload :GraphQLSchema, File.expand_path("tina4/graphql", __dir__)
57
+ autoload :GraphQLParser, File.expand_path("tina4/graphql", __dir__)
58
+ autoload :GraphQLExecutor, File.expand_path("tina4/graphql", __dir__)
59
+ autoload :GraphQLError, File.expand_path("tina4/graphql", __dir__)
60
+ autoload :GraphQL, File.expand_path("tina4/graphql", __dir__)
61
+ autoload :WebSocket, File.expand_path("tina4/websocket", __dir__)
62
+ autoload :WebSocketConnection, File.expand_path("tina4/websocket", __dir__)
63
+ autoload :Testing, File.expand_path("tina4/testing", __dir__)
64
+ autoload :ScssCompiler, File.expand_path("tina4/scss_compiler", __dir__)
65
+ autoload :DevReload, File.expand_path("tina4/dev_reload", __dir__)
66
+ autoload :FakeData, File.expand_path("tina4/seeder", __dir__)
67
+ autoload :Seeder, File.expand_path("tina4/seeder", __dir__)
68
+ autoload :WSDL, File.expand_path("tina4/wsdl", __dir__)
69
+ BANNER = <<~'BANNER'
70
+
71
+ ████████╗██╗███╗ ██╗ █████╗ ██╗ ██╗
72
+ ╚══██╔══╝██║████╗ ██║██╔══██╗██║ ██║
73
+ ██║ ██║██╔██╗ ██║███████║███████║
74
+ ██║ ██║██║╚██╗██║██╔══██║╚════██║
75
+ ██║ ██║██║ ╚████║██║ ██║ ██║
76
+ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═╝
77
+ BANNER
78
+
79
+ class << self
80
+ attr_accessor :root_dir, :database
81
+
82
+ def print_banner
83
+ puts "\e[35m#{BANNER}\e[0m"
84
+ puts " \e[35mTina4 Ruby v#{VERSION} - This is not a framework\e[0m"
85
+ puts ""
86
+ rescue
87
+ puts "\e[35mTINA4 Ruby v#{VERSION}\e[0m"
88
+ end
89
+
90
+ def initialize!(root_dir = Dir.pwd)
91
+ @root_dir = root_dir
92
+
93
+ # Print banner
94
+ print_banner
95
+
96
+ # Load environment
97
+ Tina4::Env.load(root_dir)
98
+
99
+ # Setup debug logging
100
+ Tina4::Debug.setup(root_dir)
101
+ Tina4::Debug.info("Tina4 Ruby v#{VERSION} initializing...")
102
+
103
+ # Setup auth keys
104
+ Tina4::Auth.setup(root_dir)
105
+
106
+ # Load translations
107
+ Tina4::Localization.load(root_dir)
108
+
109
+ # Connect database if configured
110
+ setup_database
111
+
112
+ # Auto-discover routes
113
+ auto_discover(root_dir)
114
+
115
+ Tina4::Debug.info("Tina4 initialized successfully")
116
+ end
117
+
118
+ # DSL methods for route registration
119
+ # GET is public by default (matching tina4_python behavior)
120
+ # POST/PUT/PATCH/DELETE are secured by default — use auth: false to make public
121
+ def get(path, auth: nil, swagger_meta: {}, &block)
122
+ auth_handler = auth == false ? nil : auth
123
+ Tina4::Router.add_route("GET", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
124
+ end
125
+
126
+ def post(path, auth: :default, swagger_meta: {}, &block)
127
+ auth_handler = resolve_auth(auth)
128
+ Tina4::Router.add_route("POST", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
129
+ end
130
+
131
+ def put(path, auth: :default, swagger_meta: {}, &block)
132
+ auth_handler = resolve_auth(auth)
133
+ Tina4::Router.add_route("PUT", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
134
+ end
135
+
136
+ def patch(path, auth: :default, swagger_meta: {}, &block)
137
+ auth_handler = resolve_auth(auth)
138
+ Tina4::Router.add_route("PATCH", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
139
+ end
140
+
141
+ def delete(path, auth: :default, swagger_meta: {}, &block)
142
+ auth_handler = resolve_auth(auth)
143
+ Tina4::Router.add_route("DELETE", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
144
+ end
145
+
146
+ def any(path, auth: false, swagger_meta: {}, &block)
147
+ auth_handler = resolve_auth(auth)
148
+ %w[GET POST PUT PATCH DELETE].each do |method|
149
+ Tina4::Router.add_route(method, path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
150
+ end
151
+ end
152
+
153
+ def options(path, &block)
154
+ Tina4::Router.add_route("OPTIONS", path, block)
155
+ end
156
+
157
+ # Explicit secure variants (always secured, regardless of HTTP method)
158
+ def secure_get(path, auth: nil, swagger_meta: {}, &block)
159
+ auth_handler = auth || Tina4::Auth.default_secure_auth
160
+ Tina4::Router.add_route("GET", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
161
+ end
162
+
163
+ def secure_post(path, auth: nil, swagger_meta: {}, &block)
164
+ auth_handler = auth || Tina4::Auth.default_secure_auth
165
+ Tina4::Router.add_route("POST", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
166
+ end
167
+
168
+ def secure_put(path, auth: nil, swagger_meta: {}, &block)
169
+ auth_handler = auth || Tina4::Auth.default_secure_auth
170
+ Tina4::Router.add_route("PUT", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
171
+ end
172
+
173
+ def secure_patch(path, auth: nil, swagger_meta: {}, &block)
174
+ auth_handler = auth || Tina4::Auth.default_secure_auth
175
+ Tina4::Router.add_route("PATCH", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
176
+ end
177
+
178
+ def secure_delete(path, auth: nil, swagger_meta: {}, &block)
179
+ auth_handler = auth || Tina4::Auth.default_secure_auth
180
+ Tina4::Router.add_route("DELETE", path, block, auth_handler: auth_handler, swagger_meta: swagger_meta)
181
+ end
182
+
183
+ # Route groups
184
+ def group(prefix, auth: nil, &block)
185
+ Tina4::Router.group(prefix, auth_handler: auth, &block)
186
+ end
187
+
188
+ # Middleware hooks
189
+ def before(pattern = nil, &block)
190
+ Tina4::Middleware.before(pattern, &block)
191
+ end
192
+
193
+ def after(pattern = nil, &block)
194
+ Tina4::Middleware.after(pattern, &block)
195
+ end
196
+
197
+ # Template globals
198
+ def template_global(key, value)
199
+ Tina4::Template.add_global(key, value)
200
+ end
201
+
202
+ # Inline test DSL
203
+ def describe(name, &block)
204
+ Tina4::Testing.describe(name, &block)
205
+ end
206
+
207
+ # Translation shortcut
208
+ def t(key, **options)
209
+ Tina4::Localization.t(key, **options)
210
+ end
211
+
212
+ private
213
+
214
+ # Resolve auth option for route registration
215
+ # :default => use bearer auth (default for POST/PUT/PATCH/DELETE)
216
+ # false => no auth (public route)
217
+ # nil => no auth
218
+ # Proc/Lambda => custom auth handler
219
+ def resolve_auth(auth)
220
+ case auth
221
+ when :default
222
+ Tina4::Auth.default_secure_auth
223
+ when false, nil
224
+ nil
225
+ else
226
+ auth # Custom auth handler (proc/lambda)
227
+ end
228
+ end
229
+
230
+ def setup_database
231
+ db_url = ENV["DATABASE_URL"] || ENV["DB_URL"]
232
+ if db_url && !db_url.empty?
233
+ begin
234
+ @database = Tina4::Database.new(db_url)
235
+ Tina4::Debug.info("Database connected: #{db_url.sub(/:[^:@]+@/, ':***@')}")
236
+ rescue => e
237
+ Tina4::Debug.error("Database connection failed: #{e.message}")
238
+ end
239
+ end
240
+ end
241
+
242
+ def auto_discover(root_dir)
243
+ route_dirs = %w[routes src/routes src/api api]
244
+ route_dirs.each do |dir|
245
+ full_dir = File.join(root_dir, dir)
246
+ next unless Dir.exist?(full_dir)
247
+
248
+ Dir.glob(File.join(full_dir, "**/*.rb")).sort.each do |file|
249
+ begin
250
+ load file
251
+ Tina4::Debug.debug("Auto-loaded: #{file}")
252
+ rescue => e
253
+ Tina4::Debug.error("Failed to load #{file}: #{e.message}")
254
+ end
255
+ end
256
+ end
257
+ end
258
+ end
259
+ end
data/lib/tina4ruby.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Alias: `require "tina4ruby"` loads the same code as `require "tina4"`
4
+ require_relative "tina4"
metadata ADDED
@@ -0,0 +1,324 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tina4ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - Tina4 Team
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rack
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '3.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '3.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rackup
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.1'
40
+ - !ruby/object:Gem::Dependency
41
+ name: puma
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '6.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '6.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: dotenv
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: jwt
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.7'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.7'
82
+ - !ruby/object:Gem::Dependency
83
+ name: bcrypt
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.1'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.1'
96
+ - !ruby/object:Gem::Dependency
97
+ name: thor
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.3'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.3'
110
+ - !ruby/object:Gem::Dependency
111
+ name: json
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '2.7'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '2.7'
124
+ - !ruby/object:Gem::Dependency
125
+ name: webrick
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.8'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.8'
138
+ - !ruby/object:Gem::Dependency
139
+ name: listen
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.8'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.8'
152
+ - !ruby/object:Gem::Dependency
153
+ name: sqlite3
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '2.0'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '2.0'
166
+ - !ruby/object:Gem::Dependency
167
+ name: pg
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1.5'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '1.5'
180
+ - !ruby/object:Gem::Dependency
181
+ name: rake
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '13.0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '13.0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: rspec
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '3.12'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '3.12'
208
+ - !ruby/object:Gem::Dependency
209
+ name: rubocop
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '1.50'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1.50'
222
+ description: A lightweight, zero-configuration, Windows-friendly Ruby web framework.
223
+ email:
224
+ - info@tina4.com
225
+ executables:
226
+ - tina4
227
+ extensions: []
228
+ extra_rdoc_files: []
229
+ files:
230
+ - CHANGELOG.md
231
+ - LICENSE.txt
232
+ - README.md
233
+ - exe/tina4
234
+ - lib/tina4.rb
235
+ - lib/tina4/api.rb
236
+ - lib/tina4/auth.rb
237
+ - lib/tina4/cli.rb
238
+ - lib/tina4/crud.rb
239
+ - lib/tina4/database.rb
240
+ - lib/tina4/database_result.rb
241
+ - lib/tina4/debug.rb
242
+ - lib/tina4/dev.rb
243
+ - lib/tina4/dev_reload.rb
244
+ - lib/tina4/drivers/firebird_driver.rb
245
+ - lib/tina4/drivers/mssql_driver.rb
246
+ - lib/tina4/drivers/mysql_driver.rb
247
+ - lib/tina4/drivers/postgres_driver.rb
248
+ - lib/tina4/drivers/sqlite_driver.rb
249
+ - lib/tina4/env.rb
250
+ - lib/tina4/field_types.rb
251
+ - lib/tina4/graphql.rb
252
+ - lib/tina4/localization.rb
253
+ - lib/tina4/middleware.rb
254
+ - lib/tina4/migration.rb
255
+ - lib/tina4/orm.rb
256
+ - lib/tina4/public/css/tina4.css
257
+ - lib/tina4/public/css/tina4.min.css
258
+ - lib/tina4/public/js/tina4.js
259
+ - lib/tina4/public/js/tina4helper.js
260
+ - lib/tina4/queue.rb
261
+ - lib/tina4/queue_backends/kafka_backend.rb
262
+ - lib/tina4/queue_backends/lite_backend.rb
263
+ - lib/tina4/queue_backends/rabbitmq_backend.rb
264
+ - lib/tina4/rack_app.rb
265
+ - lib/tina4/request.rb
266
+ - lib/tina4/response.rb
267
+ - lib/tina4/router.rb
268
+ - lib/tina4/scss/tina4css/_alerts.scss
269
+ - lib/tina4/scss/tina4css/_badges.scss
270
+ - lib/tina4/scss/tina4css/_buttons.scss
271
+ - lib/tina4/scss/tina4css/_cards.scss
272
+ - lib/tina4/scss/tina4css/_forms.scss
273
+ - lib/tina4/scss/tina4css/_grid.scss
274
+ - lib/tina4/scss/tina4css/_modals.scss
275
+ - lib/tina4/scss/tina4css/_nav.scss
276
+ - lib/tina4/scss/tina4css/_reset.scss
277
+ - lib/tina4/scss/tina4css/_tables.scss
278
+ - lib/tina4/scss/tina4css/_typography.scss
279
+ - lib/tina4/scss/tina4css/_utilities.scss
280
+ - lib/tina4/scss/tina4css/_variables.scss
281
+ - lib/tina4/scss/tina4css/base.scss
282
+ - lib/tina4/scss/tina4css/colors.scss
283
+ - lib/tina4/scss/tina4css/tina4.scss
284
+ - lib/tina4/scss_compiler.rb
285
+ - lib/tina4/seeder.rb
286
+ - lib/tina4/session.rb
287
+ - lib/tina4/session_handlers/file_handler.rb
288
+ - lib/tina4/session_handlers/mongo_handler.rb
289
+ - lib/tina4/session_handlers/redis_handler.rb
290
+ - lib/tina4/swagger.rb
291
+ - lib/tina4/template.rb
292
+ - lib/tina4/templates/base.twig
293
+ - lib/tina4/templates/errors/403.twig
294
+ - lib/tina4/templates/errors/404.twig
295
+ - lib/tina4/templates/errors/500.twig
296
+ - lib/tina4/testing.rb
297
+ - lib/tina4/version.rb
298
+ - lib/tina4/webserver.rb
299
+ - lib/tina4/websocket.rb
300
+ - lib/tina4/wsdl.rb
301
+ - lib/tina4ruby.rb
302
+ homepage: https://tina4.com
303
+ licenses:
304
+ - MIT
305
+ metadata:
306
+ homepage_uri: https://tina4.com
307
+ rdoc_options: []
308
+ require_paths:
309
+ - lib
310
+ required_ruby_version: !ruby/object:Gem::Requirement
311
+ requirements:
312
+ - - ">="
313
+ - !ruby/object:Gem::Version
314
+ version: 3.1.0
315
+ required_rubygems_version: !ruby/object:Gem::Requirement
316
+ requirements:
317
+ - - ">="
318
+ - !ruby/object:Gem::Version
319
+ version: '0'
320
+ requirements: []
321
+ rubygems_version: 4.0.3
322
+ specification_version: 4
323
+ summary: Simple. Fast. Human. This is not a framework.
324
+ test_files: []