tarsier 0.1.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 +7 -0
- data/CHANGELOG.md +175 -0
- data/LICENSE.txt +21 -0
- data/README.md +984 -0
- data/exe/tarsier +7 -0
- data/lib/tarsier/application.rb +336 -0
- data/lib/tarsier/cli/commands/console.rb +87 -0
- data/lib/tarsier/cli/commands/generate.rb +85 -0
- data/lib/tarsier/cli/commands/help.rb +50 -0
- data/lib/tarsier/cli/commands/new.rb +59 -0
- data/lib/tarsier/cli/commands/routes.rb +139 -0
- data/lib/tarsier/cli/commands/server.rb +123 -0
- data/lib/tarsier/cli/commands/version.rb +14 -0
- data/lib/tarsier/cli/generators/app.rb +528 -0
- data/lib/tarsier/cli/generators/base.rb +93 -0
- data/lib/tarsier/cli/generators/controller.rb +91 -0
- data/lib/tarsier/cli/generators/middleware.rb +81 -0
- data/lib/tarsier/cli/generators/migration.rb +109 -0
- data/lib/tarsier/cli/generators/model.rb +109 -0
- data/lib/tarsier/cli/generators/resource.rb +27 -0
- data/lib/tarsier/cli/loader.rb +18 -0
- data/lib/tarsier/cli.rb +46 -0
- data/lib/tarsier/controller.rb +282 -0
- data/lib/tarsier/database.rb +588 -0
- data/lib/tarsier/errors.rb +77 -0
- data/lib/tarsier/middleware/base.rb +47 -0
- data/lib/tarsier/middleware/compression.rb +113 -0
- data/lib/tarsier/middleware/cors.rb +101 -0
- data/lib/tarsier/middleware/csrf.rb +88 -0
- data/lib/tarsier/middleware/logger.rb +74 -0
- data/lib/tarsier/middleware/rate_limit.rb +110 -0
- data/lib/tarsier/middleware/stack.rb +143 -0
- data/lib/tarsier/middleware/static.rb +124 -0
- data/lib/tarsier/model.rb +590 -0
- data/lib/tarsier/params.rb +269 -0
- data/lib/tarsier/query.rb +495 -0
- data/lib/tarsier/request.rb +274 -0
- data/lib/tarsier/response.rb +282 -0
- data/lib/tarsier/router/compiler.rb +173 -0
- data/lib/tarsier/router/node.rb +97 -0
- data/lib/tarsier/router/route.rb +119 -0
- data/lib/tarsier/router.rb +272 -0
- data/lib/tarsier/version.rb +5 -0
- data/lib/tarsier/websocket.rb +275 -0
- data/lib/tarsier.rb +167 -0
- data/sig/tarsier.rbs +485 -0
- metadata +230 -0
data/sig/tarsier.rbs
ADDED
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
# Type signatures for Tarsier framework
|
|
2
|
+
|
|
3
|
+
module Tarsier
|
|
4
|
+
VERSION: String
|
|
5
|
+
|
|
6
|
+
def self.app: -> Application?
|
|
7
|
+
def self.app=: (Application) -> Application
|
|
8
|
+
def self.application: () { (Application) -> void } -> Application
|
|
9
|
+
def self.routes: () { (Router) -> void } -> void
|
|
10
|
+
def self.router: -> Router?
|
|
11
|
+
def self.env: -> String
|
|
12
|
+
def self.development?: -> bool
|
|
13
|
+
def self.production?: -> bool
|
|
14
|
+
def self.test?: -> bool
|
|
15
|
+
|
|
16
|
+
class Error < StandardError
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class RouteNotFoundError < Error
|
|
20
|
+
attr_reader method: Symbol
|
|
21
|
+
attr_reader path: String
|
|
22
|
+
def initialize: (Symbol, String) -> void
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class InvalidRouteError < Error
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class ValidationError < Error
|
|
29
|
+
attr_reader errors: Hash[Symbol, Array[String]]
|
|
30
|
+
def initialize: (Hash[Symbol, Array[String]]) -> void
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class MissingParameterError < ValidationError
|
|
34
|
+
def initialize: (Symbol) -> void
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class TypeCoercionError < Error
|
|
38
|
+
attr_reader param_name: Symbol
|
|
39
|
+
attr_reader expected_type: Class
|
|
40
|
+
attr_reader actual_value: untyped
|
|
41
|
+
def initialize: (Symbol, Class, untyped) -> void
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class Application
|
|
45
|
+
attr_reader router: Router
|
|
46
|
+
attr_reader middleware_stack: Middleware::Stack
|
|
47
|
+
attr_reader config: Configuration
|
|
48
|
+
|
|
49
|
+
def initialize: -> void
|
|
50
|
+
def configure: () { (Configuration) -> void } -> self
|
|
51
|
+
def routes: () { (Router) -> void } -> self
|
|
52
|
+
def use: (Class, *untyped, **untyped) -> self
|
|
53
|
+
def boot!: -> self
|
|
54
|
+
def booted?: -> bool
|
|
55
|
+
def call: (Hash[String, untyped]) -> [Integer, Hash[String, String], Array[String]]
|
|
56
|
+
def dispatch: (Request, Response) -> Response
|
|
57
|
+
def path_for: (Symbol, ?Hash[Symbol, untyped]) -> String
|
|
58
|
+
def routes_list: -> Array[Router::Route]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
class Configuration
|
|
62
|
+
attr_accessor secret_key: String?
|
|
63
|
+
attr_accessor session_store: Symbol
|
|
64
|
+
attr_accessor log_level: Symbol
|
|
65
|
+
attr_accessor static_files: bool
|
|
66
|
+
attr_accessor default_format: Symbol
|
|
67
|
+
attr_accessor force_ssl: bool
|
|
68
|
+
attr_accessor host: String
|
|
69
|
+
attr_accessor port: Integer
|
|
70
|
+
|
|
71
|
+
def initialize: -> void
|
|
72
|
+
def set: (Hash[Symbol, untyped]) -> void
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class Router
|
|
76
|
+
HTTP_METHODS: Array[Symbol]
|
|
77
|
+
|
|
78
|
+
attr_reader compiler: Router::Compiler
|
|
79
|
+
|
|
80
|
+
def initialize: -> void
|
|
81
|
+
def draw: () { -> void } -> self
|
|
82
|
+
def compile!: -> void
|
|
83
|
+
def match: (Symbol | String, String) -> [Router::Route, Hash[Symbol, String]]?
|
|
84
|
+
def path_for: (Symbol, ?Hash[Symbol, untyped]) -> String
|
|
85
|
+
def routes: -> Array[Router::Route]
|
|
86
|
+
|
|
87
|
+
def get: (String, ?to: untyped, ?as: Symbol?, ?constraints: Hash[Symbol, Regexp], **untyped) -> void
|
|
88
|
+
def post: (String, ?to: untyped, ?as: Symbol?, ?constraints: Hash[Symbol, Regexp], **untyped) -> void
|
|
89
|
+
def put: (String, ?to: untyped, ?as: Symbol?, ?constraints: Hash[Symbol, Regexp], **untyped) -> void
|
|
90
|
+
def patch: (String, ?to: untyped, ?as: Symbol?, ?constraints: Hash[Symbol, Regexp], **untyped) -> void
|
|
91
|
+
def delete: (String, ?to: untyped, ?as: Symbol?, ?constraints: Hash[Symbol, Regexp], **untyped) -> void
|
|
92
|
+
def head: (String, ?to: untyped, ?as: Symbol?, ?constraints: Hash[Symbol, Regexp], **untyped) -> void
|
|
93
|
+
def options: (String, ?to: untyped, ?as: Symbol?, ?constraints: Hash[Symbol, Regexp], **untyped) -> void
|
|
94
|
+
|
|
95
|
+
def resources: (Symbol, ?only: Array[Symbol]?, ?except: Array[Symbol]?, ?controller: Symbol?, **untyped) ?{ -> void } -> void
|
|
96
|
+
def resource: (Symbol, ?only: Array[Symbol]?, ?except: Array[Symbol]?, ?controller: Symbol?, **untyped) ?{ -> void } -> void
|
|
97
|
+
def scope: (?path: String?, ?module: Symbol?, ?as: Symbol?, **untyped) { -> void } -> void
|
|
98
|
+
def namespace: (Symbol, **untyped) { -> void } -> void
|
|
99
|
+
def mount: (untyped, at: String) -> void
|
|
100
|
+
def root: (to: untyped, ?as: Symbol) -> void
|
|
101
|
+
|
|
102
|
+
class Route
|
|
103
|
+
attr_reader method: Symbol
|
|
104
|
+
attr_reader path: String
|
|
105
|
+
attr_reader handler: untyped
|
|
106
|
+
attr_reader name: Symbol?
|
|
107
|
+
attr_reader constraints: Hash[Symbol, Regexp]
|
|
108
|
+
attr_reader middleware: Array[untyped]
|
|
109
|
+
attr_reader options: Hash[Symbol, untyped]
|
|
110
|
+
|
|
111
|
+
def initialize: (method: Symbol, path: String, handler: untyped, ?name: Symbol?, ?constraints: Hash[Symbol, Regexp], ?middleware: Array[untyped], **untyped) -> void
|
|
112
|
+
def segments: -> Array[Hash[Symbol, untyped]]
|
|
113
|
+
def param_names: -> Array[Symbol]
|
|
114
|
+
def dynamic?: -> bool
|
|
115
|
+
def generate: (?Hash[Symbol, untyped]) -> String
|
|
116
|
+
def controller_class: -> Class?
|
|
117
|
+
def action_name: -> Symbol?
|
|
118
|
+
def proc_handler?: -> bool
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
class Node
|
|
122
|
+
STATIC: Symbol
|
|
123
|
+
PARAM: Symbol
|
|
124
|
+
WILDCARD: Symbol
|
|
125
|
+
|
|
126
|
+
attr_reader segment: String
|
|
127
|
+
attr_reader type: Symbol
|
|
128
|
+
attr_reader param_name: Symbol?
|
|
129
|
+
attr_reader constraint: Regexp?
|
|
130
|
+
attr_reader children: Hash[String, Node]
|
|
131
|
+
attr_accessor route: Route?
|
|
132
|
+
attr_accessor priority: Integer
|
|
133
|
+
|
|
134
|
+
def initialize: (?String, ?type: Symbol, ?param_name: Symbol?, ?constraint: Regexp?) -> void
|
|
135
|
+
def add_child: (String, Node) -> Node
|
|
136
|
+
def find_child: (String) -> Node?
|
|
137
|
+
def match?: (String) -> (Hash[Symbol, String] | false)
|
|
138
|
+
def terminal?: -> bool
|
|
139
|
+
def sorted_children: -> Array[Node]
|
|
140
|
+
def invalidate_cache!: -> void
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
class Compiler
|
|
144
|
+
attr_reader trees: Hash[Symbol, Node]
|
|
145
|
+
|
|
146
|
+
def initialize: -> void
|
|
147
|
+
def add: (Route) -> void
|
|
148
|
+
def compile!: -> void
|
|
149
|
+
def compiled?: -> bool
|
|
150
|
+
def match: (Symbol, String) -> [Route, Hash[Symbol, String]]?
|
|
151
|
+
def named_route: (Symbol) -> Route?
|
|
152
|
+
def path_for: (Symbol, ?Hash[Symbol, untyped]) -> String
|
|
153
|
+
def routes: -> Array[Route]
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
class Request
|
|
158
|
+
HTTP_METHODS: Array[String]
|
|
159
|
+
|
|
160
|
+
attr_reader env: Hash[String, untyped]
|
|
161
|
+
attr_reader route_params: Hash[Symbol, String]
|
|
162
|
+
|
|
163
|
+
def initialize: (Hash[String, untyped], ?Hash[Symbol, String]) -> void
|
|
164
|
+
def method: -> Symbol
|
|
165
|
+
def path: -> String
|
|
166
|
+
def url: -> String
|
|
167
|
+
def scheme: -> String
|
|
168
|
+
def host: -> String
|
|
169
|
+
def port: -> Integer
|
|
170
|
+
def query_string: -> String
|
|
171
|
+
def query_params: -> Hash[Symbol, String]
|
|
172
|
+
def params: -> Params
|
|
173
|
+
def body: -> String
|
|
174
|
+
def body_params: -> Hash[Symbol, untyped]
|
|
175
|
+
def headers: -> Hash[String, String]
|
|
176
|
+
def header: (String) -> String?
|
|
177
|
+
def content_type: -> String?
|
|
178
|
+
def content_length: -> Integer?
|
|
179
|
+
def accept: -> String?
|
|
180
|
+
def accepted_types: -> Array[String]
|
|
181
|
+
def accepts?: (String) -> bool
|
|
182
|
+
def cookies: -> Hash[Symbol, String]
|
|
183
|
+
def user_agent: -> String?
|
|
184
|
+
def ip: -> String
|
|
185
|
+
def secure?: -> bool
|
|
186
|
+
def xhr?: -> bool
|
|
187
|
+
def json?: -> bool
|
|
188
|
+
def form?: -> bool
|
|
189
|
+
def get?: -> bool
|
|
190
|
+
def post?: -> bool
|
|
191
|
+
def put?: -> bool
|
|
192
|
+
def patch?: -> bool
|
|
193
|
+
def delete?: -> bool
|
|
194
|
+
def head?: -> bool
|
|
195
|
+
def options?: -> bool
|
|
196
|
+
def safe?: -> bool
|
|
197
|
+
def idempotent?: -> bool
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
class Response
|
|
201
|
+
STATUS_CODES: Hash[Integer, String]
|
|
202
|
+
|
|
203
|
+
attr_reader status: Integer
|
|
204
|
+
attr_reader headers: Hash[String, String]
|
|
205
|
+
attr_accessor body: String?
|
|
206
|
+
|
|
207
|
+
def initialize: (?status: Integer, ?headers: Hash[String, String], ?body: String?) -> void
|
|
208
|
+
def status=: (Integer) -> void
|
|
209
|
+
def set_header: (String, String) -> self
|
|
210
|
+
def []=: (String, String) -> self
|
|
211
|
+
def get_header: (String) -> String?
|
|
212
|
+
def []: (String) -> String?
|
|
213
|
+
def delete_header: (String) -> String?
|
|
214
|
+
def content_type=: (String, ?charset: String?) -> self
|
|
215
|
+
def content_length=: (Integer) -> self
|
|
216
|
+
def write: (String) -> self
|
|
217
|
+
def <<: (String) -> self
|
|
218
|
+
def json: (untyped, ?status: Integer) -> self
|
|
219
|
+
def html: (String, ?status: Integer) -> self
|
|
220
|
+
def text: (String, ?status: Integer) -> self
|
|
221
|
+
def redirect: (String, ?status: Integer) -> self
|
|
222
|
+
def set_cookie: (String, String, **untyped) -> self
|
|
223
|
+
def delete_cookie: (String, **untyped) -> self
|
|
224
|
+
def stream: () { (StreamWriter) -> void } -> self
|
|
225
|
+
def streaming?: -> bool
|
|
226
|
+
def sent?: -> bool
|
|
227
|
+
def mark_sent!: -> void
|
|
228
|
+
def to_rack: -> [Integer, Hash[String, String], Array[String]]
|
|
229
|
+
def finish: -> [Integer, Hash[String, String], Array[String]]
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
class StreamBody
|
|
233
|
+
def initialize: () { (StreamWriter) -> void } -> void
|
|
234
|
+
def each: () { (String) -> void } -> void
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
class StreamWriter
|
|
238
|
+
def initialize: () { (String) -> void } -> void
|
|
239
|
+
def write: (String) -> void
|
|
240
|
+
def <<: (String) -> void
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
class Params
|
|
244
|
+
Boolean: Object
|
|
245
|
+
|
|
246
|
+
attr_reader raw: Hash[Symbol, untyped]
|
|
247
|
+
|
|
248
|
+
def initialize: (?Hash[Symbol, untyped]) -> void
|
|
249
|
+
def []: (Symbol | String) -> untyped
|
|
250
|
+
def key?: (Symbol | String) -> bool
|
|
251
|
+
def has_key?: (Symbol | String) -> bool
|
|
252
|
+
def fetch: (Symbol | String, ?untyped) -> untyped
|
|
253
|
+
def require: (Symbol | String, ?type: Class?) -> untyped
|
|
254
|
+
def optional: (Symbol | String, ?type: Class?, ?default: untyped) -> untyped
|
|
255
|
+
def permit: (*Symbol) -> Hash[Symbol, untyped]
|
|
256
|
+
def slice: (*Symbol) -> Hash[Symbol, untyped]
|
|
257
|
+
def except: (*Symbol) -> Hash[Symbol, untyped]
|
|
258
|
+
def merge: (Hash[Symbol, untyped]) -> Params
|
|
259
|
+
def to_h: -> Hash[Symbol, untyped]
|
|
260
|
+
def to_hash: -> Hash[Symbol, untyped]
|
|
261
|
+
def each: () { ([Symbol, untyped]) -> void } -> void
|
|
262
|
+
def empty?: -> bool
|
|
263
|
+
def size: -> Integer
|
|
264
|
+
def length: -> Integer
|
|
265
|
+
def inspect: -> String
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
class ParamSchema
|
|
269
|
+
attr_reader rules: Hash[Symbol, Hash[Symbol, untyped]]
|
|
270
|
+
|
|
271
|
+
def initialize: -> void
|
|
272
|
+
def requires: (Symbol, type: Class, **untyped) -> void
|
|
273
|
+
def optional: (Symbol, type: Class, ?default: untyped, **untyped) -> void
|
|
274
|
+
def validate: (Params | Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
class Controller
|
|
278
|
+
def self.params: () ?{ (ParamSchema) -> void } -> ParamSchema
|
|
279
|
+
def self.param_schema: -> ParamSchema?
|
|
280
|
+
def self.before_action: (Symbol, ?only: Array[Symbol]?, ?except: Array[Symbol]?) -> void
|
|
281
|
+
def self.after_action: (Symbol, ?only: Array[Symbol]?, ?except: Array[Symbol]?) -> void
|
|
282
|
+
def self.around_action: (Symbol, ?only: Array[Symbol]?, ?except: Array[Symbol]?) -> void
|
|
283
|
+
def self.filters: -> Hash[Symbol, Array[Hash[Symbol, untyped]]]
|
|
284
|
+
def self.rescue_from: (Class, with: Symbol) -> void
|
|
285
|
+
def self.rescue_handlers: -> Hash[Class, Symbol]
|
|
286
|
+
def self.skip_before_action: (Symbol, ?only: Array[Symbol]?, ?except: Array[Symbol]?) -> void
|
|
287
|
+
def self.skipped_filters: -> Hash[Symbol, Array[Hash[Symbol, untyped]]]
|
|
288
|
+
|
|
289
|
+
attr_reader request: Request
|
|
290
|
+
attr_reader response: Response
|
|
291
|
+
attr_reader params: Params
|
|
292
|
+
attr_reader action_name: Symbol
|
|
293
|
+
|
|
294
|
+
def initialize: (Request, Response, Symbol) -> void
|
|
295
|
+
def dispatch: -> Response
|
|
296
|
+
def validated_params: -> Hash[Symbol, untyped]
|
|
297
|
+
def render: (?json: untyped, ?html: String?, ?text: String?, ?status: Integer, **untyped) -> void
|
|
298
|
+
def redirect_to: (String, ?status: Integer) -> void
|
|
299
|
+
def send_file: (String, ?content_type: String?, ?filename: String?, ?disposition: String) -> void
|
|
300
|
+
def stream: () { (StreamWriter) -> void } -> void
|
|
301
|
+
def head: (Integer, **String) -> void
|
|
302
|
+
def halt!: -> void
|
|
303
|
+
def halted?: -> bool
|
|
304
|
+
def session: -> Hash[Symbol, untyped]
|
|
305
|
+
def flash: -> Hash[Symbol, untyped]
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
module Middleware
|
|
309
|
+
class Stack
|
|
310
|
+
attr_reader middlewares: Array[Hash[Symbol, untyped]]
|
|
311
|
+
|
|
312
|
+
def initialize: -> void
|
|
313
|
+
def use: (Class, *untyped, **untyped) -> self
|
|
314
|
+
def insert_before: (Class, Class, *untyped, **untyped) -> self
|
|
315
|
+
def insert_after: (Class, Class, *untyped, **untyped) -> self
|
|
316
|
+
def delete: (Class) -> self
|
|
317
|
+
def swap: (Class, Class, *untyped, **untyped) -> self
|
|
318
|
+
def build: (untyped) -> untyped
|
|
319
|
+
def call: (Request, Response, untyped) -> Response
|
|
320
|
+
def include?: (Class) -> bool
|
|
321
|
+
def size: -> Integer
|
|
322
|
+
def clear: -> self
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
class Base
|
|
326
|
+
attr_reader app: untyped
|
|
327
|
+
attr_reader options: Hash[Symbol, untyped]
|
|
328
|
+
|
|
329
|
+
def initialize: (untyped, **untyped) -> void
|
|
330
|
+
def call: (Request, Response) -> Response
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
class CORS < Base
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
class CSRF < Base
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
class RateLimit < Base
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
class Static < Base
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
class Logger < Base
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
class Compression < Base
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
class WebSocket
|
|
353
|
+
GUID: String
|
|
354
|
+
OPCODES: Hash[Symbol, Integer]
|
|
355
|
+
|
|
356
|
+
def self.on: (Symbol) { (*untyped) -> void } -> void
|
|
357
|
+
def self.handlers: -> Hash[Symbol, Proc]
|
|
358
|
+
def self.subscribe: (String) -> Array[WebSocket]
|
|
359
|
+
def self.broadcast: (String, String) -> void
|
|
360
|
+
def self.channels: -> Hash[String, Array[WebSocket]]
|
|
361
|
+
|
|
362
|
+
attr_reader request: Request
|
|
363
|
+
attr_reader params: Params
|
|
364
|
+
attr_reader socket: untyped
|
|
365
|
+
|
|
366
|
+
def initialize: (Request, untyped) -> void
|
|
367
|
+
def handshake!: -> bool
|
|
368
|
+
def run: -> void
|
|
369
|
+
def send_message: (String) -> void
|
|
370
|
+
def send: (String) -> void
|
|
371
|
+
def send_binary: (String) -> void
|
|
372
|
+
def close: (?code: Integer, ?reason: String) -> void
|
|
373
|
+
def subscribe: (String) -> void
|
|
374
|
+
def unsubscribe: (String) -> void
|
|
375
|
+
def broadcast: (String, String) -> void
|
|
376
|
+
def open?: -> bool
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
class SSE
|
|
380
|
+
attr_reader request: Request
|
|
381
|
+
attr_reader response: Response
|
|
382
|
+
|
|
383
|
+
def initialize: (Request, Response) -> void
|
|
384
|
+
def start: -> void
|
|
385
|
+
def send: (String, ?event: String?, ?id: String?, ?retry_ms: Integer?) -> void
|
|
386
|
+
def comment: (String) -> void
|
|
387
|
+
def close: -> void
|
|
388
|
+
def open?: -> bool
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
class Query[T]
|
|
392
|
+
include Enumerable[T]
|
|
393
|
+
|
|
394
|
+
attr_reader model: Class
|
|
395
|
+
attr_reader conditions: Array[Hash[Symbol, untyped]]
|
|
396
|
+
attr_reader order_clauses: Array[Hash[Symbol, untyped]]
|
|
397
|
+
attr_reader limit_value: Integer?
|
|
398
|
+
attr_reader offset_value: Integer?
|
|
399
|
+
attr_reader select_columns: Array[Symbol | String]
|
|
400
|
+
attr_reader join_clauses: Array[Hash[Symbol, untyped]]
|
|
401
|
+
attr_reader include_associations: Array[Symbol]
|
|
402
|
+
|
|
403
|
+
def initialize: (Class) -> void
|
|
404
|
+
def where: (?Hash[Symbol, untyped]?, **untyped) -> Query[T]
|
|
405
|
+
def where_not: (**untyped) -> Query[T]
|
|
406
|
+
def order: (*Symbol, **untyped) -> Query[T]
|
|
407
|
+
def limit: (Integer) -> Query[T]
|
|
408
|
+
def offset: (Integer) -> Query[T]
|
|
409
|
+
def select: (*Symbol) -> Query[T]
|
|
410
|
+
def joins: (Symbol | String, ?on: String?, ?type: Symbol) -> Query[T]
|
|
411
|
+
def includes: (*Symbol) -> Query[T]
|
|
412
|
+
def first: -> T?
|
|
413
|
+
def last: -> T?
|
|
414
|
+
def count: -> Integer
|
|
415
|
+
def exists?: -> bool
|
|
416
|
+
def empty?: -> bool
|
|
417
|
+
def find_or_create_by: (Hash[Symbol, untyped], ?create_with: Hash[Symbol, untyped]) -> T
|
|
418
|
+
def find_or_initialize_by: (Hash[Symbol, untyped]) -> T
|
|
419
|
+
def each: () { (T) -> void } -> void
|
|
420
|
+
def to_a: -> Array[T]
|
|
421
|
+
def to_sql: -> String
|
|
422
|
+
def pluck: (*Symbol) -> Array[untyped]
|
|
423
|
+
def ids: -> Array[untyped]
|
|
424
|
+
def update_all: (Hash[Symbol, untyped]) -> Integer
|
|
425
|
+
def delete_all: -> Integer
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
class Model
|
|
429
|
+
def self.attribute: (Symbol, Symbol, **untyped) -> void
|
|
430
|
+
def self.attributes: -> Hash[Symbol, Hash[Symbol, untyped]]
|
|
431
|
+
def self.validates: (Symbol, **untyped) -> void
|
|
432
|
+
def self.validations: -> Hash[Symbol, Array[Hash[Symbol, untyped]]]
|
|
433
|
+
def self.has_many: (Symbol, ?class_name: String?, ?foreign_key: String?, **untyped) -> void
|
|
434
|
+
def self.belongs_to: (Symbol, ?class_name: String?, ?foreign_key: String?, **untyped) -> void
|
|
435
|
+
def self.has_one: (Symbol, ?class_name: String?, ?foreign_key: String?, **untyped) -> void
|
|
436
|
+
def self.associations: -> Hash[Symbol, Hash[Symbol, Hash[Symbol, untyped]]]
|
|
437
|
+
def self.table_name: (?String?) -> String
|
|
438
|
+
def self.primary_key: (?Symbol?) -> Symbol
|
|
439
|
+
def self.find: (untyped) -> instance?
|
|
440
|
+
def self.find!: (untyped) -> instance
|
|
441
|
+
def self.find_by: (**untyped) -> instance?
|
|
442
|
+
def self.all: -> Array[instance]
|
|
443
|
+
def self.query: -> Query[instance]
|
|
444
|
+
def self.where: (*untyped, **untyped) -> Query[instance]
|
|
445
|
+
def self.order: (*untyped, **untyped) -> Query[instance]
|
|
446
|
+
def self.limit: (Integer) -> Query[instance]
|
|
447
|
+
def self.offset: (Integer) -> Query[instance]
|
|
448
|
+
def self.select: (*Symbol) -> Query[instance]
|
|
449
|
+
def self.joins: (Symbol | String, **untyped) -> Query[instance]
|
|
450
|
+
def self.includes: (*Symbol) -> Query[instance]
|
|
451
|
+
def self.create: (?Hash[Symbol, untyped]) -> instance
|
|
452
|
+
def self.create!: (?Hash[Symbol, untyped]) -> instance
|
|
453
|
+
def self.coerce: (untyped, Symbol) -> untyped
|
|
454
|
+
def self.connection=: (untyped) -> untyped
|
|
455
|
+
def self.connection: -> untyped
|
|
456
|
+
|
|
457
|
+
attr_reader errors: Hash[Symbol, Array[String]]
|
|
458
|
+
|
|
459
|
+
def initialize: (?Hash[Symbol, untyped]) -> void
|
|
460
|
+
def id: -> untyped
|
|
461
|
+
def id=: (untyped) -> void
|
|
462
|
+
def new_record?: -> bool
|
|
463
|
+
def persisted?: -> bool
|
|
464
|
+
def destroyed?: -> bool
|
|
465
|
+
def changed?: -> bool
|
|
466
|
+
def changed_attributes: -> Array[Symbol]
|
|
467
|
+
def valid?: -> bool
|
|
468
|
+
def save: -> bool
|
|
469
|
+
def save!: -> bool
|
|
470
|
+
def update: (Hash[Symbol, untyped]) -> bool
|
|
471
|
+
def update!: (Hash[Symbol, untyped]) -> bool
|
|
472
|
+
def destroy: -> bool
|
|
473
|
+
def reload: -> self
|
|
474
|
+
def to_h: -> Hash[Symbol, untyped]
|
|
475
|
+
def to_hash: -> Hash[Symbol, untyped]
|
|
476
|
+
def to_json: (*untyped) -> String
|
|
477
|
+
def inspect: -> String
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
class RecordNotFoundError < Error
|
|
481
|
+
attr_reader model: Class
|
|
482
|
+
attr_reader id: untyped
|
|
483
|
+
def initialize: (Class, untyped) -> void
|
|
484
|
+
end
|
|
485
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: tarsier
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Eira Elif
|
|
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: base64
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rake
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '13.0'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '13.0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: rspec
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '3.12'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '3.12'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: yard
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '0.9'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '0.9'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: rubocop
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '1.50'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '1.50'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: benchmark-ips
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '2.12'
|
|
89
|
+
type: :development
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '2.12'
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: memory_profiler
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - "~>"
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '1.0'
|
|
103
|
+
type: :development
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - "~>"
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '1.0'
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: stackprof
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - "~>"
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '0.2'
|
|
117
|
+
type: :development
|
|
118
|
+
prerelease: false
|
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - "~>"
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '0.2'
|
|
124
|
+
- !ruby/object:Gem::Dependency
|
|
125
|
+
name: rack
|
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '3.0'
|
|
131
|
+
type: :development
|
|
132
|
+
prerelease: false
|
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - "~>"
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: '3.0'
|
|
138
|
+
- !ruby/object:Gem::Dependency
|
|
139
|
+
name: rack-test
|
|
140
|
+
requirement: !ruby/object:Gem::Requirement
|
|
141
|
+
requirements:
|
|
142
|
+
- - "~>"
|
|
143
|
+
- !ruby/object:Gem::Version
|
|
144
|
+
version: '2.1'
|
|
145
|
+
type: :development
|
|
146
|
+
prerelease: false
|
|
147
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
148
|
+
requirements:
|
|
149
|
+
- - "~>"
|
|
150
|
+
- !ruby/object:Gem::Version
|
|
151
|
+
version: '2.1'
|
|
152
|
+
description: Tarsier is a fast, clean Ruby web framework with async support, compiled
|
|
153
|
+
routing, and zero runtime dependencies.
|
|
154
|
+
email:
|
|
155
|
+
- tarsier.rb@protonmail.com
|
|
156
|
+
executables:
|
|
157
|
+
- tarsier
|
|
158
|
+
extensions: []
|
|
159
|
+
extra_rdoc_files: []
|
|
160
|
+
files:
|
|
161
|
+
- CHANGELOG.md
|
|
162
|
+
- LICENSE.txt
|
|
163
|
+
- README.md
|
|
164
|
+
- exe/tarsier
|
|
165
|
+
- lib/tarsier.rb
|
|
166
|
+
- lib/tarsier/application.rb
|
|
167
|
+
- lib/tarsier/cli.rb
|
|
168
|
+
- lib/tarsier/cli/commands/console.rb
|
|
169
|
+
- lib/tarsier/cli/commands/generate.rb
|
|
170
|
+
- lib/tarsier/cli/commands/help.rb
|
|
171
|
+
- lib/tarsier/cli/commands/new.rb
|
|
172
|
+
- lib/tarsier/cli/commands/routes.rb
|
|
173
|
+
- lib/tarsier/cli/commands/server.rb
|
|
174
|
+
- lib/tarsier/cli/commands/version.rb
|
|
175
|
+
- lib/tarsier/cli/generators/app.rb
|
|
176
|
+
- lib/tarsier/cli/generators/base.rb
|
|
177
|
+
- lib/tarsier/cli/generators/controller.rb
|
|
178
|
+
- lib/tarsier/cli/generators/middleware.rb
|
|
179
|
+
- lib/tarsier/cli/generators/migration.rb
|
|
180
|
+
- lib/tarsier/cli/generators/model.rb
|
|
181
|
+
- lib/tarsier/cli/generators/resource.rb
|
|
182
|
+
- lib/tarsier/cli/loader.rb
|
|
183
|
+
- lib/tarsier/controller.rb
|
|
184
|
+
- lib/tarsier/database.rb
|
|
185
|
+
- lib/tarsier/errors.rb
|
|
186
|
+
- lib/tarsier/middleware/base.rb
|
|
187
|
+
- lib/tarsier/middleware/compression.rb
|
|
188
|
+
- lib/tarsier/middleware/cors.rb
|
|
189
|
+
- lib/tarsier/middleware/csrf.rb
|
|
190
|
+
- lib/tarsier/middleware/logger.rb
|
|
191
|
+
- lib/tarsier/middleware/rate_limit.rb
|
|
192
|
+
- lib/tarsier/middleware/stack.rb
|
|
193
|
+
- lib/tarsier/middleware/static.rb
|
|
194
|
+
- lib/tarsier/model.rb
|
|
195
|
+
- lib/tarsier/params.rb
|
|
196
|
+
- lib/tarsier/query.rb
|
|
197
|
+
- lib/tarsier/request.rb
|
|
198
|
+
- lib/tarsier/response.rb
|
|
199
|
+
- lib/tarsier/router.rb
|
|
200
|
+
- lib/tarsier/router/compiler.rb
|
|
201
|
+
- lib/tarsier/router/node.rb
|
|
202
|
+
- lib/tarsier/router/route.rb
|
|
203
|
+
- lib/tarsier/version.rb
|
|
204
|
+
- lib/tarsier/websocket.rb
|
|
205
|
+
- sig/tarsier.rbs
|
|
206
|
+
homepage: https://github.com/tarsier-rb/tarsier
|
|
207
|
+
licenses:
|
|
208
|
+
- MIT
|
|
209
|
+
metadata:
|
|
210
|
+
homepage_uri: https://github.com/tarsier-rb/tarsier
|
|
211
|
+
source_code_uri: https://github.com/tarsier-rb/tarsier
|
|
212
|
+
changelog_uri: https://github.com/tarsier-rb/tarsier/blob/main/CHANGELOG.md
|
|
213
|
+
rdoc_options: []
|
|
214
|
+
require_paths:
|
|
215
|
+
- lib
|
|
216
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
217
|
+
requirements:
|
|
218
|
+
- - ">="
|
|
219
|
+
- !ruby/object:Gem::Version
|
|
220
|
+
version: 3.3.0
|
|
221
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
|
+
requirements:
|
|
223
|
+
- - ">="
|
|
224
|
+
- !ruby/object:Gem::Version
|
|
225
|
+
version: '0'
|
|
226
|
+
requirements: []
|
|
227
|
+
rubygems_version: 3.7.2
|
|
228
|
+
specification_version: 4
|
|
229
|
+
summary: A modern, high-performance Ruby web framework
|
|
230
|
+
test_files: []
|