kirei 0.0.1 → 0.0.3

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: 8beff5327a463020ae69872995aa9a5101e492f23fa886f6a29e45cfb173728c
4
- data.tar.gz: a2ec68b1e7e7f182d42587d4e73b3736636d883b7d5f93a804956366368467d2
3
+ metadata.gz: b67435621f32def7ede1b291b5d0fe529125bda4dd34149afa5b7db6d2193ddd
4
+ data.tar.gz: fb6c0e91a22bdb8cf726f638c5a250c5245c9a2de4e662f853d2b436a865d2fe
5
5
  SHA512:
6
- metadata.gz: 7bc7eef26e4ed940d91a425c69a447a585a76c2512132b1986b927652bc5331dddd6e77fc279ee65d7739e9d991bd1881c8c421023e1b4b25f70d5ae0224bd79
7
- data.tar.gz: 4f1db54baab633700669e6f7d8f153e73a1f5383ebd9b4c593acd95956699c8bc6b8bafa2d4194aa9a00e13a74bea9bf106a631d48c147d9b60f3f912d75f58d
6
+ metadata.gz: 5529b60454e2389fb5df0ff5fad1cdc5f3b1c8385396aa3f65d977db9bb6ceccbd9e93de70de7dba4f719681f8332cc30a2dfd087117589c274b7ad5f99926ef
7
+ data.tar.gz: 61f28174f219f9968e59183d473a4296d0fe659e3104b4ab2debe8e7cef27de077f653279a9897f7fc71af541597b8b90c3cf8ef66c0cbbadd40984f1520d1a4
data/kirei.gemspec CHANGED
@@ -13,10 +13,12 @@ Gem::Specification.new do |spec|
13
13
  "oss@dbl.works",
14
14
  ]
15
15
 
16
- spec.summary = "Kirei is a strictly typed Ruby micro/REST-framework for building scaleable and performant APIs."
16
+ spec.summary = "Kirei is a strictly typed Ruby micro/REST-framework for building scaleable and performant microservices." # rubocop:disable Layout/LineLength
17
17
  spec.description = <<~TXT
18
- Kirei's structure und developer experience is inspired by Rails, but it's not a Rails clone.
19
- It's a framework that's built from the ground up to be strictly typed, performant and scaleable.
18
+ Kirei is a strictly typed Ruby micro/REST-framework for building scaleable and performant microservices.
19
+ It is built from the ground up to be clean and easy to use.
20
+ Kirei is based on Sequel as an ORM, Sorbet for typing, and Sinatra for routing.
21
+ It strives to have zero magic and to be as explicit as possible.
20
22
  TXT
21
23
  spec.homepage = "https://github.com/swiknaba/kirei"
22
24
  spec.license = "MIT"
@@ -29,6 +31,7 @@ Gem::Specification.new do |spec|
29
31
  "kirei.gemspec",
30
32
  ".irbrc",
31
33
  "lib/**/*",
34
+ # do not include RBIs for gems, because users might use different verions
32
35
  "sorbet/rbi/dsl/**/*.rbi",
33
36
  "sorbet/rbi/shims/**/*.rbi",
34
37
  "LICENSE",
@@ -41,7 +44,6 @@ Gem::Specification.new do |spec|
41
44
  spec.require_paths = ["lib"]
42
45
 
43
46
  # Utilities
44
- spec.add_dependency "activesupport", "~> 6.0"
45
47
  spec.add_dependency "oj", "~> 3.0"
46
48
  spec.add_dependency "rake", "~> 13.0"
47
49
  spec.add_dependency "sorbet-runtime", "~> 0.5"
data/lib/boot.rb CHANGED
@@ -12,15 +12,14 @@
12
12
  require "bundler/setup"
13
13
 
14
14
  # Second: load all gems (runtime dependencies only)
15
+ require "logger"
15
16
  require "sorbet-runtime"
16
17
  require "oj"
17
- require "active_support/all"
18
18
  require "puma"
19
19
  require "sinatra"
20
20
  require "sinatra/namespace" # from sinatra-contrib
21
21
  require "pg"
22
- require "sequel"
23
- # "sequel_pg" should be auto-required by "sequel"
22
+ require "sequel" # "sequel_pg" is auto-required by "sequel"
24
23
 
25
24
  Oj.default_options = {
26
25
  mode: :compat, # required to dump hashes with symbol-keys
@@ -1,7 +1,6 @@
1
1
  # typed: false
2
2
 
3
3
  require "fileutils"
4
- require "active_support/all"
5
4
 
6
5
  module Cli
7
6
  module Commands
@@ -12,7 +11,9 @@ module Cli
12
11
  Files::App.call(app_name)
13
12
  Files::Irbrc.call
14
13
 
15
- puts "Kirei app '#{app_name}' scaffolded successfully!" # rubocop:disable all
14
+ Kirei::Logger.logger.info(
15
+ "Kirei app '#{app_name}' scaffolded successfully!",
16
+ )
16
17
  end
17
18
  end
18
19
  end
@@ -1,7 +1,6 @@
1
1
  # typed: false
2
2
 
3
3
  require "fileutils"
4
- require "active_support/all"
5
4
 
6
5
  module Cli
7
6
  module Commands
@@ -13,7 +12,7 @@ module Cli
13
12
  app_name = app_name.gsub(/[-\s]/, "_").classify
14
13
  NewApp::Execute.call(app_name: app_name)
15
14
  else
16
- puts "Unknown command" # rubocop:disable all
15
+ Kirei::Logger.logger.info("Unknown command")
17
16
  end
18
17
  end
19
18
  end
@@ -29,13 +29,13 @@ module Kirei
29
29
  end
30
30
 
31
31
  sig { returns(String) }
32
- def env
32
+ def environment
33
33
  ENV.fetch("RACK_ENV", "development")
34
34
  end
35
35
 
36
36
  sig { returns(String) }
37
37
  def default_db_name
38
- @default_db_name ||= T.let("#{config.app_name}_#{env}".freeze, T.nilable(String))
38
+ @default_db_name ||= T.let("#{config.app_name}_#{environment}".freeze, T.nilable(String))
39
39
  end
40
40
 
41
41
  sig { returns(String) }
@@ -8,7 +8,7 @@ module Kirei
8
8
 
9
9
  before do
10
10
  Thread.current[:request_id] = request.env["HTTP_X_REQUEST_ID"].presence ||
11
- "req_#{AppBase.env}_#{SecureRandom.uuid}"
11
+ "req_#{AppBase.environment}_#{SecureRandom.uuid}"
12
12
  end
13
13
  end
14
14
  end
@@ -62,9 +62,16 @@ module Kirei
62
62
 
63
63
  include BaseClassInterface
64
64
 
65
+ # defaults to a pluralized, underscored version of the class name
65
66
  sig { override.returns(String) }
66
67
  def table_name
67
- T.must(name.split("::").last).pluralize.underscore
68
+ @table_name ||= T.let(
69
+ begin
70
+ table_name_ = Kirei::Helpers.underscore(T.must(name.split("::").last))
71
+ "#{table_name_}s"
72
+ end,
73
+ T.nilable(String),
74
+ )
68
75
  end
69
76
 
70
77
  sig { override.returns(Sequel::Dataset) }
@@ -106,7 +113,7 @@ module Kirei
106
113
 
107
114
  query.map do |row|
108
115
  row = T.cast(row, T::Hash[Symbol, T.untyped])
109
- row.stringify_keys! # sequel returns symbolized keys
116
+ row.transform_keys!(&:to_s) # sequel returns symbolized keys
110
117
  from_hash(row, strict_loading)
111
118
  end
112
119
  end
@@ -0,0 +1,70 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Kirei
5
+ module Helpers
6
+ class << self
7
+ extend T::Sig
8
+
9
+ # Simplified version from Rails' ActiveSupport::Inflector#underscore
10
+ sig { params(string: String).returns(String) }
11
+ def underscore(string)
12
+ string.gsub!(/([A-Z])(?=[A-Z][a-z])|([a-z\d])(?=[A-Z])/) do
13
+ T.must((::Regexp.last_match(1) || ::Regexp.last_match(2))) << "_"
14
+ end
15
+ string.tr!("-", "_")
16
+ string.downcase!
17
+ string
18
+ end
19
+
20
+ # Simplified version from Rails' ActiveSupport
21
+ sig { params(string: T.any(String, Symbol)).returns(T::Boolean) }
22
+ def blank?(string)
23
+ string.nil? || string.to_s.empty?
24
+ end
25
+
26
+ # Simplified version from Rails' ActiveSupport
27
+ sig do
28
+ params(
29
+ object: T.untyped, # could be anything due to recursive calls
30
+ block: Proc,
31
+ ).returns(T.untyped) # could be anything due to recursive calls
32
+ end
33
+ def deep_transform_keys(object, &block)
34
+ case object
35
+ when Hash
36
+ object.each_with_object({}) do |(key, value), result|
37
+ result[yield(key)] = deep_transform_keys(value, &block)
38
+ end
39
+ when Array
40
+ object.map { |e| deep_transform_keys(e, &block) }
41
+ else
42
+ object
43
+ end
44
+ end
45
+
46
+ sig do
47
+ params(
48
+ object: T.untyped, # could be anything due to recursive calls
49
+ block: Proc,
50
+ ).returns(T.untyped) # could be anything due to recursive calls
51
+ end
52
+ def deep_transform_keys!(object, &block)
53
+ case object
54
+ when Hash
55
+ # using `each_key` results in a `RuntimeError: can't add a new key into hash during iteration`
56
+ # which is, because the receiver here does not necessarily have a `Hash` type
57
+ object.keys.each do |key| # rubocop:disable Style/HashEachMethods
58
+ value = object.delete(key)
59
+ object[yield(key)] = deep_transform_keys!(value, &block)
60
+ end
61
+ object
62
+ when Array
63
+ object.map! { |e| deep_transform_keys!(e, &block) }
64
+ else
65
+ object
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
data/lib/kirei/logger.rb CHANGED
@@ -98,7 +98,7 @@ module Kirei
98
98
  label = log_data.fetch(:label)
99
99
  meta = T.let(log_data.fetch(:meta), T::Hash[Symbol, T.untyped])
100
100
  meta[:"service.version"] ||= Kirei::AppBase.version
101
- meta[:timestamp] ||= Time.current.utc.iso8601
101
+ meta[:timestamp] ||= Time.now.utc.iso8601
102
102
  meta[:level] ||= level.to_s.upcase
103
103
  meta[:label] ||= label
104
104
 
@@ -137,13 +137,13 @@ module Kirei
137
137
  end
138
138
  def self.flatten_hash_and_mask_sensitive_values(hash, prefix = :'')
139
139
  result = T.let({}, T::Hash[Symbol, T.untyped])
140
- hash.deep_symbolize_keys!
140
+ Kirei::Helpers.deep_transform_keys!(hash) { _1.to_sym rescue _1 } # rubocop:disable Style/RescueModifier
141
141
 
142
142
  hash.each do |key, value|
143
- new_prefix = prefix.blank? ? key : :"#{prefix}.#{key}"
143
+ new_prefix = Kirei::Helpers.blank?(prefix) ? key : :"#{prefix}.#{key}"
144
144
 
145
145
  case value
146
- when Hash then result.merge!(flatten_hash_and_mask_sensitive_values(value.symbolize_keys, new_prefix))
146
+ when Hash then result.merge!(flatten_hash_and_mask_sensitive_values(value.transform_keys(&:to_sym), new_prefix))
147
147
  when Array
148
148
  value.each_with_index do |element, index|
149
149
  if element.is_a?(Hash) || element.is_a?(Array)
@@ -158,7 +158,9 @@ module Kirei
158
158
  if value.respond_to?(:serialize)
159
159
  serialized_value = value.serialize
160
160
  if serialized_value.is_a?(Hash)
161
- result.merge!(flatten_hash_and_mask_sensitive_values(serialized_value.symbolize_keys, new_prefix))
161
+ result.merge!(
162
+ flatten_hash_and_mask_sensitive_values(serialized_value.transform_keys(&:to_sym), new_prefix),
163
+ )
162
164
  else
163
165
  result[new_prefix] = serialized_value&.to_s
164
166
  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.0.1"
5
+ VERSION = "0.0.3"
6
6
  end
data/lib/kirei.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- puts "Booting Kirei..." # rubocop:disable all
5
-
6
4
  require "boot"
7
5
 
8
6
  module Kirei
@@ -33,4 +31,4 @@ end
33
31
 
34
32
  Kirei.configure(&:itself)
35
33
 
36
- puts "Kirei (#{Kirei::VERSION}) booted!" # rubocop:disable all
34
+ Kirei::Logger.logger.info("Kirei (#{Kirei::VERSION}) booted successfully!")
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kirei
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ludwig Reinmiedl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-29 00:00:00.000000000 Z
11
+ date: 2023-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '6.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '6.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: oj
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -165,8 +151,10 @@ dependencies:
165
151
  - !ruby/object:Gem::Version
166
152
  version: '1.0'
167
153
  description: |
168
- Kirei's structure und developer experience is inspired by Rails, but it's not a Rails clone.
169
- It's a framework that's built from the ground up to be strictly typed, performant and scaleable.
154
+ Kirei is a strictly typed Ruby micro/REST-framework for building scaleable and performant microservices.
155
+ It is built from the ground up to be clean and easy to use.
156
+ Kirei is based on Sequel as an ORM, Sorbet for typing, and Sinatra for routing.
157
+ It strives to have zero magic and to be as explicit as possible.
170
158
  email:
171
159
  - lud@reinmiedl.com
172
160
  - oss@dbl.works
@@ -193,9 +181,9 @@ files:
193
181
  - lib/kirei/base_controller.rb
194
182
  - lib/kirei/base_model.rb
195
183
  - lib/kirei/config.rb
184
+ - lib/kirei/helpers.rb
196
185
  - lib/kirei/logger.rb
197
186
  - lib/kirei/version.rb
198
- - sorbet/rbi/dsl/active_support/callbacks.rbi
199
187
  - sorbet/rbi/shims/base_model.rbi
200
188
  homepage: https://github.com/swiknaba/kirei
201
189
  licenses:
@@ -222,5 +210,5 @@ rubygems_version: 3.5.3
222
210
  signing_key:
223
211
  specification_version: 4
224
212
  summary: Kirei is a strictly typed Ruby micro/REST-framework for building scaleable
225
- and performant APIs.
213
+ and performant microservices.
226
214
  test_files: []
@@ -1,22 +0,0 @@
1
- # typed: true
2
-
3
- # DO NOT EDIT MANUALLY
4
- # This is an autogenerated file for dynamic methods in `ActiveSupport::Callbacks`.
5
- # Please instead update this file by running `bin/tapioca dsl ActiveSupport::Callbacks`.
6
-
7
- module ActiveSupport::Callbacks
8
- include GeneratedInstanceMethods
9
-
10
- mixes_in_class_methods GeneratedClassMethods
11
-
12
- module GeneratedClassMethods
13
- def __callbacks; end
14
- def __callbacks=(value); end
15
- def __callbacks?; end
16
- end
17
-
18
- module GeneratedInstanceMethods
19
- def __callbacks; end
20
- def __callbacks?; end
21
- end
22
- end