navykit 1.0.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/lib/navykit.rb +157 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cebc245cc995f4cfb6bf66247e3133df13dfd38c95276f65c526b8e24426340e
|
4
|
+
data.tar.gz: 551f09f2e13fa7dbdb116f3012da6652053fa246268ad1999416fc1c4019d460
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8df3eeae6cb3584f2f63804af4d709421f2d4bd1869e1c31374023c71a2d23f2864e9c83944687d111f2e7299b2a6c444a71cd362e1fda8bc79392ee7af57caf
|
7
|
+
data.tar.gz: a4fa116edd690648a7520523b19c6783f658ae22b23f2c06258186007711a00708b1deef256441f88dc0c0c5e52dff8408bc08a63c77a0bdd39afeb6eb720641
|
data/lib/navykit.rb
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'uri'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
class Request
|
6
|
+
def initialize(real, params={})
|
7
|
+
@real = real
|
8
|
+
@params = params
|
9
|
+
@query = CGI.parse(@real.request_uri).transform_values do |values|
|
10
|
+
values.size == 1 ? values[0] : values
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def query(key)
|
15
|
+
return @query[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def param(key)
|
19
|
+
return @params[key.to_s]
|
20
|
+
end
|
21
|
+
|
22
|
+
def method
|
23
|
+
return @real.request_method
|
24
|
+
end
|
25
|
+
|
26
|
+
def header(key)
|
27
|
+
return @real.header[key]
|
28
|
+
end
|
29
|
+
|
30
|
+
def text
|
31
|
+
return @real.body
|
32
|
+
end
|
33
|
+
|
34
|
+
def json
|
35
|
+
return JSON.parse(text)
|
36
|
+
end
|
37
|
+
|
38
|
+
def path
|
39
|
+
return @real.path
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Response
|
44
|
+
def initialize(real)
|
45
|
+
@real = real
|
46
|
+
end
|
47
|
+
|
48
|
+
def header(key, value)
|
49
|
+
@real.header[key.downcase] = value.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
def type(value)
|
53
|
+
header("content-type", value)
|
54
|
+
end
|
55
|
+
|
56
|
+
def send(status, body)
|
57
|
+
@real.status = status
|
58
|
+
@real.body = body
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class NavyKit
|
63
|
+
@@version = "1.0.0"
|
64
|
+
|
65
|
+
def initialize
|
66
|
+
@routes = []
|
67
|
+
@fallback = nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def use(req, res)
|
71
|
+
path = req.path
|
72
|
+
method = req.request_method
|
73
|
+
response = Response.new(res)
|
74
|
+
|
75
|
+
_route = find_route(method, path)
|
76
|
+
if _route != nil
|
77
|
+
rpath = _route[:path]
|
78
|
+
rhandler = _route[:handler]
|
79
|
+
params = get_params(path, rpath)
|
80
|
+
rhandler.call(Request.new(req, params), response)
|
81
|
+
elsif @fallback != nil
|
82
|
+
@fallback.call(Request.new(req), response)
|
83
|
+
else
|
84
|
+
native_fallback(req, res)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def notfound(handler=nil, &block)
|
89
|
+
@fallback = block_given? ? block : handler
|
90
|
+
end
|
91
|
+
|
92
|
+
def route(method, path, handler=nil, &block)
|
93
|
+
segments = parse_path(path)
|
94
|
+
@routes << {
|
95
|
+
path: segments,
|
96
|
+
method: method,
|
97
|
+
handler: block_given? ? block : handler
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def get(path, handler=nil, &block)
|
102
|
+
route("GET", path, handler, &block)
|
103
|
+
end
|
104
|
+
|
105
|
+
def post(path, handler=nil, &block)
|
106
|
+
route("POST", path, handler, &block)
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
def parse_path(path)
|
111
|
+
segments = path[1..].split("/")
|
112
|
+
if segments.size == 0
|
113
|
+
segments[0] = "/"
|
114
|
+
else
|
115
|
+
segments.unshift("/")
|
116
|
+
end
|
117
|
+
return segments
|
118
|
+
end
|
119
|
+
|
120
|
+
def find_route(method, path)
|
121
|
+
segments = parse_path(path)
|
122
|
+
matching = @routes.clone
|
123
|
+
matching.select! { |y|
|
124
|
+
y[:method] == method
|
125
|
+
}
|
126
|
+
segments.each_with_index do |seg, i|
|
127
|
+
matching.select! { |y|
|
128
|
+
if y[:path].size != segments.size
|
129
|
+
false
|
130
|
+
elsif y[:path][i].start_with?(":")
|
131
|
+
true
|
132
|
+
else
|
133
|
+
y[:path][i] == seg
|
134
|
+
end
|
135
|
+
}
|
136
|
+
end
|
137
|
+
return matching.size > 0 ? matching[0] : nil
|
138
|
+
return route
|
139
|
+
end
|
140
|
+
|
141
|
+
def get_params(path, pattern)
|
142
|
+
segments = parse_path(path)
|
143
|
+
params = {}
|
144
|
+
pattern.each_with_index do |y, i|
|
145
|
+
if y.start_with?(":")
|
146
|
+
params[y[1..]] = segments[i]
|
147
|
+
end
|
148
|
+
end
|
149
|
+
return params
|
150
|
+
end
|
151
|
+
|
152
|
+
def native_fallback(req, res)
|
153
|
+
res.header["content-type"] = "text/plain"
|
154
|
+
res.status = "200"
|
155
|
+
res.body = "#{req.request_method} #{req.path}\n[NavyKit v#{@@version}] No route matched\n\nThere's nothing here yet. Add a route to get started."
|
156
|
+
end
|
157
|
+
end
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: navykit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- trulyursdelv
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies: []
|
12
|
+
description: 'Navy is a simple, lightweight server routing framework for Ruby that
|
13
|
+
helps build web servers with ease. It provides the core functionalities to route
|
14
|
+
requests and send responses, making it ideal for creating RESTful services or APIs
|
15
|
+
with minimal overhead. With support for custom route handling, dynamic parameters,
|
16
|
+
and a fallback for unmatched routes, Navy is designed for developers who need a
|
17
|
+
fast and flexible routing solution.
|
18
|
+
|
19
|
+
'
|
20
|
+
executables: []
|
21
|
+
extensions: []
|
22
|
+
extra_rdoc_files: []
|
23
|
+
files:
|
24
|
+
- lib/navykit.rb
|
25
|
+
homepage: https://rubygems.org/gems/navykit
|
26
|
+
licenses:
|
27
|
+
- CC0-1.0
|
28
|
+
metadata: {}
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '3.0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubygems_version: 3.6.8
|
44
|
+
specification_version: 4
|
45
|
+
summary: A simple, lightweight server routing framework for Ruby
|
46
|
+
test_files: []
|