From f8c388d75e68e9abf12be6e5f1d6421dc0b717cc Mon Sep 17 00:00:00 2001 From: TheBlackArroVV Date: Sun, 26 Jan 2025 16:17:31 +0000 Subject: [PATCH 1/4] Add default FiberScheduler to rage console --- lib/rage/cli.rb | 1 + spec/rage/cli_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/rage/cli.rb b/lib/rage/cli.rb index 371d387..7e17834 100644 --- a/lib/rage/cli.rb +++ b/lib/rage/cli.rb @@ -151,6 +151,7 @@ def console require "irb" environment + Fiber.set_scheduler(Rage::FiberScheduler.new) ARGV.clear IRB.start end diff --git a/spec/rage/cli_spec.rb b/spec/rage/cli_spec.rb index 3fa0836..12c1713 100644 --- a/spec/rage/cli_spec.rb +++ b/spec/rage/cli_spec.rb @@ -35,4 +35,24 @@ expect { rage_cli.version }.to output("1.0.0\n").to_stdout end end + + describe "#console" do + require "irb" + + let(:fiber_scheduler) do + instance_double("Rage::FiberScheduler", block: true, unblock: true, kernel_sleep: true, io_wait: true) + end + + before do + allow(Rage::FiberScheduler).to receive(:new).and_return(fiber_scheduler) + allow(rage_cli).to receive(:environment).and_return(true) + allow(IRB).to receive(:start).and_return(true) + end + + it "setups FiberScheduler before running console" do + expect(Fiber).to receive(:set_scheduler).with(fiber_scheduler) + + rage_cli.console + end + end end From a8be7680010d53f5391efc144d8ce45f8d9febcf Mon Sep 17 00:00:00 2001 From: TheBlackArroVV Date: Sun, 26 Jan 2025 23:14:52 +0000 Subject: [PATCH 2/4] feat: mock Fiber for cli and rspec --- lib/rage/cli.rb | 2 +- lib/rage/rspec.rb | 17 +---------------- lib/rage/sync_fiber.rb | 16 ++++++++++++++++ spec/rage/cli_spec.rb | 20 -------------------- spec/rage/sync_fiber_spec.rb | 21 +++++++++++++++++++++ 5 files changed, 39 insertions(+), 37 deletions(-) create mode 100644 lib/rage/sync_fiber.rb create mode 100644 spec/rage/sync_fiber_spec.rb diff --git a/lib/rage/cli.rb b/lib/rage/cli.rb index 7e17834..b89757d 100644 --- a/lib/rage/cli.rb +++ b/lib/rage/cli.rb @@ -3,6 +3,7 @@ require "thor" require "rack" require "rage/version" +require "rage/sync_fiber" module Rage class CLICodeGenerator < Thor @@ -151,7 +152,6 @@ def console require "irb" environment - Fiber.set_scheduler(Rage::FiberScheduler.new) ARGV.clear IRB.start end diff --git a/lib/rage/rspec.rb b/lib/rage/rspec.rb index 0cf4beb..c3b75ac 100644 --- a/lib/rage/rspec.rb +++ b/lib/rage/rspec.rb @@ -2,6 +2,7 @@ require "rack/test" require "json" +require "rage/sync_fiber" # set up environment ENV["RAGE_ENV"] ||= "test" @@ -14,22 +15,6 @@ # verify the environment abort("The test suite is running in #{Rage.env} mode instead of 'test'!") unless Rage.env.test? -# mock fiber methods as RSpec tests don't run concurrently -class Fiber - def self.schedule(&block) - fiber = Fiber.new(blocking: true) do - Fiber.current.__set_id - Fiber.current.__set_result(block.call) - end - fiber.resume - - fiber - end - - def self.await(fibers) - Array(fibers).map(&:__get_result) - end -end # define request helpers module RageRequestHelpers diff --git a/lib/rage/sync_fiber.rb b/lib/rage/sync_fiber.rb new file mode 100644 index 0000000..d604920 --- /dev/null +++ b/lib/rage/sync_fiber.rb @@ -0,0 +1,16 @@ +# mock fiber methods as RSpec tests don't run concurrently +class Fiber + def self.schedule(&block) + fiber = Fiber.new(blocking: true) do + Fiber.current.__set_id + Fiber.current.__set_result(block.call) + end + fiber.resume + + fiber + end + + def self.await(fibers) + Array(fibers).map(&:__get_result) + end +end diff --git a/spec/rage/cli_spec.rb b/spec/rage/cli_spec.rb index 12c1713..3fa0836 100644 --- a/spec/rage/cli_spec.rb +++ b/spec/rage/cli_spec.rb @@ -35,24 +35,4 @@ expect { rage_cli.version }.to output("1.0.0\n").to_stdout end end - - describe "#console" do - require "irb" - - let(:fiber_scheduler) do - instance_double("Rage::FiberScheduler", block: true, unblock: true, kernel_sleep: true, io_wait: true) - end - - before do - allow(Rage::FiberScheduler).to receive(:new).and_return(fiber_scheduler) - allow(rage_cli).to receive(:environment).and_return(true) - allow(IRB).to receive(:start).and_return(true) - end - - it "setups FiberScheduler before running console" do - expect(Fiber).to receive(:set_scheduler).with(fiber_scheduler) - - rage_cli.console - end - end end diff --git a/spec/rage/sync_fiber_spec.rb b/spec/rage/sync_fiber_spec.rb new file mode 100644 index 0000000..f26fe92 --- /dev/null +++ b/spec/rage/sync_fiber_spec.rb @@ -0,0 +1,21 @@ +require "rage/sync_fiber" + +RSpec.describe Fiber do + describe ".schedule" do + let(:fiber_instance) { instance_double(Fiber) } + + it "runs immediately" do + expect(Fiber).to receive(:new).with(blocking: true).and_return(fiber_instance) + expect(fiber_instance).to receive(:resume).and_return(true) + expect(described_class.schedule { rand }).to eq(fiber_instance) + end + end + + describe ".await" do + let(:fiber_instance) { instance_double(Fiber, __get_result: 10) } + + it "immediately returns result" do + expect(described_class.await([fiber_instance])).to eq([10]) + end + end +end From f1873c313e76fac1956dda253eb3be1e6fa3f0d5 Mon Sep 17 00:00:00 2001 From: TheBlackArroVV Date: Sun, 26 Jan 2025 23:16:44 +0000 Subject: [PATCH 3/4] fix linter --- lib/rage/rspec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/rage/rspec.rb b/lib/rage/rspec.rb index c3b75ac..01d06ca 100644 --- a/lib/rage/rspec.rb +++ b/lib/rage/rspec.rb @@ -15,7 +15,6 @@ # verify the environment abort("The test suite is running in #{Rage.env} mode instead of 'test'!") unless Rage.env.test? - # define request helpers module RageRequestHelpers include Rack::Test::Methods From c0f46d11a868a472f634966cdabadde1bf64dcf7 Mon Sep 17 00:00:00 2001 From: TheBlackArroVV Date: Tue, 28 Jan 2025 00:15:04 +0000 Subject: [PATCH 4/4] inline file --- lib/rage/cli.rb | 18 +++++++++++++++++- lib/rage/rspec.rb | 18 +++++++++++++++++- lib/rage/sync_fiber.rb | 16 ---------------- spec/rage/sync_fiber_spec.rb | 21 --------------------- 4 files changed, 34 insertions(+), 39 deletions(-) delete mode 100644 lib/rage/sync_fiber.rb delete mode 100644 spec/rage/sync_fiber_spec.rb diff --git a/lib/rage/cli.rb b/lib/rage/cli.rb index b89757d..9983d6d 100644 --- a/lib/rage/cli.rb +++ b/lib/rage/cli.rb @@ -3,7 +3,23 @@ require "thor" require "rack" require "rage/version" -require "rage/sync_fiber" + +# mock fiber methods as RSpec tests don't run concurrently +class Fiber + def self.schedule(&block) + fiber = Fiber.new(blocking: true) do + Fiber.current.__set_id + Fiber.current.__set_result(block.call) + end + fiber.resume + + fiber + end + + def self.await(fibers) + Array(fibers).map(&:__get_result) + end +end module Rage class CLICodeGenerator < Thor diff --git a/lib/rage/rspec.rb b/lib/rage/rspec.rb index 01d06ca..0cf4beb 100644 --- a/lib/rage/rspec.rb +++ b/lib/rage/rspec.rb @@ -2,7 +2,6 @@ require "rack/test" require "json" -require "rage/sync_fiber" # set up environment ENV["RAGE_ENV"] ||= "test" @@ -15,6 +14,23 @@ # verify the environment abort("The test suite is running in #{Rage.env} mode instead of 'test'!") unless Rage.env.test? +# mock fiber methods as RSpec tests don't run concurrently +class Fiber + def self.schedule(&block) + fiber = Fiber.new(blocking: true) do + Fiber.current.__set_id + Fiber.current.__set_result(block.call) + end + fiber.resume + + fiber + end + + def self.await(fibers) + Array(fibers).map(&:__get_result) + end +end + # define request helpers module RageRequestHelpers include Rack::Test::Methods diff --git a/lib/rage/sync_fiber.rb b/lib/rage/sync_fiber.rb deleted file mode 100644 index d604920..0000000 --- a/lib/rage/sync_fiber.rb +++ /dev/null @@ -1,16 +0,0 @@ -# mock fiber methods as RSpec tests don't run concurrently -class Fiber - def self.schedule(&block) - fiber = Fiber.new(blocking: true) do - Fiber.current.__set_id - Fiber.current.__set_result(block.call) - end - fiber.resume - - fiber - end - - def self.await(fibers) - Array(fibers).map(&:__get_result) - end -end diff --git a/spec/rage/sync_fiber_spec.rb b/spec/rage/sync_fiber_spec.rb deleted file mode 100644 index f26fe92..0000000 --- a/spec/rage/sync_fiber_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require "rage/sync_fiber" - -RSpec.describe Fiber do - describe ".schedule" do - let(:fiber_instance) { instance_double(Fiber) } - - it "runs immediately" do - expect(Fiber).to receive(:new).with(blocking: true).and_return(fiber_instance) - expect(fiber_instance).to receive(:resume).and_return(true) - expect(described_class.schedule { rand }).to eq(fiber_instance) - end - end - - describe ".await" do - let(:fiber_instance) { instance_double(Fiber, __get_result: 10) } - - it "immediately returns result" do - expect(described_class.await([fiber_instance])).to eq([10]) - end - end -end