iruby 0.5.0 → 0.6.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 +4 -4
- data/CHANGES +14 -0
- data/iruby.gemspec +0 -1
- data/lib/iruby.rb +1 -0
- data/lib/iruby/backend.rb +21 -7
- data/lib/iruby/display.rb +12 -1
- data/lib/iruby/event_manager.rb +40 -0
- data/lib/iruby/kernel.rb +40 -6
- data/lib/iruby/ostream.rb +5 -0
- data/lib/iruby/session_adapter.rb +6 -0
- data/lib/iruby/session_adapter/test_adapter.rb +49 -0
- data/lib/iruby/version.rb +1 -1
- data/test/helper.rb +43 -0
- data/test/iruby/event_manager_test.rb +92 -0
- data/test/iruby/kernel_test.rb +153 -0
- data/test/iruby/mime_test.rb +18 -7
- data/test/iruby/session_test.rb +1 -0
- data/test/run-test.rb +1 -0
- metadata +8 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc4c6b99aa811b7b1e6bf3e845c7dfa023dc26ce929dbc284836081d422c4b5f
|
4
|
+
data.tar.gz: f68c0f62665ec6bb302e460885ca6e54e93f7102b3cdf699cb67143155a6181a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2de933258f837300d49209e51140276d9373ab6497c716cfe590d8e9e989d89a7e8e12410e4275c20d065e0fdfe1221c88074eb172bcadbab07c58077009d118
|
7
|
+
data.tar.gz: 3dfa8d4abbe218873e42626056d68bc24e2372f153f18316eb152ce08aa1f95c68b301cb41f7cf154ae8b5bb94324e9071296ff67f90325aed5b08dfa123cecd
|
data/CHANGES
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
0.6.0 (2021-05-25)
|
2
|
+
|
3
|
+
Bug Fixes:
|
4
|
+
* Fix the handling of application/javascript https://github.com/SciRuby/iruby/issues/292, https://github.com/SciRuby/iruby/pull/294 (@kylekyle, @mrkn)
|
5
|
+
|
6
|
+
Enhancements:
|
7
|
+
* Add the `initialized` event in `IRuby::Kernel` class https://github.com/SciRuby/iruby/pull/168, https://github.com/SciRuby/iruby/pull/296 (@Yuki-Inoue, @mrkn)
|
8
|
+
* Add the following four events https://github.com/SciRuby/iruby/pull/295 (@mrkn):
|
9
|
+
* `pre-execute` -- occurs before every code execution
|
10
|
+
* `pre-run-cell` -- occurs before every non-silent code execution
|
11
|
+
* `post-execute` -- occurs after every code execution
|
12
|
+
* `post-run-cell` -- occurs after every non-silent code execution
|
13
|
+
* Replace Bond with IRB in PlainBackend https://github.com/SciRuby/iruby/pull/276, https://github.com/SciRuby/iruby/pull/297 (@cfis, @mrkn)
|
14
|
+
|
1
15
|
0.5.0 (2021-03-25)
|
2
16
|
|
3
17
|
Bug Fixes:
|
data/iruby.gemspec
CHANGED
data/lib/iruby.rb
CHANGED
data/lib/iruby/backend.rb
CHANGED
@@ -3,7 +3,7 @@ module IRuby
|
|
3
3
|
|
4
4
|
module History
|
5
5
|
def eval(code, store_history)
|
6
|
-
b =
|
6
|
+
b = eval_binding
|
7
7
|
|
8
8
|
b.local_variable_set(:_ih, In) unless b.local_variable_defined?(:_ih)
|
9
9
|
b.local_variable_set(:_oh, Out) unless b.local_variable_defined?(:_oh)
|
@@ -36,17 +36,27 @@ module IRuby
|
|
36
36
|
prepend History
|
37
37
|
|
38
38
|
def initialize
|
39
|
-
require '
|
40
|
-
|
41
|
-
|
39
|
+
require 'irb'
|
40
|
+
require 'irb/completion'
|
41
|
+
IRB.setup(nil)
|
42
|
+
@main = TOPLEVEL_BINDING.eval("self").dup
|
43
|
+
@workspace = IRB::WorkSpace.new(@main)
|
44
|
+
@irb = IRB::Irb.new(@workspace)
|
45
|
+
@eval_path = @irb.context.irb_path
|
46
|
+
IRB.conf[:MAIN_CONTEXT] = @irb.context
|
47
|
+
end
|
48
|
+
|
49
|
+
def eval_binding
|
50
|
+
@workspace.binding
|
42
51
|
end
|
43
52
|
|
44
53
|
def eval(code, store_history)
|
45
|
-
|
54
|
+
@irb.context.evaluate(code, 0)
|
55
|
+
@irb.context.last_value
|
46
56
|
end
|
47
57
|
|
48
58
|
def complete(code)
|
49
|
-
|
59
|
+
IRB::InputCompletor::CompletionProc.call(code)
|
50
60
|
end
|
51
61
|
end
|
52
62
|
|
@@ -64,6 +74,10 @@ module IRuby
|
|
64
74
|
reset
|
65
75
|
end
|
66
76
|
|
77
|
+
def eval_binding
|
78
|
+
TOPLEVEL_BINDING
|
79
|
+
end
|
80
|
+
|
67
81
|
def eval(code, store_history)
|
68
82
|
Pry.current_line = 1
|
69
83
|
@pry.last_result = nil
|
@@ -96,7 +110,7 @@ module IRuby
|
|
96
110
|
end
|
97
111
|
|
98
112
|
def reset
|
99
|
-
@pry = Pry.new(output: $stdout, target:
|
113
|
+
@pry = Pry.new(output: $stdout, target: eval_binding)
|
100
114
|
end
|
101
115
|
end
|
102
116
|
end
|
data/lib/iruby/display.rb
CHANGED
@@ -44,7 +44,18 @@ module IRuby
|
|
44
44
|
private
|
45
45
|
|
46
46
|
def protect(mime, data)
|
47
|
-
|
47
|
+
ascii?(mime) ? data.to_s : [data.to_s].pack('m0')
|
48
|
+
end
|
49
|
+
|
50
|
+
def ascii?(mime)
|
51
|
+
case mime
|
52
|
+
when "application/javascript"
|
53
|
+
# Special case for application/javascript.
|
54
|
+
# This needs because mime-types tells us application/javascript a non-text type.
|
55
|
+
true
|
56
|
+
else
|
57
|
+
MIME::Type.new(mime).ascii?
|
58
|
+
end
|
48
59
|
end
|
49
60
|
|
50
61
|
def render(data, obj, exact_mime, fuzzy_mime)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module IRuby
|
2
|
+
class EventManager
|
3
|
+
def initialize(available_events)
|
4
|
+
@available_events = available_events.dup.freeze
|
5
|
+
@callbacks = available_events.map {|n| [n, []] }.to_h
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :available_events
|
9
|
+
|
10
|
+
def register(event, &block)
|
11
|
+
check_available_event(event)
|
12
|
+
@callbacks[event] << block unless block.nil?
|
13
|
+
block
|
14
|
+
end
|
15
|
+
|
16
|
+
def unregister(event, callback)
|
17
|
+
check_available_event(event)
|
18
|
+
val = @callbacks[event].delete(callback)
|
19
|
+
unless val
|
20
|
+
raise ArgumentError,
|
21
|
+
"Given callable object #{callback} is not registered as a #{event} callback"
|
22
|
+
end
|
23
|
+
val
|
24
|
+
end
|
25
|
+
|
26
|
+
def trigger(event, *args, **kwargs)
|
27
|
+
check_available_event(event)
|
28
|
+
@callbacks[event].each do |fn|
|
29
|
+
fn.call(*args, **kwargs)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def check_available_event(event)
|
36
|
+
return if @callbacks.key?(event)
|
37
|
+
raise ArgumentError, "Unknown event name: #{event}", caller
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/iruby/kernel.rb
CHANGED
@@ -1,30 +1,47 @@
|
|
1
1
|
module IRuby
|
2
|
+
ExecutionInfo = Struct.new(:raw_cell, :store_history, :silent)
|
3
|
+
|
2
4
|
class Kernel
|
3
5
|
RED = "\e[31m"
|
4
6
|
RESET = "\e[0m"
|
5
7
|
|
6
|
-
|
8
|
+
@events = EventManager.new([:initialized])
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_reader :events
|
7
12
|
attr_accessor :instance
|
8
13
|
end
|
9
14
|
|
10
15
|
attr_reader :session
|
11
16
|
|
12
|
-
|
17
|
+
EVENTS = [
|
18
|
+
:pre_execute,
|
19
|
+
:pre_run_cell,
|
20
|
+
:post_run_cell,
|
21
|
+
:post_execute
|
22
|
+
].freeze
|
23
|
+
|
24
|
+
def initialize(config_file, session_adapter_name=nil)
|
13
25
|
@config = MultiJson.load(File.read(config_file))
|
14
26
|
IRuby.logger.debug("IRuby kernel start with config #{@config}")
|
15
27
|
Kernel.instance = self
|
16
28
|
|
17
|
-
@session = Session.new(@config)
|
29
|
+
@session = Session.new(@config, session_adapter_name)
|
18
30
|
$stdout = OStream.new(@session, :stdout)
|
19
31
|
$stderr = OStream.new(@session, :stderr)
|
20
32
|
|
21
33
|
init_parent_process_poller
|
22
34
|
|
35
|
+
@events = EventManager.new(EVENTS)
|
23
36
|
@execution_count = 0
|
24
37
|
@backend = create_backend
|
25
38
|
@running = true
|
39
|
+
|
40
|
+
self.class.events.trigger(:initialized, self)
|
26
41
|
end
|
27
42
|
|
43
|
+
attr_reader :events
|
44
|
+
|
28
45
|
def create_backend
|
29
46
|
PryBackend.new
|
30
47
|
rescue Exception => e
|
@@ -83,8 +100,20 @@ module IRuby
|
|
83
100
|
|
84
101
|
def execute_request(msg)
|
85
102
|
code = msg[:content]['code']
|
86
|
-
|
87
|
-
|
103
|
+
store_history = msg[:content]['store_history']
|
104
|
+
silent = msg[:content]['silent']
|
105
|
+
|
106
|
+
@execution_count += 1 if store_history
|
107
|
+
|
108
|
+
unless silent
|
109
|
+
@session.send(:publish, :execute_input, code: code, execution_count: @execution_count)
|
110
|
+
end
|
111
|
+
|
112
|
+
events.trigger(:pre_execute)
|
113
|
+
unless silent
|
114
|
+
exec_info = ExecutionInfo.new(code, store_history, silent)
|
115
|
+
events.trigger(:pre_run_cell, exec_info)
|
116
|
+
end
|
88
117
|
|
89
118
|
content = {
|
90
119
|
status: :ok,
|
@@ -92,9 +121,10 @@ module IRuby
|
|
92
121
|
user_expressions: {},
|
93
122
|
execution_count: @execution_count
|
94
123
|
}
|
124
|
+
|
95
125
|
result = nil
|
96
126
|
begin
|
97
|
-
result = @backend.eval(code,
|
127
|
+
result = @backend.eval(code, store_history)
|
98
128
|
rescue SystemExit
|
99
129
|
content[:payload] << { source: :ask_exit }
|
100
130
|
rescue Exception => e
|
@@ -103,6 +133,10 @@ module IRuby
|
|
103
133
|
content[:status] = :error
|
104
134
|
content[:execution_count] = @execution_count
|
105
135
|
end
|
136
|
+
|
137
|
+
events.trigger(:post_execute)
|
138
|
+
events.trigger(:post_run_cell, result) unless silent
|
139
|
+
|
106
140
|
@session.send(:reply, :execute_reply, content)
|
107
141
|
@session.send(:publish, :execute_result,
|
108
142
|
data: Display.display(result),
|
data/lib/iruby/ostream.rb
CHANGED
@@ -10,6 +10,10 @@ module IRuby
|
|
10
10
|
false
|
11
11
|
end
|
12
12
|
|
13
|
+
def self.load_requirements
|
14
|
+
# Do nothing
|
15
|
+
end
|
16
|
+
|
13
17
|
def initialize(config)
|
14
18
|
@config = config
|
15
19
|
end
|
@@ -37,12 +41,14 @@ module IRuby
|
|
37
41
|
require_relative 'session_adapter/ffirzmq_adapter'
|
38
42
|
require_relative 'session_adapter/cztop_adapter'
|
39
43
|
require_relative 'session_adapter/pyzmq_adapter'
|
44
|
+
require_relative 'session_adapter/test_adapter'
|
40
45
|
|
41
46
|
def self.select_adapter_class(name=nil)
|
42
47
|
classes = {
|
43
48
|
'ffi-rzmq' => SessionAdapter::FfirzmqAdapter,
|
44
49
|
'cztop' => SessionAdapter::CztopAdapter,
|
45
50
|
# 'pyzmq' => SessionAdapter::PyzmqAdapter
|
51
|
+
'test' => SessionAdapter::TestAdapter,
|
46
52
|
}
|
47
53
|
if (name ||= ENV.fetch('IRUBY_SESSION_ADAPTER', nil))
|
48
54
|
cls = classes[name]
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'iruby/session/mixin'
|
2
|
+
|
3
|
+
module IRuby
|
4
|
+
module SessionAdapter
|
5
|
+
class TestAdapter < BaseAdapter
|
6
|
+
include IRuby::SessionSerialize
|
7
|
+
|
8
|
+
DummySocket = Struct.new(:type, :protocol, :host, :port)
|
9
|
+
|
10
|
+
def initialize(config)
|
11
|
+
super
|
12
|
+
|
13
|
+
unless config['key'].empty? || config['signature_scheme'].empty?
|
14
|
+
unless config['signature_scheme'] =~ /\Ahmac-/
|
15
|
+
raise "Unknown signature_scheme: #{config['signature_scheme']}"
|
16
|
+
end
|
17
|
+
digest_algorithm = config['signature_scheme'][/\Ahmac-(.*)\Z/, 1]
|
18
|
+
@hmac = OpenSSL::HMAC.new(config['key'], OpenSSL::Digest.new(digest_algorithm))
|
19
|
+
end
|
20
|
+
|
21
|
+
@send_callback = nil
|
22
|
+
@recv_callback = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_accessor :send_callback, :recv_callback
|
26
|
+
|
27
|
+
def send(sock, data)
|
28
|
+
unless @send_callback.nil?
|
29
|
+
@send_callback.call(sock, unserialize(data))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def recv(sock)
|
34
|
+
unless @recv_callback.nil?
|
35
|
+
serialize(@recv_callback.call(sock))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def heartbeat_loop(sock)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def make_socket(type, protocol, host, port)
|
45
|
+
DummySocket.new(type, protocol, host, port)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/iruby/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,10 +1,53 @@
|
|
1
1
|
require "iruby"
|
2
|
+
require "iruby/logger"
|
3
|
+
require "json"
|
4
|
+
require 'multi_json'
|
5
|
+
require "pathname"
|
2
6
|
require "test/unit"
|
3
7
|
require "test/unit/rr"
|
4
8
|
require "tmpdir"
|
5
9
|
|
10
|
+
|
11
|
+
IRuby.logger = IRuby::MultiLogger.new(*Logger.new(STDERR, level: Logger::Severity::INFO))
|
12
|
+
|
6
13
|
module IRubyTest
|
7
14
|
class TestBase < Test::Unit::TestCase
|
15
|
+
def self.startup
|
16
|
+
@__config_dir = Dir.mktmpdir("iruby-test")
|
17
|
+
@__config_path = Pathname.new(@__config_dir) + "config.json"
|
18
|
+
File.write(@__config_path, {
|
19
|
+
control_port: 50160,
|
20
|
+
shell_port: 57503,
|
21
|
+
transport: "tcp",
|
22
|
+
signature_scheme: "hmac-sha256",
|
23
|
+
stdin_port: 52597,
|
24
|
+
hb_port: 42540,
|
25
|
+
ip: "127.0.0.1",
|
26
|
+
iopub_port: 40885,
|
27
|
+
key: "a0436f6c-1916-498b-8eb9-e81ab9368e84"
|
28
|
+
}.to_json)
|
29
|
+
|
30
|
+
@__original_kernel_instance = IRuby::Kernel.instance
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.shutdown
|
34
|
+
FileUtils.remove_entry_secure(@__config_dir)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.test_config_filename
|
38
|
+
@__config_path.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
def teardown
|
42
|
+
IRuby::Kernel.instance = @__original_kernel_instance
|
43
|
+
end
|
44
|
+
|
45
|
+
def with_session_adapter(session_adapter_name)
|
46
|
+
IRuby::Kernel.new(self.class.test_config_filename, session_adapter_name)
|
47
|
+
$stdout = STDOUT
|
48
|
+
$stderr = STDERR
|
49
|
+
end
|
50
|
+
|
8
51
|
def assert_output(stdout=nil, stderr=nil)
|
9
52
|
flunk "assert_output requires a block to capture output." unless block_given?
|
10
53
|
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module IRubyTest
|
2
|
+
class EventManagerTest < TestBase
|
3
|
+
def setup
|
4
|
+
@man = IRuby::EventManager.new([:foo, :bar])
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_available_events
|
8
|
+
assert_equal([:foo, :bar],
|
9
|
+
@man.available_events)
|
10
|
+
end
|
11
|
+
|
12
|
+
sub_test_case("#register") do
|
13
|
+
sub_test_case("known event name") do
|
14
|
+
def test_register
|
15
|
+
fn = ->() {}
|
16
|
+
assert_equal(fn,
|
17
|
+
@man.register(:foo, &fn))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
sub_test_case("unknown event name") do
|
22
|
+
def test_register
|
23
|
+
assert_raise_message("Unknown event name: baz") do
|
24
|
+
@man.register(:baz) {}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
sub_test_case("#unregister") do
|
31
|
+
sub_test_case("no event is registered") do
|
32
|
+
def test_unregister
|
33
|
+
fn = ->() {}
|
34
|
+
assert_raise_message("Given callable object #{fn} is not registered as a foo callback") do
|
35
|
+
@man.unregister(:foo, fn)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
sub_test_case("the registered callable is given") do
|
41
|
+
def test_unregister
|
42
|
+
results = { values: [] }
|
43
|
+
fn = ->(a) { values << a }
|
44
|
+
|
45
|
+
@man.register(:foo, &fn)
|
46
|
+
|
47
|
+
results[:retval] = @man.unregister(:foo, fn)
|
48
|
+
|
49
|
+
@man.trigger(:foo, 42)
|
50
|
+
|
51
|
+
assert_equal({
|
52
|
+
values: [],
|
53
|
+
retval: fn
|
54
|
+
},
|
55
|
+
results)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
sub_test_case("#trigger") do
|
61
|
+
sub_test_case("no event is registered") do
|
62
|
+
def test_trigger
|
63
|
+
assert_nothing_raised do
|
64
|
+
@man.trigger(:foo)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
sub_test_case("some events are registered") do
|
70
|
+
def test_trigger
|
71
|
+
values = []
|
72
|
+
@man.register(:foo) {|a| values << a }
|
73
|
+
@man.register(:foo) {|a| values << 10*a }
|
74
|
+
@man.register(:foo) {|a| values << 100+a }
|
75
|
+
|
76
|
+
@man.trigger(:foo, 5)
|
77
|
+
|
78
|
+
assert_equal([5, 50, 105],
|
79
|
+
values)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
sub_test_case("unknown event name") do
|
84
|
+
def test_trigger
|
85
|
+
assert_raise_message("Unknown event name: baz") do
|
86
|
+
@man.trigger(:baz, 100)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require "base64"
|
2
|
+
|
3
|
+
module IRubyTest
|
4
|
+
class KernelTest < TestBase
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
with_session_adapter("test")
|
8
|
+
@kernel = IRuby::Kernel.instance
|
9
|
+
end
|
10
|
+
|
11
|
+
sub_test_case("iruby_initialized event") do
|
12
|
+
def setup
|
13
|
+
super
|
14
|
+
@initialized_kernel = nil
|
15
|
+
@callback = IRuby::Kernel.events.register(:initialized) do |kernel|
|
16
|
+
@initialized_kernel = kernel
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
IRuby::Kernel.events.unregister(:initialized, @callback)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_iruby_initialized_event
|
25
|
+
with_session_adapter("test")
|
26
|
+
assert_same(IRuby::Kernel.instance, @initialized_kernel)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_execute_request
|
31
|
+
obj = Object.new
|
32
|
+
|
33
|
+
class << obj
|
34
|
+
def to_html
|
35
|
+
"<b>HTML</b>"
|
36
|
+
end
|
37
|
+
|
38
|
+
def inspect
|
39
|
+
"!!! inspect !!!"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
::IRubyTest.define_singleton_method(:test_object) { obj }
|
44
|
+
|
45
|
+
msg_types = []
|
46
|
+
execute_reply = nil
|
47
|
+
execute_result = nil
|
48
|
+
@kernel.session.adapter.send_callback = ->(sock, msg) do
|
49
|
+
header = msg[:header]
|
50
|
+
content = msg[:content]
|
51
|
+
msg_types << header["msg_type"]
|
52
|
+
case header["msg_type"]
|
53
|
+
when "execute_reply"
|
54
|
+
execute_reply = content
|
55
|
+
when "execute_result"
|
56
|
+
execute_result = content
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
msg = {
|
61
|
+
content: {
|
62
|
+
"code" => "IRubyTest.test_object",
|
63
|
+
"silent" => false,
|
64
|
+
"store_history" => false,
|
65
|
+
"user_expressions" => {},
|
66
|
+
"allow_stdin" => false,
|
67
|
+
"stop_on_error" => true,
|
68
|
+
}
|
69
|
+
}
|
70
|
+
@kernel.execute_request(msg)
|
71
|
+
|
72
|
+
assert_equal({
|
73
|
+
msg_types: [ "execute_input", "execute_reply", "execute_result" ],
|
74
|
+
execute_reply: {
|
75
|
+
status: "ok",
|
76
|
+
user_expressions: {},
|
77
|
+
},
|
78
|
+
execute_result: {
|
79
|
+
data: {
|
80
|
+
"text/html" => "<b>HTML</b>",
|
81
|
+
"text/plain" => "!!! inspect !!!"
|
82
|
+
},
|
83
|
+
metadata: {},
|
84
|
+
}
|
85
|
+
},
|
86
|
+
{
|
87
|
+
msg_types: msg_types,
|
88
|
+
execute_reply: {
|
89
|
+
status: execute_reply["status"],
|
90
|
+
user_expressions: execute_reply["user_expressions"]
|
91
|
+
},
|
92
|
+
execute_result: {
|
93
|
+
data: execute_result["data"],
|
94
|
+
metadata: execute_result["metadata"]
|
95
|
+
}
|
96
|
+
})
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_events_around_of_execute_request
|
100
|
+
event_history = []
|
101
|
+
|
102
|
+
@kernel.events.register(:pre_execute) do
|
103
|
+
event_history << :pre_execute
|
104
|
+
end
|
105
|
+
|
106
|
+
@kernel.events.register(:pre_run_cell) do |exec_info|
|
107
|
+
event_history << [:pre_run_cell, exec_info]
|
108
|
+
end
|
109
|
+
|
110
|
+
@kernel.events.register(:post_execute) do
|
111
|
+
event_history << :post_execute
|
112
|
+
end
|
113
|
+
|
114
|
+
@kernel.events.register(:post_run_cell) do |result|
|
115
|
+
event_history << [:post_run_cell, result]
|
116
|
+
end
|
117
|
+
|
118
|
+
msg = {
|
119
|
+
content: {
|
120
|
+
"code" => "true",
|
121
|
+
"silent" => false,
|
122
|
+
"store_history" => false,
|
123
|
+
"user_expressions" => {},
|
124
|
+
"allow_stdin" => false,
|
125
|
+
"stop_on_error" => true,
|
126
|
+
}
|
127
|
+
}
|
128
|
+
@kernel.execute_request(msg)
|
129
|
+
|
130
|
+
msg = {
|
131
|
+
content: {
|
132
|
+
"code" => "true",
|
133
|
+
"silent" => true,
|
134
|
+
"store_history" => false,
|
135
|
+
"user_expressions" => {},
|
136
|
+
"allow_stdin" => false,
|
137
|
+
"stop_on_error" => true,
|
138
|
+
}
|
139
|
+
}
|
140
|
+
@kernel.execute_request(msg)
|
141
|
+
|
142
|
+
assert_equal([
|
143
|
+
:pre_execute,
|
144
|
+
[:pre_run_cell, IRuby::ExecutionInfo.new("true", false, false)],
|
145
|
+
:post_execute,
|
146
|
+
[:post_run_cell, true],
|
147
|
+
:pre_execute,
|
148
|
+
:post_execute
|
149
|
+
],
|
150
|
+
event_history)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
data/test/iruby/mime_test.rb
CHANGED
@@ -1,14 +1,25 @@
|
|
1
1
|
class IRubyTest::MimeTest < IRubyTest::TestBase
|
2
2
|
sub_test_case("IRuby::Display") do
|
3
|
-
|
4
|
-
|
3
|
+
sub_test_case(".display") do
|
4
|
+
sub_test_case("with mime type") do
|
5
|
+
test("text/html") do
|
6
|
+
html = "<b>Bold Text</b>"
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
obj = Object.new
|
9
|
+
obj.define_singleton_method(:to_s) { html }
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
res = IRuby::Display.display(obj, mime: "text/html")
|
12
|
+
assert_equal({ plain: obj.inspect, html: html },
|
13
|
+
{ plain: res["text/plain"], html: res["text/html"] })
|
14
|
+
end
|
15
|
+
|
16
|
+
test("application/javascript") do
|
17
|
+
data = "alert('Hello World!')"
|
18
|
+
res = IRuby::Display.display(data, mime: "application/javascript")
|
19
|
+
assert_equal(data,
|
20
|
+
res["application/javascript"])
|
21
|
+
end
|
22
|
+
end
|
12
23
|
end
|
13
24
|
end
|
14
25
|
|
data/test/iruby/session_test.rb
CHANGED
@@ -38,6 +38,7 @@ module IRubyTest
|
|
38
38
|
stub(IRuby::SessionAdapter::CztopAdapter).available? { false }
|
39
39
|
stub(IRuby::SessionAdapter::FfirzmqAdapter).available? { false }
|
40
40
|
stub(IRuby::SessionAdapter::PyzmqAdapter).available? { false }
|
41
|
+
stub(IRuby::SessionAdapter::TestAdapter).available? { false }
|
41
42
|
assert_raises IRuby::SessionAdapterNotFound do
|
42
43
|
IRuby::Session.new(@session_config)
|
43
44
|
end
|
data/test/run-test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Mendler
|
@@ -9,22 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-05-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: bond
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '0.5'
|
21
|
-
type: :runtime
|
22
|
-
prerelease: false
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - "~>"
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '0.5'
|
28
14
|
- !ruby/object:Gem::Dependency
|
29
15
|
name: data_uri
|
30
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,6 +154,7 @@ files:
|
|
168
154
|
- lib/iruby/comm.rb
|
169
155
|
- lib/iruby/command.rb
|
170
156
|
- lib/iruby/display.rb
|
157
|
+
- lib/iruby/event_manager.rb
|
171
158
|
- lib/iruby/formatter.rb
|
172
159
|
- lib/iruby/input.rb
|
173
160
|
- lib/iruby/input/README.ipynb
|
@@ -200,6 +187,7 @@ files:
|
|
200
187
|
- lib/iruby/session_adapter/cztop_adapter.rb
|
201
188
|
- lib/iruby/session_adapter/ffirzmq_adapter.rb
|
202
189
|
- lib/iruby/session_adapter/pyzmq_adapter.rb
|
190
|
+
- lib/iruby/session_adapter/test_adapter.rb
|
203
191
|
- lib/iruby/utils.rb
|
204
192
|
- lib/iruby/version.rb
|
205
193
|
- logo/logo-32x32.png
|
@@ -211,7 +199,9 @@ files:
|
|
211
199
|
- test/integration_test.rb
|
212
200
|
- test/iruby/backend_test.rb
|
213
201
|
- test/iruby/command_test.rb
|
202
|
+
- test/iruby/event_manager_test.rb
|
214
203
|
- test/iruby/jupyter_test.rb
|
204
|
+
- test/iruby/kernel_test.rb
|
215
205
|
- test/iruby/mime_test.rb
|
216
206
|
- test/iruby/multi_logger_test.rb
|
217
207
|
- test/iruby/session_adapter/cztop_adapter_test.rb
|
@@ -248,7 +238,9 @@ test_files:
|
|
248
238
|
- test/integration_test.rb
|
249
239
|
- test/iruby/backend_test.rb
|
250
240
|
- test/iruby/command_test.rb
|
241
|
+
- test/iruby/event_manager_test.rb
|
251
242
|
- test/iruby/jupyter_test.rb
|
243
|
+
- test/iruby/kernel_test.rb
|
252
244
|
- test/iruby/mime_test.rb
|
253
245
|
- test/iruby/multi_logger_test.rb
|
254
246
|
- test/iruby/session_adapter/cztop_adapter_test.rb
|