itsi 0.2.7 → 0.2.8

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: e6032d30eaeb45f3c548f5c04516ac6f0a6013dab27366ebd728ae18d9182363
4
- data.tar.gz: 77d245ba4031de6b51d3bf8ce28ec719ea182c8a29cb335bad2a8ca9b9d8af6f
3
+ metadata.gz: 79c36b477ccc4ed0f1327f160d6a0c0d53d8a0524f3458d98ed3ddefa5e59e72
4
+ data.tar.gz: eb43759f50d8eb8f62c7a8dbfcf71bea68ccda7b441877cc356cfba827d58612
5
5
  SHA512:
6
- metadata.gz: cc89a4390491739d8519c2314f3d95924f4746362a66dc2884ed6df28bda3333e22a44c84514b07df41aa53cd582e05193e766451aaea3835853c0dff5a0ad61
7
- data.tar.gz: 6087eb3b4d8123168c23ceea92d60e5740db8cc7638d95f1952493bc57d8b46b091f8778a5845de9e8008f9b55ffc4e21bd08ed185a89eccbdb41dcf7117b60a
6
+ metadata.gz: 201903b6a53a8f29f916711b4cffa67ae2f67737cff05c7ddae1016ba928f3c0704656a17ab8739d05da1ac2ff8ff15d3b26fb89527ebbf47b128af022a21953
7
+ data.tar.gz: 7752aa84a9af2d8f8be6f52b714b73ce47c0cb6b19833f65248cacb8d7967f14ed89d387e7243c7663634305c169492566c0709534e0d33063e7c5e200a506f8
data/Cargo.lock CHANGED
@@ -1644,7 +1644,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1644
1644
 
1645
1645
  [[package]]
1646
1646
  name = "itsi-scheduler"
1647
- version = "0.2.7"
1647
+ version = "0.2.8"
1648
1648
  dependencies = [
1649
1649
  "bytes",
1650
1650
  "derive_more",
@@ -1662,7 +1662,7 @@ dependencies = [
1662
1662
 
1663
1663
  [[package]]
1664
1664
  name = "itsi-server"
1665
- version = "0.2.7"
1665
+ version = "0.2.8"
1666
1666
  dependencies = [
1667
1667
  "argon2",
1668
1668
  "async-channel",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "itsi-scheduler"
3
- version = "0.2.7"
3
+ version = "0.2.8"
4
4
  edition = "2021"
5
5
  authors = ["Wouter Coppieters <wc@pico.net.nz>"]
6
6
  license = "MIT"
@@ -7,7 +7,7 @@ use itsi_error::ItsiError;
7
7
  use itsi_rb_helpers::{call_without_gvl, create_ruby_thread};
8
8
  use magnus::{
9
9
  error::Result as MagnusResult,
10
- value::{InnerValue, Opaque, ReprValue},
10
+ value::{InnerValue, Lazy, LazyId, Opaque, ReprValue},
11
11
  Module, RClass, Ruby, Value,
12
12
  };
13
13
  use mio::{Events, Poll, Token, Waker};
@@ -19,7 +19,7 @@ use std::{
19
19
  time::Duration,
20
20
  };
21
21
  use timer::Timer;
22
- use tracing::{debug, info, warn};
22
+ use tracing::{debug, error, info, warn};
23
23
 
24
24
  #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
25
25
  pub(crate) struct Readiness(i16);
@@ -31,6 +31,9 @@ impl std::fmt::Debug for ItsiScheduler {
31
31
  }
32
32
 
33
33
  const WAKE_TOKEN: Token = Token(0);
34
+ static ID_CURRENT: LazyId = LazyId::new("current");
35
+ static CLASS_FIBER: Lazy<RClass> =
36
+ Lazy::new(|ruby| ruby.module_kernel().const_get("Fiber").unwrap());
34
37
 
35
38
  #[magnus::wrap(class = "Itsi::Scheduler", free_immediately, size)]
36
39
  pub(crate) struct ItsiScheduler {
@@ -225,14 +228,17 @@ impl ItsiScheduler {
225
228
  let result: Arc<RwLock<Option<T>>> = Arc::new(RwLock::new(None));
226
229
  let result_clone = Arc::clone(&result);
227
230
 
228
- let current_fiber = Opaque::from(ruby.fiber_current());
229
- let scheduler = Opaque::from(
230
- ruby.module_kernel()
231
- .const_get::<_, RClass>("Fiber")
232
- .unwrap()
233
- .funcall::<_, _, Value>("scheduler", ())
234
- .unwrap(),
235
- );
231
+ let class_fiber = ruby.get_inner(&CLASS_FIBER);
232
+ let current_fiber = ruby
233
+ .get_inner(&CLASS_FIBER)
234
+ .funcall::<_, _, Value>(*ID_CURRENT, ());
235
+
236
+ if current_fiber.is_err() {
237
+ error!("Failed to get current fiber");
238
+ return Err(ItsiError::ArgumentError("Failed to get current fiber".to_string()).into());
239
+ }
240
+ let current_fiber = Opaque::from(current_fiber.unwrap());
241
+ let scheduler = Opaque::from(class_fiber.funcall::<_, _, Value>("scheduler", ()).unwrap());
236
242
 
237
243
  create_ruby_thread(move || {
238
244
  call_without_gvl(|| {
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "itsi-server"
3
- version = "0.2.7"
3
+ version = "0.2.8"
4
4
  edition = "2021"
5
5
  authors = ["Wouter Coppieters <wc@pico.net.nz>"]
6
6
  license = "MIT"
@@ -7,7 +7,7 @@ next: /getting_started
7
7
 
8
8
  Itsi bundles a slew of essential modern web features into a single, easy-to-use package.
9
9
  Here's a list of the essentials.
10
- Or jump straight in to <a target="_blank" href="tsi](/getting_started)">install</a> and <a target="_blank" href="t](/configuration)"> configure</a> for a deeper dive.
10
+ Or jump straight in to <a target="_blank" href="/getting_started">install</a> and <a target="_blank" href="/configuration">configure</a> for a deeper dive.
11
11
 
12
12
  {{< callout >}}
13
13
  You don't need to use all of the features listed below to benefit from Itsi. E.g.
@@ -5,7 +5,6 @@ weight: 2
5
5
  prev: features/
6
6
  next: getting_started/local_development/
7
7
  ---
8
-
9
8
  {{% steps %}}
10
9
 
11
10
  ### Step 1 - Install Ruby
@@ -26,34 +25,60 @@ Install Ruby
26
25
  apt-get install build-essential libclang-dev
27
26
  ```
28
27
 
29
- Then use `gem` to install the Itsi package. This will in turn install both the
30
- `itsi-server` gem, and the `itsi-scheduler` gem.
31
-
28
+ Then use `gem` to install Itsi, or its components based on your Ruby version.
32
29
 
30
+ **For Ruby >= 3.1**:
33
31
  ```bash
34
32
  gem install itsi
35
33
  ```
34
+ *(Installs both `itsi-server` and `itsi-scheduler`)*
35
+
36
+ **For Ruby 2.7 – 3.0**:
37
+ ```bash
38
+ gem install itsi-server
39
+ ```
40
+ *(Installs `itsi-server` only; `itsi-scheduler` is not supported on Ruby < 3.1)*
36
41
 
37
42
  {{< callout type="info" >}}
38
- If you wish to use either the scheduler or server independently, these can be installed individually
39
- by running `gem install itsi-server` or `gem install itsi-scheduler`.
43
+ Itsi (**server + scheduler**) requires **Ruby >= 3.1**.
44
+
45
+ Itsi **server** supports **Ruby >= 2.7**.
46
+
47
+ If you wish to use either the scheduler or server independently:
48
+ - `gem install itsi-server`
49
+ - `gem install itsi-scheduler` (Ruby >= 3.1 only)
50
+
40
51
  {{< /callout >}}
41
52
 
42
53
  {{< /tab >}}
43
54
  {{< tab >}}
44
55
  **Mac**:
56
+ **For Ruby >= 3.1**:
45
57
  ```bash
46
58
  gem install itsi
47
59
  ```
60
+
61
+ **For Ruby 2.7 – 3.0**:
62
+ ```bash
63
+ gem install itsi-server
64
+ ```
65
+
48
66
  {{< callout type="info" >}}
49
- If you wish to use either the scheduler or server independently, these can be installed individually
50
- by running `gem install itsi-server` or `gem install itsi-scheduler`.
67
+ Itsi (**server + scheduler**) requires **Ruby >= 3.1**.
68
+
69
+ Itsi **server** supports **Ruby >= 2.7**.
70
+
71
+ You can install components individually:
72
+ - `gem install itsi-server`
73
+ - `gem install itsi-scheduler` (Ruby >= 3.1 only)
74
+
75
+ ⚠️ Scheduler is not compatible with Ruby 3.0.
51
76
  {{< /callout >}}
52
77
 
53
78
  {{< /tab >}}
54
- {{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs well on [https://learn.microsoft.com/en-us/windows/wsl/install](WSL).
79
+ {{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs well on [WSL](https://learn.microsoft.com/en-us/windows/wsl/install).
55
80
 
56
- Follow the linked instructions to Install a linux distribution like Ubuntu or Debian and then follow the instructions in the Linux tab.
81
+ Follow the linked instructions to install a Linux distribution like Ubuntu or Debian, and then follow the instructions in the Linux tab.
57
82
  {{< /tab >}}
58
83
 
59
84
  {{< /tabs >}}
@@ -62,7 +87,6 @@ Install Ruby
62
87
 
63
88
  Great! You now have Itsi installed. Go to one of the following pages to learn how to use it:
64
89
 
65
-
66
90
  {{< cards >}}
67
91
  {{< card link="./local_development" title="Local Development" icon="star" >}}
68
92
  {{< card link="../options" title="Options" icon="adjustments" >}}
@@ -213,7 +213,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
213
213
 
214
214
  [[package]]
215
215
  name = "itsi-scheduler"
216
- version = "0.2.7"
216
+ version = "0.2.8"
217
217
  dependencies = [
218
218
  "bytes",
219
219
  "derive_more",
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = "Itsi Scheduler - A light-weight Fiber Scheduler implementation for Ruby"
13
13
  spec.homepage = "https://itsi.fyi"
14
14
  spec.license = "MIT"
15
- spec.required_ruby_version = ">= 3.0.0"
15
+ spec.required_ruby_version = ">= 3.1"
16
16
  spec.required_rubygems_version = ">= 3.1.11"
17
17
 
18
18
  spec.metadata["homepage_uri"] = spec.homepage
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Scheduler
5
- VERSION = "0.2.7"
5
+ VERSION = "0.2.8"
6
6
  end
7
7
  end
@@ -94,14 +94,26 @@ class TestActiveRecordFiberScheduler < Minitest::Test
94
94
 
95
95
  with_scheduler do |_scheduler|
96
96
  Fiber.schedule do
97
- ActiveRecord::Base.connection_pool.with_connection(prevent_permanent_checkout: true) do
98
- results << ActiveRecord::Base.connection.select_value("SELECT 1")
97
+ if ActiveRecord::Base.connection_pool.method(:with_connection).arity == 0
98
+ ActiveRecord::Base.connection_pool.with_connection do
99
+ results << ActiveRecord::Base.connection.select_value("SELECT 1")
100
+ end
101
+ else
102
+ ActiveRecord::Base.connection_pool.with_connection(prevent_permanent_checkout: true) do
103
+ results << ActiveRecord::Base.connection.select_value("SELECT 1")
104
+ end
99
105
  end
100
106
  end
101
107
 
102
108
  Fiber.schedule do
103
- ActiveRecord::Base.connection_pool.with_connection(prevent_permanent_checkout: true) do
104
- results << ActiveRecord::Base.connection.select_value("SELECT 2")
109
+ if ActiveRecord::Base.connection_pool.method(:with_connection).arity == 0
110
+ ActiveRecord::Base.connection_pool.with_connection do
111
+ results << ActiveRecord::Base.connection.select_value("SELECT 2")
112
+ end
113
+ else
114
+ ActiveRecord::Base.connection_pool.with_connection(prevent_permanent_checkout: true) do
115
+ results << ActiveRecord::Base.connection.select_value("SELECT 2")
116
+ end
105
117
  end
106
118
  end
107
119
  end
@@ -181,44 +181,47 @@ class TestNestedFibers < Minitest::Test
181
181
  assert_equal [0, 1, 2, 3, 4, 5, 6, 7], results
182
182
  end
183
183
 
184
- def test_nested_unowned_fibers_with_scheduler
185
- results = []
186
- out, err = capture_subprocess_io do
187
- begin
188
- with_scheduler do |scheduler|
189
- Fiber.new do
190
- fib = Fiber.new do
191
- results << 4
192
- sleep 0.001
193
- results << 5
194
- sleep 0.001
195
- results << 6
196
- end
197
-
184
+ if RUBY_VERSION >= '3.2'
185
+ def test_nested_unowned_fibers_with_scheduler
186
+ results = []
187
+ out, err = capture_subprocess_io do
188
+ begin
189
+ with_scheduler do |scheduler|
198
190
  Fiber.new do
199
- results << 0
200
- sleep 0.001
201
- Fiber.new do
202
- results << 1
203
- sleep 0.1
204
- results << 8
205
- end.transfer
206
- results << 2
207
- end.resume
208
-
209
- results << 3
191
+ fib = Fiber.new do
192
+ results << 4
193
+ sleep 0.001
194
+ results << 5
195
+ sleep 0.001
196
+ results << 6
197
+ end
210
198
 
211
- fib.resume
212
- sleep 0.01
213
- results << 7
214
- end.transfer
199
+ Fiber.new do
200
+ results << 0
201
+ sleep 0.001
202
+ puts "Launch and transfer"
203
+ Fiber.new do
204
+ results << 1
205
+ sleep 0.1
206
+ results << 8
207
+ end.transfer
208
+ results << 2
209
+ end.resume
210
+
211
+ results << 3
212
+
213
+ fib.resume
214
+ sleep 0.01
215
+ results << 7
216
+ end.transfer
217
+ end
218
+ rescue
215
219
  end
216
- rescue
217
220
  end
221
+ # Transfered fibers are not resumed after yielding out.
222
+ assert_equal [0, 3, 4, 1, 5, 6], results
223
+ # assert_match /attempt to yield on a not resumed fiber/, out
218
224
  end
219
- # Transfered fibers are not resumed after yielding out.
220
- assert_equal [0, 3, 4, 1, 5, 6], results
221
- # assert_match /attempt to yield on a not resumed fiber/, out
222
225
  end
223
226
 
224
227
  def test_nested_unowned_fibers_no_scheduler
@@ -1644,7 +1644,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1644
1644
 
1645
1645
  [[package]]
1646
1646
  name = "itsi-server"
1647
- version = "0.2.7"
1647
+ version = "0.2.8"
1648
1648
  dependencies = [
1649
1649
  "argon2",
1650
1650
  "async-channel",
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_dependency "rack", ">= 1.6"
40
40
  spec.add_dependency "json", '~> 2'
41
41
  spec.add_dependency "rb_sys", "~> 0.9.91"
42
+ spec.add_dependency 'prism', '~> 1.4'
42
43
 
43
44
  spec.add_development_dependency "ruby-lsp"
44
45
  # For more information and examples about making a new gem, check out our
@@ -42,7 +42,16 @@ module Itsi
42
42
  end
43
43
 
44
44
  def self.included(cls) # rubocop:disable Metrics/PerceivedComplexity,Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
45
+
46
+ class << cls
47
+ def subclasses
48
+ @subclasses ||= []
49
+ end
50
+ end
51
+
45
52
  def cls.inherited(base) # rubocop:disable Metrics/MethodLength,Lint/MissingSuper,Metrics/PerceivedComplexity
53
+ self.subclasses << base
54
+
46
55
  %i[detail documentation insert_text schema].each do |attr|
47
56
  base.define_singleton_method(attr) do |value = nil|
48
57
  @middleware_class_attrs ||= {}
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Server
5
- VERSION = "0.2.7"
5
+ VERSION = "0.2.8"
6
6
  end
7
7
  end
@@ -75,6 +75,8 @@ class TestRackServer < Minitest::Test
75
75
  end
76
76
 
77
77
  def test_scheduler_non_blocking
78
+ return unless RUBY_VERSION > "3.1"
79
+
78
80
  server(
79
81
  itsi_rb: lambda do
80
82
  fiber_scheduler "Itsi::Scheduler"
data/lib/itsi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Itsi
2
- VERSION = "0.2.7"
2
+ VERSION = "0.2.8"
3
3
  end
data/tasks.txt CHANGED
@@ -1,8 +1,6 @@
1
- 0.2.6:
2
- - Opt in to gRPC compression override, per endpoint or per service
3
-
1
+ Tasks:
4
2
  - Static ruby build
5
- - Add hook to opt non Itsi.rb files into LSP
3
+ - Add way to opt non Itsi.rb files into LSP
6
4
  - OTel
7
5
  - Even faster Hash creation for Rack
8
6
  - Image resizer
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itsi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
@@ -15,28 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.2.7
18
+ version: 0.2.8
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.2.7
25
+ version: 0.2.8
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: itsi-server
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: 0.2.7
32
+ version: 0.2.8
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.2.7
39
+ version: 0.2.8
40
40
  description: Wrapper Gem for both the Itsi server and the Itsi Fiber scheduler
41
41
  email:
42
42
  - wc@pico.net.nz
@@ -1035,7 +1035,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
1035
1035
  requirements:
1036
1036
  - - ">="
1037
1037
  - !ruby/object:Gem::Version
1038
- version: '2.7'
1038
+ version: '3.1'
1039
1039
  required_rubygems_version: !ruby/object:Gem::Requirement
1040
1040
  requirements:
1041
1041
  - - ">="