ru.Bee 1.9.13 โ†’ 1.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67b4b7a2e0717e400e958cabecbab8ad3fd47725015ba3ef1ee9245fe1ea9e12
4
- data.tar.gz: 51de37c21accea30e09def16555077af3a6076110c69746a6245e2a79e242f94
3
+ metadata.gz: 4309600ffa9a5cff66e752b2068805b1b5a0f16471b6be7a5ac00c7e1326c75a
4
+ data.tar.gz: f8fd1a0ac518e24eb9c03885e39448a7f1f94bfce6f5a5bdfd5e99ea35987bf2
5
5
  SHA512:
6
- metadata.gz: 9453e184e417bd47d87729d307c171cdf35d1f482f0a326432dd5a4d740ea007995420f4d9163b3c82b1d0e297bfcc133479ec4127d9b0520b1a7fc81969c8a9
7
- data.tar.gz: e45a5a0ac96acb7306788bd95d760231494b1db18ebc4439fed99bd6571876c83579187b3836a54f869afcef1be9383af88d1d7d89766063c22b19c729fbc061
6
+ metadata.gz: ed3f43069f1b6c7e9dd3633e54ca9eb76b5fe8ed11c944690959f8c971623a33b688e156a8996477c49ce177f5702f2a6a87196299b881bb1f8c6d8a42ee725c
7
+ data.tar.gz: d560d5c3272d758b1f082c1a036e092f95e86d8cbb6243ff44fff39b1872b46cea410e96d31b6317ac6a916619ce6dd539e5054f3998af0712d5d86c4f029b6a
@@ -2,5 +2,5 @@
2
2
  # If you remove or modify it, make sure all changes are inlined
3
3
  # with AuthTokenMiddleware and AuthTokenable modules
4
4
  class User < Rubee::SequelObject
5
- attr_accessor :id, :email, :password
5
+ attr_accessor :id, :email, :password, :created, :updated
6
6
  end
@@ -6,6 +6,9 @@ class CreateAccounts
6
6
  primary_key(:id)
7
7
  String(:addres)
8
8
  foreign_key(:user_id, :users)
9
+ # timestamps
10
+ datetime(:created)
11
+ datetime(:updated)
9
12
  end
10
13
 
11
14
  Account.create(addres: '13th Ave, NY', user_id: User.all.first.id)
@@ -10,6 +10,9 @@ class CreateAddresses
10
10
  String(:street)
11
11
  String(:apt)
12
12
  foreign_key(:user_id, :users)
13
+ # timestamps
14
+ datetime(:created)
15
+ datetime(:updated)
13
16
  end
14
17
 
15
18
  # Address.create(street: '13th Ave', city: 'NY', state: 'NY', zip: '55555', user_id: User.all.first.id)
@@ -6,6 +6,10 @@ class CreateComments
6
6
  primary_key(:id)
7
7
  String(:text)
8
8
  Integer(:user_id)
9
+ # timestamps
10
+ datetime(:created)
11
+ datetime(:updated)
12
+
9
13
  end
10
14
 
11
15
  User.create(email: 'ok@ok.com', password: 'password')
@@ -6,6 +6,9 @@ class CreatePosts
6
6
  primary_key(:id)
7
7
  foreign_key(:user_id, :users)
8
8
  foreign_key(:comment_id, :comments)
9
+ # timestamps
10
+ datetime(:created)
11
+ datetime(:updated)
9
12
  end
10
13
 
11
14
  Post.create(user_id: User.all.first.id, comment_id: Comment.all.first.id)
@@ -9,6 +9,9 @@ class CreateUsers
9
9
  String(:email)
10
10
  String(:password)
11
11
  index(:email)
12
+ # timestamps
13
+ datetime(:created)
14
+ datetime(:updated)
12
15
  end
13
16
 
14
17
  User.create(email: 'ok@ok.com', password: 'password')
@@ -22,6 +22,14 @@ module Rubee
22
22
  exec('npm run watch')
23
23
  end
24
24
  end
25
+
26
+ def build(_argv)
27
+ if Rubee::PROJECT_NAME == 'rubee'
28
+ exec('cd ./lib && npm run build')
29
+ else
30
+ exec('npm run build')
31
+ end
32
+ end
25
33
  end
26
34
  end
27
35
  end
@@ -7,8 +7,18 @@ module Rubee
7
7
 
8
8
  module ClassMethods
9
9
  def before(*methods, handler, **options)
10
+ if options[:class_methods]
11
+ methods.each do |method|
12
+ define_method(method) do |*args, &block|
13
+ self.class.send(method, *args, &block)
14
+ end
15
+
16
+ private(method)
17
+ end
18
+ end
19
+
10
20
  methods.each do |method|
11
- hooks = Module.new do
21
+ hook = Module.new do
12
22
  define_method(method) do |*args, &block|
13
23
  if conditions_met?(options[:if], options[:unless])
14
24
  handler.respond_to?(:call) ? handler.call : send(handler)
@@ -17,13 +27,24 @@ module Rubee
17
27
  super(*args, &block)
18
28
  end
19
29
  end
20
- prepend(hooks)
30
+
31
+ prepend(hook)
21
32
  end
22
33
  end
23
34
 
24
35
  def after(*methods, handler, **options)
36
+ if options[:class_methods]
37
+ methods.each do |method|
38
+ define_method(method) do |*args, &block|
39
+ self.class.send(method, *args, &block)
40
+ end
41
+
42
+ private(method)
43
+ end
44
+ end
45
+
25
46
  methods.each do |method|
26
- hooks = Module.new do
47
+ hook = Module.new do
27
48
  define_method(method) do |*args, &block|
28
49
  result = super(*args, &block)
29
50
 
@@ -34,13 +55,24 @@ module Rubee
34
55
  result
35
56
  end
36
57
  end
37
- prepend(hooks)
58
+
59
+ prepend(hook)
38
60
  end
39
61
  end
40
62
 
41
63
  def around(*methods, handler, **options)
64
+ if options[:class_methods]
65
+ methods.each do |method|
66
+ define_method(method) do |*args, &block|
67
+ self.class.send(method, *args, &block)
68
+ end
69
+
70
+ private(method)
71
+ end
72
+ end
73
+
42
74
  methods.each do |method|
43
- hooks = Module.new do
75
+ hook = Module.new do
44
76
  define_method(method) do |*args, &block|
45
77
  if conditions_met?(options[:if], options[:unless])
46
78
  if handler.respond_to?(:call)
@@ -60,7 +92,8 @@ module Rubee
60
92
  end
61
93
  end
62
94
  end
63
- prepend(hooks)
95
+
96
+ prepend(hook)
64
97
  end
65
98
  end
66
99
  end
@@ -68,6 +101,10 @@ module Rubee
68
101
  module InstanceMethods
69
102
  private
70
103
 
104
+ def handle_class_method
105
+ self.class.send(name, *args, &block)
106
+ end
107
+
71
108
  def conditions_met?(if_condition = nil, unless_condition = nil)
72
109
  return true if if_condition.nil? && unless_condition.nil?
73
110
 
@@ -4,6 +4,8 @@ module Rubee
4
4
  using ChargedString
5
5
  using ChargedHash
6
6
 
7
+ before :save, :update, :set_timestamps
8
+
7
9
  def destroy(cascade: false, **_options)
8
10
  if cascade
9
11
  # find all tables with foreign key
@@ -41,14 +43,15 @@ module Rubee
41
43
  true
42
44
  end
43
45
 
44
- def assign_attributes(args = {})
45
- to_h.each_key do |attr|
46
+ def assign_attributes(args={})
47
+ self.class.dataset.columns do |attr|
46
48
  send("#{attr}=", args[attr.to_sym]) if args[attr.to_sym]
47
49
  end
48
50
  end
49
51
 
50
- def update(args = {})
52
+ def update(args={})
51
53
  assign_attributes(args)
54
+ args.merge!(updated:)
52
55
  found_hash = self.class.dataset.where(id:)
53
56
  return self.class.find(id) if Rubee::DBTools.with_retry { found_hash&.update(**args) }
54
57
 
@@ -63,6 +66,15 @@ module Rubee
63
66
  self.class.find(id)
64
67
  end
65
68
 
69
+ private
70
+
71
+ def set_timestamps
72
+ return unless respond_to?(:created) && respond_to?(:updated)
73
+
74
+ self.created ||= Time.now
75
+ self.updated = Time.now
76
+ end
77
+
66
78
  class << self
67
79
  def last
68
80
  found_hash = dataset.order(:id).last
@@ -191,6 +203,10 @@ module Rubee
191
203
  end
192
204
 
193
205
  def create(attrs)
206
+ if dataset.columns.include?(:created) && dataset.columns.include?(:updated)
207
+ attrs.merge!(created: Time.now, updated: Time.now)
208
+ end
209
+
194
210
  out_id = Rubee::DBTools.with_retry { dataset.insert(**attrs) }
195
211
  new(**attrs.merge(id: out_id))
196
212
  end
data/lib/rubee.rb CHANGED
@@ -16,7 +16,7 @@ module Rubee
16
16
  JS_DIR = File.join(APP_ROOT, LIB, 'js') unless defined?(JS_DIR)
17
17
  CSS_DIR = File.join(APP_ROOT, LIB, 'css') unless defined?(CSS_DIR)
18
18
  ROOT_PATH = File.expand_path(File.join(__dir__, '..')) unless defined?(ROOT_PATH)
19
- VERSION = '1.9.13'
19
+ VERSION = '1.10.0'
20
20
 
21
21
  require_relative 'rubee/router'
22
22
  require_relative 'rubee/logger'
@@ -1,5 +1,5 @@
1
1
  class Account < Rubee::SequelObject
2
- attr_accessor :id, :addres, :user_id
2
+ attr_accessor :id, :addres, :user_id, :created, :updated
3
3
 
4
4
  holds :user
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class Address < Rubee::SequelObject
2
- attr_accessor :id, :street, :apt, :city, :state, :zip, :user_id
2
+ attr_accessor :id, :street, :apt, :city, :state, :zip, :user_id, :created, :updated
3
3
 
4
4
  holds :user
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class Comment < Rubee::SequelObject
2
- attr_accessor :id, :text, :user_id
2
+ attr_accessor :id, :text, :user_id, :created, :updated
3
3
 
4
4
  owns_many :users, over: :posts
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class Post < Rubee::SequelObject
2
- attr_accessor :id, :user_id, :comment_id
2
+ attr_accessor :id, :user_id, :comment_id, :created, :updated
3
3
 
4
4
  holds :comment
5
5
  holds :user
@@ -1,5 +1,5 @@
1
1
  class User < Rubee::SequelObject
2
- attr_accessor :id, :email, :password
2
+ attr_accessor :id, :email, :password, :created, :updated
3
3
 
4
4
  owns_many :accounts, cascade: true
5
5
  owns_one :address, cascade: true
@@ -1,4 +1,5 @@
1
1
  require_relative '../test_helper'
2
+
2
3
  describe 'User model' do
3
4
  describe '.create' do
4
5
  after do
@@ -11,6 +12,18 @@ describe 'User model' do
11
12
 
12
13
  _(user.persisted?).must_equal(true)
13
14
  end
15
+
16
+ it 'set created field' do
17
+ user = User.create(email: 'ok-test@test.com', password: '123')
18
+
19
+ _(user.created.is_a?(Time)).must_equal(true)
20
+ end
21
+
22
+ it 'set updated field' do
23
+ user = User.create(email: 'ok-test@test.com', password: '123')
24
+
25
+ _(user.updated.is_a?(Time)).must_equal(true)
26
+ end
14
27
  end
15
28
 
16
29
  describe 'when data is invalid' do
@@ -39,6 +52,15 @@ describe 'User model' do
39
52
 
40
53
  _(user.persisted?).must_equal(true)
41
54
  end
55
+
56
+ it 'updates updated field' do
57
+ user = User.create(email: 'ok-test@test.com', password: '123')
58
+ after_create_updated = user.updated
59
+
60
+ user.email = 'ok-test2@test.com'
61
+ user.save
62
+ _(user.updated > after_create_updated).must_equal(true)
63
+ end
42
64
  end
43
65
 
44
66
  describe 'when save existing user' do
@@ -108,6 +130,25 @@ describe 'User model' do
108
130
 
109
131
  _(user.reload.password).must_equal('1234')
110
132
  end
133
+
134
+ it 'updates updated field' do
135
+ user = User.create(email: 'ok-test@test.com', password: '123')
136
+ after_create_updated = user.updated
137
+
138
+ user.update(email: 'ok-test2@test.com')
139
+ _(user.updated > after_create_updated).must_equal(true)
140
+ end
141
+ end
142
+
143
+ describe 'when udpate existing user with no argumants' do
144
+ it 'update updated field' do
145
+ user = User.new(email: 'ok-test@test.com', password: '123')
146
+ user.save
147
+ updated_field_before_update = user.updated
148
+
149
+ user.update
150
+ _(user.updated > updated_field_before_update).must_equal(true)
151
+ end
111
152
  end
112
153
  end
113
154
 
data/lib/tests/test.db CHANGED
Binary file
data/readme.md CHANGED
@@ -6,7 +6,7 @@
6
6
  ![GitHub Repo stars](https://img.shields.io/github/stars/nucleom42/rubee?style=social)
7
7
 
8
8
 
9
- # <img src="lib/images/rubee.svg" alt="ruBee" height="40"> ... ruBee
9
+ # <img src="lib/images/rubee.svg" alt="RUBEE" height="40"> ... RUBEE
10
10
 
11
11
  Rubee is a Ruby-based framework designed to streamline the development of modular monolith applications. \
12
12
  It offers a structured approach to building scalable, maintainable, and React-ready projects, \
@@ -15,6 +15,35 @@ making it an ideal choice for developers seeking a balance between monolithic si
15
15
  Want to get a quick API server up and runing? You can do it for real quick!
16
16
  <br />
17
17
  [![Watch the demo](https://img.youtube.com/vi/ko7H70s7qq0/hqdefault.jpg)](https://www.youtube.com/watch?v=ko7H70s7qq0)
18
+
19
+ ## Production ready
20
+
21
+ Take a look on the rubee demo site with all documentation stored in there: https://rubee.dedyn.io/
22
+ Want to explore how it built? https://github.com/nucleom42/rubee-site
23
+
24
+ ## Stress tested
25
+
26
+ ```bash
27
+ wrk -t4 -c100 -d30s https://rubee.duckdns.org/docs
28
+ Running 30s test @ https://rubee.duckdns.org/docs
29
+ 4 threads and 100 connections
30
+ Thread Stats Avg Stdev Max +/- Stdev
31
+ Latency 304.95ms 33.22ms 551.86ms 90.38%
32
+ Req/Sec 82.25 42.37 280.00 69.86%
33
+ 9721 requests in 30.02s, 4.11MB read
34
+ Requests/sec: 323.78
35
+ Transfer/sec: 140.07KB
36
+ ```
37
+
38
+ - Short output explanation:
39
+ - Requests/sec: ~324
40
+ - Average latency: ~305 ms
41
+ - Total requests handled: 9,721
42
+ - Hardware: Raspberry Pi 5(8 Gb) (single board computer)
43
+ - Server: Rubee app hosted via Nginx + HTTPS
44
+
45
+ This demonstrates RUBEEโ€™s efficient architecture and suitability for lightweight deployments โ€” even on low-power hardware.
46
+
18
47
  ## Content
19
48
 
20
49
  - [Installation](#installation)
@@ -35,44 +64,49 @@ Want to get a quick API server up and runing? You can do it for real quick!
35
64
  - [Modular](#modualar-application)
36
65
  - [Logger](#logger)
37
66
 
67
+ You can read it on the demo [site](https://rubee.dedyn.io/)
68
+
69
+ ๐Ÿšง The doc site is on uodate mode now. We are working on it.
70
+ Please refer to downbelow documentation.
71
+
38
72
  ## Features
39
73
 
40
- ๐Ÿ Lightweight โ€“ A minimal footprint focused on serving Ruby applications efficiently.
74
+ Lightweight โ€“ A minimal footprint focused on serving Ruby applications efficiently.
41
75
  <br>
42
- ๐Ÿงฉ Modular โ€“ A modular approach to application development. Build modular monoliths with ease by attaching \
76
+ Modular โ€“ A modular approach to application development. Build modular monoliths with ease by attaching \
43
77
  as many subprojects as you need.
44
78
  <br>
45
- ๐Ÿ“œ Contract-driven โ€“ Define your API contracts in a simple, declarative way, then generate all the boilerplate you need.
79
+ Contract-driven โ€“ Define your API contracts in a simple, declarative way, then generate all the boilerplate you need.
46
80
  <br>
47
- โšก Fast โ€“ Optimized for speed, providing quick responses. (Everything is relative, we know! ๐Ÿ˜„)
81
+ Fast โ€“ Optimized for speed, providing quick responses. (Everything is relative, we know! ๐Ÿ˜„)
48
82
  <br>
49
- ๐Ÿงฑ Rack-powered โ€“ Built on Rack. The full Rack API is available for easy integration.
83
+ Rack-powered โ€“ Built on Rack. The full Rack API is available for easy integration.
50
84
  <br>
51
- ๐Ÿ—„๏ธ Databases โ€“ Supports SQLite3, PostgreSQL, MySQL, and more via the Sequel gem.
85
+ Databases โ€“ Supports SQLite3, PostgreSQL, MySQL, and more via the Sequel gem.
52
86
  <br>
53
- ๐Ÿ–ผ๏ธ Views โ€“ JSON, ERB, and plain HTML out of the box.
87
+ Views โ€“ JSON, ERB, and plain HTML out of the box.
54
88
  <br>
55
- โš›๏ธ React Ready โ€“ React is supported as a first-class Rubee view engine.
89
+ React Ready โ€“ React is supported as a first-class Rubee view engine.
56
90
  <br>
57
- ๐Ÿ“ฆ Bundlable โ€“ Charge your Rubee app with any gem you need. Update effortlessly via Bundler.
91
+ Bundlable โ€“ Charge your Rubee app with any gem you need. Update effortlessly via Bundler.
58
92
  <br>
59
- ๐Ÿงฌ ORM-agnostic โ€“ Models are native ORM objects, but you can use them as blueprints for any data source.
93
+ ORM-agnostic โ€“ Models are native ORM objects, but you can use them as blueprints for any data source.
60
94
  <br>
61
- ๐Ÿ” Authenticatable โ€“ Easily add JWT authentication to any controller action.
95
+ Authenticatable โ€“ Easily add JWT authentication to any controller action.
62
96
  <br>
63
- ๐Ÿช Hooks โ€“ Add logic before, after, or around any controller action.
97
+ Hooks โ€“ Add logic before, after, or around any controller action.
64
98
  <br>
65
- ๐Ÿงช Testable โ€“ Run all or selected tests using fast, beloved Minitest.
99
+ Testable โ€“ Run all or selected tests using fast, beloved Minitest.
66
100
  <br>
67
- ๐Ÿ‘ท Asyncable โ€“ Plug in async adapters and use any popular background job engine.
101
+ Asyncable โ€“ Plug in async adapters and use any popular background job engine.
68
102
  <br>
69
- โŒจ๏ธ Console โ€“ Start an interactive console and reload on the fly.
103
+ Console โ€“ Start an interactive console and reload on the fly.
70
104
  <br>
71
- โš™๏ธ Background Jobs โ€“ Schedule and process background jobs using your preferred async stack.
105
+ Background Jobs โ€“ Schedule and process background jobs using your preferred async stack.
72
106
 
73
107
  ## Installation
74
108
 
75
- 1. Install ruBee
109
+ 1. Install RUBEE
76
110
  ```bash
77
111
  gem install ru.Bee
78
112
  ```
@@ -97,7 +131,7 @@ Make sure:
97
131
  bundle install
98
132
  ```
99
133
 
100
- 4. Run ruBee server. Default port is 7000
134
+ 4. Run RUBEE server. Default port is 7000
101
135
  ```bash
102
136
  rubee start # or rubee start_dev for development
103
137
 
@@ -158,7 +192,7 @@ This will generate the following files
158
192
  [Back to content](#content)
159
193
 
160
194
  ## Model
161
- Model in ruBee is just simple ruby object that can be serilalized in the view
195
+ Model in RUBEE is just simple ruby object that can be serilalized in the view
162
196
  in the way it required (ie json).
163
197
  Here below is a simple example on how it can be used by rendering json from in memory object
164
198
 
@@ -510,13 +544,13 @@ Will generate:
510
544
 
511
545
  ### Modualar application
512
546
 
513
- You can also use ruBee to create modular applications.\
547
+ You can also use RUBEE to create modular applications.\
514
548
  And attach as many subprojects you need.
515
549
  Main philosophy of attach functinality is to keep the main project clean and easy to maintain. It will still\
516
550
  share data with the main app. So where to define a border between the main app and subprojects is up to developer.
517
551
  Howerver by attching new subproject you will get a new folder and files configured and namespaced respectively.
518
552
 
519
- So if you need to extend your main app with a separate project, you can do it easily in ruBee.
553
+ So if you need to extend your main app with a separate project, you can do it easily in RUBEE.
520
554
  1. Attach new subrpoject
521
555
 
522
556
  ```bash
@@ -585,7 +619,7 @@ rubee start # or rubee start_dev for development
585
619
  [Back to content](#content)
586
620
 
587
621
  ## Views
588
- View in ruBee is just a plain html/erb/react file that can be rendered from the controller.
622
+ View in RUBEE is just a plain html/erb/react file that can be rendered from the controller.
589
623
 
590
624
  ## Templates over erb
591
625
 
@@ -663,6 +697,9 @@ So that will ensure all cahnges applying instantly.
663
697
 
664
698
  6. You can generate react view from the route by indicating the view name explicitly
665
699
 
700
+ 7. Do not forget to rebuild react app in production by running `rubee react build`. This is unnecessary in development,
701
+ when you use `rubee react watch` tho. So it does rebuild automatically.
702
+
666
703
  ```ruby
667
704
  # config/routes.rb
668
705
  Rubee::Router.draw do |router|
@@ -727,7 +764,7 @@ function Users() {
727
764
 
728
765
  ## Object hooks
729
766
 
730
- In ruBee by extending Hookable module any Ruby object can be charged with hooks (logic),
767
+ In RUBEE by extending Hookable module any Ruby object can be charged with hooks (logic),
731
768
  that can be executed before, after and around a specific method execution.
732
769
 
733
770
  Here below a controller example. However it can be used in any Ruby object, like Model etc.
@@ -858,7 +895,7 @@ rubee test auth_tokenable_test.rb # run specific tests
858
895
  [Back to content](#content)
859
896
 
860
897
 
861
- If you want to run any ruBee command within a specific ENV make sure you added it before a command.
898
+ If you want to run any RUBEE command within a specific ENV make sure you added it before a command.
862
899
  For instance if you want to run console in test environment you need to run the following command
863
900
 
864
901
  ```bash
@@ -992,11 +1029,14 @@ When you trigger the controller action, the logs will look like this:
992
1029
 
993
1030
  ### Contributing
994
1031
 
995
- If you are interested in contributing to ruBee,
996
- please read the [Contributing](https://github.com/nucleom42/rubee/blob/main/CONTRIBUTING.md) guide.
1032
+ If you are interested in contributing to RUBEE,
1033
+ please read the [Contributing]()https://github.com/nucleom42/rubee/blob/main/contribution.md) guide.
997
1034
  Also feel free to open an [issue](https://github.com/nucleom42/rubee/issues) if you apot one.
998
1035
  Have an idea or you wnat to discuss something?
999
1036
  Please open a [discussion](https://github.com/nucleom42/rubee/discussions)
1000
1037
 
1038
+ ## Roadmap
1039
+ Please refer the [Roadmap](https://github.com/nucleom42/rubee/blob/main/roadmap.md)
1040
+
1001
1041
  ## License
1002
1042
  This project is released under the [MIT License](https://github.com/nucleom42/rubee/blob/main/LICENSE).
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ru.Bee
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.13
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleg Saltykov
@@ -300,7 +300,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
300
300
  - !ruby/object:Gem::Version
301
301
  version: '0'
302
302
  requirements: []
303
- rubygems_version: 3.6.9
303
+ rubygems_version: 3.7.0
304
304
  specification_version: 4
305
305
  summary: Fast and lightweight Ruby application server designed for minimalism and
306
306
  flexibility