iruby 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|