kirei 0.7.0 → 0.8.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df4eacd42ab9ef8cc4b3474e4c58b5ccdc0dc7c7b3631fdf4640a5ea38febc3b
4
- data.tar.gz: 3203e23caa1ffa4cc1352b3d87bc30df0639c4434cfa26ae8b5cb3133a8586d7
3
+ metadata.gz: 2bde9dc5680f9744ab2eb1d0fce8fce8019f2177ee263d1b8d6d82bb9c6fff73
4
+ data.tar.gz: 48732a443adf3d134fcf0fcdabc5e191b794f31a7966e36c1f83e80a9fe9585f
5
5
  SHA512:
6
- metadata.gz: 9bffc31e1489abec7e249e6f9328f0cd1337ee2a007bab192583de9b2d98c8bf2816ad743991f8c1ef073235da8fb072804a0a9d1af0248b28b3cd520bbfb8fe
7
- data.tar.gz: e7ecfe6be3594b7ea70d12646d38a1b4e11e824453c63adfda37d96877791ca30fe2748098336cab13f25b774be92700065bbafeee84e648679242c2c1d47ad7
6
+ metadata.gz: f5a4a532eb8181cf02d7725bed41c8492eb11e0b879e4a51ad430674e220dbb5b26c1b5a44aa29790f6af8f7a1b9ccc132262bb239815f3c290c75c2e7edaaea
7
+ data.tar.gz: 604c5d622a63e5817e39b99d3029d2e15caa1c90a370cb44e9b2a0a321db8317c8da1686543a7267beef957abb149501c200fd0c5d2a148513210c7ab03e9ae5
data/README.md CHANGED
@@ -21,7 +21,7 @@ TL;DR:
21
21
 
22
22
  This gem follows SemVer, however only after a stable release 1.0.0 is made.
23
23
 
24
- A changelog is maintained in the [CHANGELOG.md](CHANGELOG.md) file and/or the GitHub Releases page.
24
+ A changelog is maintained via the [GitHub Releases page](https://github.com/swiknaba/kirei/releases).
25
25
 
26
26
  ## Installation
27
27
 
data/kirei.gemspec CHANGED
@@ -31,12 +31,11 @@ Gem::Specification.new do |spec|
31
31
  "kirei.gemspec",
32
32
  ".irbrc",
33
33
  "lib/**/*",
34
- # do not include RBIs for gems, because users might use different verions
34
+ # do not include RBIs for gems, because users might use different versions
35
35
  "sorbet/rbi/dsl/**/*.rbi",
36
36
  "sorbet/rbi/shims/**/*.rbi",
37
37
  "LICENSE",
38
38
  "README.md",
39
- "CHANGELOG.md",
40
39
  ]
41
40
 
42
41
  spec.bindir = "bin"
@@ -1,4 +1,4 @@
1
- # typed: false
1
+ # typed: true
2
2
 
3
3
  # rubocop:disable Metrics/ClassLength
4
4
 
@@ -41,32 +41,9 @@ module Kirei
41
41
  @after_hooks.add(block) if block
42
42
  end
43
43
 
44
- sig { returns(String) }
45
- def req_host
46
- env.fetch("HTTP_HOST")
47
- end
48
-
49
- sig { returns(String) }
50
- def req_domain
51
- T.must(req_host.split(":").first).split(".").last(2).join(".")
52
- end
53
-
54
- sig { returns(T.nilable(String)) }
55
- def req_subdomain
56
- parts = T.must(req_host.split(":").first).split(".")
57
- return if parts.size <= 2
58
-
59
- T.must(parts[0..-3]).join(".")
60
- end
61
-
62
- sig { returns(Integer) }
63
- def req_port
64
- env.fetch("SERVER_PORT")&.to_i
65
- end
66
-
67
- sig { returns(T::Boolean) }
68
- def req_ssl?
69
- env.fetch("HTTPS", env.fetch("rack.url_scheme", "http")) == "https"
44
+ sig { returns(Routing::Request) }
45
+ def request
46
+ @request ||= T.let(Routing::Request.new(env: env), T.nilable(Routing::Request))
70
47
  end
71
48
 
72
49
  sig { returns(T::Hash[String, T.untyped]) }
@@ -35,12 +35,13 @@ module Kirei
35
35
  # -> use https://github.com/cyu/rack-cors ?
36
36
  #
37
37
 
38
- route = router.get(http_verb, req_path)
38
+ lookup_verb = http_verb == Verb::HEAD ? Verb::GET : http_verb
39
+ route = router.get(lookup_verb, req_path)
39
40
  return NOT_FOUND if route.nil?
40
41
 
41
42
  router.current_env = env # expose the env to the controller
42
43
 
43
- params = case route.verb
44
+ params = case http_verb
44
45
  when Verb::GET
45
46
  query = T.cast(env.fetch("QUERY_STRING"), String)
46
47
  query.split("&").to_h do |p|
@@ -50,14 +51,15 @@ module Kirei
50
51
  end
51
52
  when Verb::POST, Verb::PUT, Verb::PATCH
52
53
  # TODO: based on content-type, parse the body differently
53
- # build-in support for JSON & XML
54
+ # built-in support for JSON & XML
54
55
  body = T.cast(env.fetch("rack.input"), T.any(IO, StringIO))
55
56
  res = Oj.load(body.read, Kirei::OJ_OPTIONS)
56
57
  body.rewind # TODO: maybe don't rewind if we don't need to?
57
58
  T.cast(res, T::Hash[String, T.untyped])
58
- else
59
- Logging::Logger.logger.warn("Unsupported HTTP verb: #{http_verb.serialize} send to #{req_path}")
59
+ when Verb::HEAD, Verb::DELETE, Verb::OPTIONS, Verb::TRACE, Verb::CONNECT
60
60
  {}
61
+ else
62
+ T.absurd(http_verb)
61
63
  end
62
64
 
63
65
  req_id = T.cast(env["HTTP_X_REQUEST_ID"], T.nilable(String))
@@ -86,10 +88,17 @@ module Kirei
86
88
  }
87
89
  Logging::Metric.inject_defaults(statsd_timing_tags)
88
90
 
89
- status, headers, response_body = T.cast(
90
- controller.new(params: params).public_send(route.action),
91
- RackResponseType,
92
- )
91
+ status, headers, response_body = case http_verb
92
+ when Verb::HEAD, Verb::OPTIONS, Verb::TRACE, Verb::CONNECT
93
+ [200, {}, []]
94
+ when Verb::GET, Verb::POST, Verb::PUT, Verb::PATCH, Verb::DELETE
95
+ T.cast(
96
+ controller.new(params: params).public_send(route.action),
97
+ RackResponseType,
98
+ )
99
+ else
100
+ T.absurd(http_verb)
101
+ end
93
102
 
94
103
  after_hooks = collect_hooks(controller, :after_hooks)
95
104
  run_hooks(after_hooks)
@@ -0,0 +1,40 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Kirei
5
+ module Routing
6
+ class Request < T::Struct
7
+ extend T::Sig
8
+
9
+ const :env, T::Hash[String, T.untyped]
10
+
11
+ sig { returns(String) }
12
+ def host
13
+ env.fetch("HTTP_HOST")
14
+ end
15
+
16
+ sig { returns(String) }
17
+ def domain
18
+ T.must(host.split(":").first).split(".").last(2).join(".")
19
+ end
20
+
21
+ sig { returns(T.nilable(String)) }
22
+ def subdomain
23
+ parts = T.must(host.split(":").first).split(".")
24
+ return if parts.size <= 2
25
+
26
+ T.must(parts[0..-3]).join(".")
27
+ end
28
+
29
+ sig { returns(Integer) }
30
+ def port
31
+ env.fetch("SERVER_PORT")&.to_i
32
+ end
33
+
34
+ sig { returns(T::Boolean) }
35
+ def ssl?
36
+ env.fetch("HTTPS", env.fetch("rack.url_scheme", "http")) == "https"
37
+ end
38
+ end
39
+ end
40
+ end
data/lib/kirei/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Kirei
5
- VERSION = "0.7.0"
5
+ VERSION = "0.8.1"
6
6
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kirei
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ludwig Reinmiedl
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-03-18 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: logger
@@ -164,7 +163,6 @@ extensions: []
164
163
  extra_rdoc_files: []
165
164
  files:
166
165
  - ".irbrc"
167
- - CHANGELOG.md
168
166
  - README.md
169
167
  - bin/kirei
170
168
  - kirei.gemspec
@@ -199,6 +197,7 @@ files:
199
197
  - lib/kirei/routing/nilable_hooks_type.rb
200
198
  - lib/kirei/routing/rack_env_type.rb
201
199
  - lib/kirei/routing/rack_response_type.rb
200
+ - lib/kirei/routing/request.rb
202
201
  - lib/kirei/routing/route.rb
203
202
  - lib/kirei/routing/router.rb
204
203
  - lib/kirei/routing/verb.rb
@@ -216,7 +215,6 @@ licenses:
216
215
  metadata:
217
216
  rubygems_mfa_required: 'true'
218
217
  homepage_uri: https://github.com/swiknaba/kirei
219
- post_install_message:
220
218
  rdoc_options: []
221
219
  require_paths:
222
220
  - lib
@@ -231,8 +229,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
231
229
  - !ruby/object:Gem::Version
232
230
  version: '0'
233
231
  requirements: []
234
- rubygems_version: 3.5.9
235
- signing_key:
232
+ rubygems_version: 3.6.7
236
233
  specification_version: 4
237
234
  summary: Kirei is a typed Ruby micro/REST-framework for building scalable and performant
238
235
  microservices.
data/CHANGELOG.md DELETED
@@ -1,16 +0,0 @@
1
- # Changelog
2
-
3
- ## [Unreleased]
4
-
5
- ## [0.1.0] - 2023-09-02
6
-
7
- - Initial release
8
- - added base model
9
- - added database connection
10
- - WIP: basic cli to scaffold a new project
11
-
12
- ## [0.2.0] - 2023-09-02
13
-
14
- - added routing
15
- - added base controller
16
- - added database tasks (create, drop, migrate, rollback, generate migration)