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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/navykit.rb +157 -0
  3. 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: []