kirei 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32afe7523ced76d4fa44aa5125fbd4aa5befeaba2ea25bc94f2322b6375c461f
4
- data.tar.gz: e6c14a2d80e667ecbd438dc5cd4e6b698ab3e08da394a0a622c027958c8e17cb
3
+ metadata.gz: cea2982351607eeafadd7e8ee3bb3ce13ba2c7e1e37eed22fa2f5a124b625022
4
+ data.tar.gz: 84a47be77945fa7a2faf5950441290fde74293388467729f2eb52c1c6041d29b
5
5
  SHA512:
6
- metadata.gz: ae26b16d43f88cc9639d64ce255f2ebe269c10ae2e55fc0ad06659e5ef5991562bd87b29b6a6731bff00a58a382d78096ac5f4cbc7a155419d69f706a4f013b7
7
- data.tar.gz: a5a4b6e94f7e33eb30d49d46704c52276a492ca6ed744aa99646427dd587836e37783ddabf1fe23856a2bf88cf9812939369d066252fe09e941ec64b33b95cae
6
+ metadata.gz: 3b420ea6cbfce60bf741bfd85cbfeb310dfd71031519a6d5fcc330bff788d24a0df1ef7268abbdbe49a2f373f4ff5df413dc6cf1b83589f96a6f8867164ffcef
7
+ data.tar.gz: 061a15d94de3e73dcd8d41db48601bfa5390d59aa1438c322d590ec3c33db9da4dd38d1f9258bf37a13c248ded433883a6da9ff52d41ee5873ca13b0cda414ca
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,14 +44,12 @@ 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"
48
50
  spec.add_dependency "tzinfo-data", "~> 1.0" # for containerized environments, e.g. on AWS ECS
49
51
 
50
52
  # Web server & routing
51
- spec.add_dependency "puma", "~> 6.0"
52
53
  spec.add_dependency "sinatra", "~> 3.0"
53
54
  spec.add_dependency "sinatra-contrib", "~> 3.0"
54
55
 
data/lib/boot.rb CHANGED
@@ -12,20 +12,13 @@
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
- require "puma"
19
18
  require "sinatra"
20
19
  require "sinatra/namespace" # from sinatra-contrib
21
20
  require "pg"
22
- require "sequel"
23
- # "sequel_pg" should be auto-required by "sequel"
24
-
25
- Oj.default_options = {
26
- mode: :compat, # required to dump hashes with symbol-keys
27
- symbol_keys: false, # T::Struct.new works only with string-keys
28
- }
21
+ require "sequel" # "sequel_pg" is auto-required by "sequel"
29
22
 
30
23
  # Third: load all application code
31
24
  Dir[File.join(__dir__, "kirei/**/*.rb")].each { require(_1) }
@@ -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
- # typed: false
1
+ # typed: true
2
2
 
3
3
  require "fileutils"
4
- require "active_support/all"
5
4
 
6
5
  module Cli
7
6
  module Commands
@@ -10,10 +9,11 @@ module Cli
10
9
  case args[0]
11
10
  when "new"
12
11
  app_name = args[1] || "MyApp"
12
+ # @TODO(lud, 31.12.2023): classify is from ActiveSupport -> remove this?
13
13
  app_name = app_name.gsub(/[-\s]/, "_").classify
14
14
  NewApp::Execute.call(app_name: app_name)
15
15
  else
16
- puts "Unknown command" # rubocop:disable all
16
+ Kirei::Logger.logger.info("Unknown command")
17
17
  end
18
18
  end
19
19
  end
@@ -55,7 +55,12 @@ module Kirei
55
55
  @raw_db_connection = Sequel.connect(AppBase.config.db_url || default_db_url)
56
56
 
57
57
  config.db_extensions.each do |ext|
58
- @raw_db_connection.extension(ext)
58
+ T.cast(@raw_db_connection, Sequel::Database).extension(ext)
59
+ end
60
+
61
+ if config.db_extensions.include?(:pg_json)
62
+ # https://github.com/jeremyevans/sequel/blob/5.75.0/lib/sequel/extensions/pg_json.rb#L8
63
+ @raw_db_connection.wrap_json_primitives = true
59
64
  end
60
65
 
61
66
  @raw_db_connection
@@ -16,10 +16,37 @@ module Kirei
16
16
  ).returns(T.self_type)
17
17
  end
18
18
  def update(hash)
19
+ hash[:updated_at] = Time.now.utc if respond_to?(:updated_at) && hash[:updated_at].nil?
20
+ self.class.wrap_jsonb_non_primivitives!(hash)
19
21
  self.class.db.where({ id: id }).update(hash)
20
22
  self.class.find_by({ id: id })
21
23
  end
22
24
 
25
+ # Delete keeps the original object intact. Returns true if the record was deleted.
26
+ # Calling delete multiple times will return false after the first (successful) call.
27
+ sig { returns(T::Boolean) }
28
+ def delete
29
+ count = self.class.db.where({ id: id }).delete
30
+ count == 1
31
+ end
32
+
33
+ # warning: this is not concurrency-safe
34
+ # save keeps the original object intact, and returns a new object with the updated values.
35
+ sig { returns(T.self_type) }
36
+ def save
37
+ previous_record = self.class.find_by({ id: id })
38
+
39
+ hash = serialize
40
+ Helpers.deep_symbolize_keys!(hash)
41
+ hash = T.cast(hash, T::Hash[Symbol, T.untyped])
42
+
43
+ if previous_record.nil?
44
+ self.class.create(hash)
45
+ else
46
+ update(hash)
47
+ end
48
+ end
49
+
23
50
  module BaseClassInterface
24
51
  extend T::Sig
25
52
  extend T::Helpers
@@ -33,6 +60,14 @@ module Kirei
33
60
  def where(hash)
34
61
  end
35
62
 
63
+ sig { abstract.params(hash: T.untyped).returns(T.untyped) }
64
+ def create(hash)
65
+ end
66
+
67
+ sig { abstract.params(attributes: T.untyped).void }
68
+ def wrap_jsonb_non_primivitives!(attributes)
69
+ end
70
+
36
71
  sig { abstract.params(hash: T.untyped).returns(T.untyped) }
37
72
  def resolve(hash)
38
73
  end
@@ -62,9 +97,16 @@ module Kirei
62
97
 
63
98
  include BaseClassInterface
64
99
 
100
+ # defaults to a pluralized, underscored version of the class name
65
101
  sig { override.returns(String) }
66
102
  def table_name
67
- T.must(name.split("::").last).pluralize.underscore
103
+ @table_name ||= T.let(
104
+ begin
105
+ table_name_ = Kirei::Helpers.underscore(T.must(name.split("::").last))
106
+ "#{table_name_}s"
107
+ end,
108
+ T.nilable(String),
109
+ )
68
110
  end
69
111
 
70
112
  sig { override.returns(Sequel::Dataset) }
@@ -81,6 +123,49 @@ module Kirei
81
123
  resolve(db.where(hash))
82
124
  end
83
125
 
126
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
127
+ # default values defined in the model are used, if omitted in the hash
128
+ sig do
129
+ override.params(
130
+ hash: T::Hash[Symbol, T.untyped],
131
+ ).returns(T.attached_class)
132
+ end
133
+ def create(hash)
134
+ # instantiate a new object to ensure we use default values defined in the model
135
+ without_id = !hash.key?(:id)
136
+ hash[:id] = "kirei-fake-id" if without_id
137
+ new_record = from_hash(Helpers.deep_stringify_keys(hash))
138
+ all_attributes = T.let(new_record.serialize, T::Hash[String, T.untyped])
139
+ all_attributes.delete("id") if without_id && all_attributes["id"] == "kirei-fake-id"
140
+
141
+ wrap_jsonb_non_primivitives!(all_attributes)
142
+
143
+ if new_record.respond_to?(:created_at) && all_attributes["created_at"].nil?
144
+ all_attributes["created_at"] = Time.now.utc
145
+ end
146
+ if new_record.respond_to?(:updated_at) && all_attributes["updated_at"].nil?
147
+ all_attributes["updated_at"] = Time.now.utc
148
+ end
149
+
150
+ pkey = T.let(db.insert(all_attributes), String)
151
+
152
+ T.must(find_by({ id: pkey }))
153
+ end
154
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
155
+
156
+ sig { override.params(attributes: T::Hash[T.any(Symbol, String), T.untyped]).void }
157
+ def wrap_jsonb_non_primivitives!(attributes)
158
+ # setting `@raw_db_connection.wrap_json_primitives = true`
159
+ # only works on JSON primitives, but not on blank hashes/arrays
160
+ return unless AppBase.config.db_extensions.include?(:pg_json)
161
+
162
+ attributes.each_pair do |key, value|
163
+ next unless value.is_a?(Hash) || value.is_a?(Array)
164
+
165
+ attributes[key] = T.unsafe(Sequel).pg_jsonb_wrap(value)
166
+ end
167
+ end
168
+
84
169
  sig do
85
170
  override.params(
86
171
  hash: T::Hash[Symbol, T.untyped],
@@ -106,7 +191,7 @@ module Kirei
106
191
 
107
192
  query.map do |row|
108
193
  row = T.cast(row, T::Hash[Symbol, T.untyped])
109
- row.stringify_keys! # sequel returns symbolized keys
194
+ row.transform_keys!(&:to_s) # sequel returns symbolized keys
110
195
  from_hash(row, strict_loading)
111
196
  end
112
197
  end
@@ -118,7 +203,9 @@ module Kirei
118
203
  ).returns(T.nilable(T.attached_class))
119
204
  end
120
205
  def resolve_first(query, strict = nil)
121
- resolve(query.limit(1), strict).first
206
+ strict_loading = strict.nil? ? AppBase.config.db_strict_type_resolving : strict
207
+
208
+ resolve(query.limit(1), strict_loading).first
122
209
  end
123
210
  end
124
211
 
data/lib/kirei/config.rb CHANGED
@@ -17,16 +17,18 @@ module Kirei
17
17
 
18
18
  prop :logger, ::Logger, factory: -> { ::Logger.new($stdout) }
19
19
  prop :log_transformer, T.nilable(T.proc.params(msg: T::Hash[Symbol, T.untyped]).returns(T::Array[String]))
20
+ prop :log_default_metadata, T::Hash[Symbol, String], default: {}
21
+
20
22
  # dup to allow the user to extend the existing list of sensitive keys
21
23
  prop :sensitive_keys, T::Array[Regexp], factory: -> { SENSITIVE_KEYS.dup }
24
+
22
25
  prop :app_name, String, default: "kirei"
23
- prop :db_url, T.nilable(String)
24
26
 
25
27
  # must use "pg_json" to parse jsonb columns to hashes
26
28
  #
27
29
  # Source: https://github.com/jeremyevans/sequel/blob/5.75.0/lib/sequel/extensions/pg_json.rb
28
30
  prop :db_extensions, T::Array[Symbol], default: %i[pg_json pg_array]
29
-
31
+ prop :db_url, T.nilable(String)
30
32
  # Extra or unknown properties present in the Hash do not raise exceptions at runtime
31
33
  # unless the optional strict argument to from_hash is passed
32
34
  #
@@ -0,0 +1,90 @@
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
+ sig { params(object: T.untyped).returns(T.untyped) }
27
+ def deep_stringify_keys(object)
28
+ deep_transform_keys(object) { _1.to_s rescue _1 } # rubocop:disable Style/RescueModifier
29
+ end
30
+
31
+ sig { params(object: T.untyped).returns(T.untyped) }
32
+ def deep_stringify_keys!(object)
33
+ deep_transform_keys!(object) { _1.to_s rescue _1 } # rubocop:disable Style/RescueModifier
34
+ end
35
+
36
+ sig { params(object: T.untyped).returns(T.untyped) }
37
+ def deep_symbolize_keys(object)
38
+ deep_transform_keys(object) { _1.to_sym rescue _1 } # rubocop:disable Style/RescueModifier
39
+ end
40
+
41
+ sig { params(object: T.untyped).returns(T.untyped) }
42
+ def deep_symbolize_keys!(object)
43
+ deep_transform_keys!(object) { _1.to_sym rescue _1 } # rubocop:disable Style/RescueModifier
44
+ end
45
+
46
+ # Simplified version from Rails' ActiveSupport
47
+ sig do
48
+ params(
49
+ object: T.untyped, # could be anything due to recursive calls
50
+ block: Proc,
51
+ ).returns(T.untyped) # could be anything due to recursive calls
52
+ end
53
+ private def deep_transform_keys(object, &block)
54
+ case object
55
+ when Hash
56
+ object.each_with_object({}) do |(key, value), result|
57
+ result[yield(key)] = deep_transform_keys(value, &block)
58
+ end
59
+ when Array
60
+ object.map { |e| deep_transform_keys(e, &block) }
61
+ else
62
+ object
63
+ end
64
+ end
65
+
66
+ sig do
67
+ params(
68
+ object: T.untyped, # could be anything due to recursive calls
69
+ block: Proc,
70
+ ).returns(T.untyped) # could be anything due to recursive calls
71
+ end
72
+ private def deep_transform_keys!(object, &block)
73
+ case object
74
+ when Hash
75
+ # using `each_key` results in a `RuntimeError: can't add a new key into hash during iteration`
76
+ # which is, because the receiver here does not necessarily have a `Hash` type
77
+ object.keys.each do |key| # rubocop:disable Style/HashEachMethods
78
+ value = object.delete(key)
79
+ object[yield(key)] = deep_transform_keys!(value, &block)
80
+ end
81
+ object
82
+ when Array
83
+ object.map! { |e| deep_transform_keys!(e, &block) }
84
+ else
85
+ object
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
data/lib/kirei/logger.rb CHANGED
@@ -17,12 +17,12 @@ module Kirei
17
17
  #
18
18
  # You can define a custom log transformer to transform the logline:
19
19
  #
20
- # Kirei.config.log_transformer = Proc.new { _1 }
20
+ # Kirei::AppBase.config.log_transformer = Proc.new { _1 }
21
21
  #
22
- # By default, "meta" is flattened, and sensitive values are masked using see `Kirei.config.sensitive_keys`.
22
+ # By default, "meta" is flattened, and sensitive values are masked using see `Kirei::AppBase.config.sensitive_keys`.
23
23
  # You can also build on top of the provided log transformer:
24
24
  #
25
- # Kirei.config.log_transformer = Proc.new do |meta|
25
+ # Kirei::AppBase.config.log_transformer = Proc.new do |meta|
26
26
  # flattened_meta = Kirei::Logger.flatten_hash_and_mask_sensitive_values(meta)
27
27
  # # Do something with the flattened meta
28
28
  # flattened_meta.map { _1.to_json }
@@ -83,7 +83,16 @@ module Kirei
83
83
  ).void
84
84
  end
85
85
  def call(level:, label:, meta: {})
86
+ Kirei::AppBase.config.log_default_metadata.each_pair do |key, value|
87
+ meta[key] ||= value
88
+ end
89
+
90
+ #
91
+ # key names follow OpenTelemetry Semantic Conventions
92
+ # Source: https://opentelemetry.io/docs/concepts/semantic-conventions/
93
+ #
86
94
  meta[:"service.instance.id"] ||= Thread.current[:request_id]
95
+ meta[:"service.name"] ||= Kirei::AppBase.config.app_name
87
96
 
88
97
  # The Ruby logger only accepts one string as the only argument
89
98
  @queue << { level: level, label: label, meta: meta }
@@ -98,7 +107,7 @@ module Kirei
98
107
  label = log_data.fetch(:label)
99
108
  meta = T.let(log_data.fetch(:meta), T::Hash[Symbol, T.untyped])
100
109
  meta[:"service.version"] ||= Kirei::AppBase.version
101
- meta[:timestamp] ||= Time.current.utc.iso8601
110
+ meta[:timestamp] ||= Time.now.utc.iso8601
102
111
  meta[:level] ||= level.to_s.upcase
103
112
  meta[:label] ||= label
104
113
 
@@ -107,7 +116,10 @@ module Kirei
107
116
  loglines = if log_transformer
108
117
  log_transformer.call(meta)
109
118
  else
110
- [Oj.dump(Kirei::Logger.flatten_hash_and_mask_sensitive_values(meta))]
119
+ [Oj.dump(
120
+ Kirei::Logger.flatten_hash_and_mask_sensitive_values(meta),
121
+ Kirei::OJ_OPTIONS,
122
+ )]
111
123
  end
112
124
 
113
125
  loglines.each { Kirei::Logger.logger.error(_1) }
@@ -131,19 +143,24 @@ module Kirei
131
143
 
132
144
  sig do
133
145
  params(
134
- hash: T::Hash[Symbol, T.untyped],
146
+ hash: T::Hash[T.any(Symbol, String), T.untyped],
135
147
  prefix: Symbol,
136
148
  ).returns(T::Hash[Symbol, T.untyped])
137
149
  end
138
150
  def self.flatten_hash_and_mask_sensitive_values(hash, prefix = :'')
139
151
  result = T.let({}, T::Hash[Symbol, T.untyped])
140
- hash.deep_symbolize_keys!
152
+ Kirei::Helpers.deep_symbolize_keys!(hash)
153
+ hash = T.cast(hash, T::Hash[Symbol, T.untyped])
141
154
 
142
155
  hash.each do |key, value|
143
- new_prefix = prefix.blank? ? key : :"#{prefix}.#{key}"
156
+ new_prefix = Kirei::Helpers.blank?(prefix) ? key : :"#{prefix}.#{key}"
144
157
 
145
158
  case value
146
- when Hash then result.merge!(flatten_hash_and_mask_sensitive_values(value.symbolize_keys, new_prefix))
159
+ when Hash
160
+ # Some libraries have a custom Hash class that inhert from Hash, but act differently, e.g. OmniAuth::AuthHash.
161
+ # This results in `transform_keys` being available but without any effect.
162
+ value = value.to_h if value.class != Hash
163
+ result.merge!(flatten_hash_and_mask_sensitive_values(value.transform_keys(&:to_sym), new_prefix))
147
164
  when Array
148
165
  value.each_with_index do |element, index|
149
166
  if element.is_a?(Hash) || element.is_a?(Array)
@@ -158,7 +175,9 @@ module Kirei
158
175
  if value.respond_to?(:serialize)
159
176
  serialized_value = value.serialize
160
177
  if serialized_value.is_a?(Hash)
161
- result.merge!(flatten_hash_and_mask_sensitive_values(serialized_value.symbolize_keys, new_prefix))
178
+ result.merge!(
179
+ flatten_hash_and_mask_sensitive_values(serialized_value.transform_keys(&:to_sym), new_prefix),
180
+ )
162
181
  else
163
182
  result[new_prefix] = serialized_value&.to_s
164
183
  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.2"
5
+ VERSION = "0.1.0"
6
6
  end
data/lib/kirei.rb CHANGED
@@ -1,13 +1,22 @@
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
9
7
  extend T::Sig
10
8
 
9
+ # we don't know what Oj does under the hood with the options hash, so don't freeze it
10
+ # rubocop:disable Style/MutableConstant
11
+ OJ_OPTIONS = T.let(
12
+ {
13
+ mode: :compat, # required to dump hashes with symbol-keys
14
+ symbol_keys: false, # T::Struct.new works only with string-keys
15
+ },
16
+ T::Hash[Symbol, T.untyped],
17
+ )
18
+ # rubocop:enable Style/MutableConstant
19
+
11
20
  GEM_ROOT = T.let(
12
21
  Gem::Specification.find_by_name("kirei").gem_dir,
13
22
  String,
@@ -33,4 +42,4 @@ end
33
42
 
34
43
  Kirei.configure(&:itself)
35
44
 
36
- puts "Kirei (#{Kirei::VERSION}) booted!" # rubocop:disable all
45
+ Kirei::Logger.logger.info("Kirei (#{Kirei::VERSION}) booted successfully!")
@@ -3,6 +3,9 @@
3
3
  # rubocop:disable Style/EmptyMethod
4
4
  module Kirei
5
5
  module BaseModel
6
+ include Kernel # "self" is a class since we include the module in a class
7
+ include T::Props::Serializable
8
+
6
9
  sig { returns(T.any(String, Integer)) }
7
10
  def id; end
8
11
 
@@ -12,6 +15,10 @@ module Kirei
12
15
  sig { returns(String) }
13
16
  def name; end
14
17
  end
18
+
19
+ module BaseClassInterface
20
+ # include T::Props::Serializable::ClassMethods
21
+ end
15
22
  end
16
23
  end
17
24
  # rubocop:enable Style/EmptyMethod
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.2
4
+ version: 0.1.0
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: 2024-01-02 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
@@ -80,20 +66,6 @@ dependencies:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
68
  version: '1.0'
83
- - !ruby/object:Gem::Dependency
84
- name: puma
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '6.0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '6.0'
97
69
  - !ruby/object:Gem::Dependency
98
70
  name: sinatra
99
71
  requirement: !ruby/object:Gem::Requirement
@@ -165,8 +137,10 @@ dependencies:
165
137
  - !ruby/object:Gem::Version
166
138
  version: '1.0'
167
139
  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.
140
+ Kirei is a strictly typed Ruby micro/REST-framework for building scaleable and performant microservices.
141
+ It is built from the ground up to be clean and easy to use.
142
+ Kirei is based on Sequel as an ORM, Sorbet for typing, and Sinatra for routing.
143
+ It strives to have zero magic and to be as explicit as possible.
170
144
  email:
171
145
  - lud@reinmiedl.com
172
146
  - oss@dbl.works
@@ -193,9 +167,9 @@ files:
193
167
  - lib/kirei/base_controller.rb
194
168
  - lib/kirei/base_model.rb
195
169
  - lib/kirei/config.rb
170
+ - lib/kirei/helpers.rb
196
171
  - lib/kirei/logger.rb
197
172
  - lib/kirei/version.rb
198
- - sorbet/rbi/dsl/active_support/callbacks.rbi
199
173
  - sorbet/rbi/shims/base_model.rbi
200
174
  homepage: https://github.com/swiknaba/kirei
201
175
  licenses:
@@ -222,5 +196,5 @@ rubygems_version: 3.5.3
222
196
  signing_key:
223
197
  specification_version: 4
224
198
  summary: Kirei is a strictly typed Ruby micro/REST-framework for building scaleable
225
- and performant APIs.
199
+ and performant microservices.
226
200
  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