iruby 0.4.0 → 0.7.1

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ubuntu.yml +69 -0
  3. data/CHANGES.md +219 -0
  4. data/Gemfile +0 -2
  5. data/LICENSE +1 -1
  6. data/README.md +81 -62
  7. data/Rakefile +10 -10
  8. data/ci/Dockerfile.main.erb +1 -3
  9. data/iruby.gemspec +13 -19
  10. data/lib/iruby.rb +6 -6
  11. data/lib/iruby/backend.rb +38 -10
  12. data/lib/iruby/command.rb +2 -6
  13. data/lib/iruby/display.rb +216 -81
  14. data/lib/iruby/event_manager.rb +40 -0
  15. data/lib/iruby/formatter.rb +3 -3
  16. data/lib/iruby/input.rb +6 -6
  17. data/lib/iruby/input/autoload.rb +1 -1
  18. data/lib/iruby/input/builder.rb +4 -4
  19. data/lib/iruby/input/button.rb +2 -2
  20. data/lib/iruby/input/cancel.rb +1 -1
  21. data/lib/iruby/input/checkbox.rb +3 -3
  22. data/lib/iruby/input/date.rb +3 -3
  23. data/lib/iruby/input/field.rb +2 -2
  24. data/lib/iruby/input/file.rb +3 -3
  25. data/lib/iruby/input/form.rb +6 -6
  26. data/lib/iruby/input/label.rb +4 -4
  27. data/lib/iruby/input/multiple.rb +10 -10
  28. data/lib/iruby/input/popup.rb +2 -2
  29. data/lib/iruby/input/radio.rb +6 -6
  30. data/lib/iruby/input/select.rb +8 -8
  31. data/lib/iruby/input/textarea.rb +1 -1
  32. data/lib/iruby/input/widget.rb +2 -2
  33. data/lib/iruby/jupyter.rb +1 -0
  34. data/lib/iruby/kernel.rb +157 -29
  35. data/lib/iruby/ostream.rb +27 -10
  36. data/lib/iruby/session.rb +1 -0
  37. data/lib/iruby/session_adapter.rb +7 -3
  38. data/lib/iruby/session_adapter/pyzmq_adapter.rb +11 -10
  39. data/lib/iruby/session_adapter/test_adapter.rb +49 -0
  40. data/lib/iruby/utils.rb +15 -0
  41. data/lib/iruby/version.rb +1 -1
  42. data/run-test.sh +1 -1
  43. data/test/helper.rb +136 -0
  44. data/test/integration_test.rb +1 -2
  45. data/test/iruby/backend_test.rb +37 -0
  46. data/test/iruby/command_test.rb +0 -1
  47. data/test/iruby/display_test.rb +188 -0
  48. data/test/iruby/event_manager_test.rb +92 -0
  49. data/test/iruby/jupyter_test.rb +0 -1
  50. data/test/iruby/kernel_test.rb +185 -0
  51. data/test/iruby/mime_test.rb +50 -0
  52. data/test/iruby/multi_logger_test.rb +0 -4
  53. data/test/iruby/session_adapter/cztop_adapter_test.rb +1 -1
  54. data/test/iruby/session_adapter/ffirzmq_adapter_test.rb +1 -1
  55. data/test/iruby/session_adapter/session_adapter_test_base.rb +1 -3
  56. data/test/iruby/session_adapter_test.rb +42 -67
  57. data/test/iruby/session_test.rb +10 -15
  58. data/test/run-test.rb +19 -0
  59. metadata +74 -62
  60. data/.travis.yml +0 -41
  61. data/CHANGES +0 -143
  62. data/CONTRIBUTORS +0 -19
  63. data/lib/iruby/session/rbczmq.rb +0 -72
  64. data/lib/iruby/session_adapter/rbczmq_adapter.rb +0 -33
  65. data/test/iruby/session_adapter/rbczmq_adapter_test.rb +0 -37
  66. data/test/test_helper.rb +0 -48
@@ -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
@@ -1,4 +1,3 @@
1
- require 'test_helper'
2
1
  require 'iruby/jupyter'
3
2
 
4
3
  module IRubyTest
@@ -0,0 +1,185 @@
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_result", "execute_reply" ],
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
+
153
+ sub_test_case("#switch_backend!") do
154
+ sub_test_case("") do
155
+ def test_switch_backend
156
+ classes = []
157
+
158
+ # First pick the default backend class
159
+ classes << @kernel.instance_variable_get(:@backend).class
160
+
161
+ @kernel.switch_backend!(:pry)
162
+ classes << @kernel.instance_variable_get(:@backend).class
163
+
164
+ @kernel.switch_backend!(:irb)
165
+ classes << @kernel.instance_variable_get(:@backend).class
166
+
167
+ @kernel.switch_backend!(:pry)
168
+ classes << @kernel.instance_variable_get(:@backend).class
169
+
170
+ @kernel.switch_backend!(:plain)
171
+ classes << @kernel.instance_variable_get(:@backend).class
172
+
173
+ assert_equal([
174
+ IRuby::PlainBackend,
175
+ IRuby::PryBackend,
176
+ IRuby::PlainBackend,
177
+ IRuby::PryBackend,
178
+ IRuby::PlainBackend
179
+ ],
180
+ classes)
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,50 @@
1
+ class IRubyTest::MimeTest < IRubyTest::TestBase
2
+ sub_test_case("IRuby::Display") do
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>"
7
+
8
+ obj = Object.new
9
+ obj.define_singleton_method(:to_s) { html }
10
+
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
+
23
+ test("image/svg+xml") do
24
+ data = '<svg height="30" width="100"><text x="0" y="15" fill="red">SVG</text></svg>'
25
+ res = IRuby::Display.display(data, mime: "image/svg+xml")
26
+ assert_equal(data,
27
+ res["image/svg+xml"])
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ sub_test_case("Rendering a file") do
34
+ def setup
35
+ @html = "<b>Bold Text</b>"
36
+ Dir.mktmpdir do |tmpdir|
37
+ @file = File.join(tmpdir, "test.html")
38
+ File.write(@file, @html)
39
+ yield
40
+ end
41
+ end
42
+
43
+ def test_display
44
+ File.open(@file, "rb") do |f|
45
+ res = IRuby::Display.display(f)
46
+ assert_equal(@html, res["text/html"])
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,7 +1,3 @@
1
- require 'stringio'
2
- require 'test_helper'
3
- require 'iruby/logger'
4
-
5
1
  class IRubyTest::MultiLoggerTest < IRubyTest::TestBase
6
2
  def test_multilogger
7
3
  out, err = StringIO.new, StringIO.new
@@ -13,7 +13,7 @@ module IRubyTest
13
13
  end
14
14
 
15
15
  def test_recv
16
- skip
16
+ omit
17
17
  end
18
18
  end
19
19
  end
@@ -13,7 +13,7 @@ module IRubyTest
13
13
  end
14
14
 
15
15
  def test_recv
16
- skip
16
+ omit
17
17
  end
18
18
  end
19
19
  end
@@ -1,5 +1,3 @@
1
- require 'test_helper'
2
-
3
1
  module IRubyTest
4
2
  class SessionAdapterTestBase < TestBase
5
3
  # https://jupyter-client.readthedocs.io/en/stable/kernels.html#connection-files
@@ -22,7 +20,7 @@ module IRubyTest
22
20
  @session_adapter = adapter_class.new(@config)
23
21
 
24
22
  unless adapter_class.available?
25
- skip "#{@session_adapter.name} is unavailable"
23
+ omit("#{@session_adapter.name} is unavailable")
26
24
  end
27
25
  end
28
26
  end
@@ -1,5 +1,3 @@
1
- require 'test_helper'
2
-
3
1
  module IRubyTest
4
2
  class SessionAdapterTest < TestBase
5
3
  def test_available_p_return_false_when_load_error
@@ -12,76 +10,49 @@ module IRubyTest
12
10
  refute subclass.available?
13
11
  end
14
12
 
15
- def test_select_adapter_class_with_rbczmq
16
- IRuby::SessionAdapter::RbczmqAdapter.stub :available?, true do
17
- IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
18
- IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
19
- IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
20
- cls = IRuby::SessionAdapter.select_adapter_class
21
- assert_equal IRuby::SessionAdapter::RbczmqAdapter, cls
22
- end
23
- end
24
- end
25
- end
26
- end
27
-
28
13
  def test_select_adapter_class_with_cztop
29
- IRuby::SessionAdapter::CztopAdapter.stub :available?, true do
30
- IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
31
- IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
32
- IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
33
- cls = IRuby::SessionAdapter.select_adapter_class
34
- assert_equal IRuby::SessionAdapter::CztopAdapter, cls
35
- end
36
- end
37
- end
14
+ assert_rr do
15
+ stub(IRuby::SessionAdapter::CztopAdapter).available? { true }
16
+ stub(IRuby::SessionAdapter::FfirzmqAdapter).available? { false }
17
+ stub(IRuby::SessionAdapter::PyzmqAdapter).available? { false }
18
+
19
+ cls = IRuby::SessionAdapter.select_adapter_class
20
+ assert_equal IRuby::SessionAdapter::CztopAdapter, cls
38
21
  end
39
22
  end
40
23
 
41
24
  def test_select_adapter_class_with_ffirzmq
42
- IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, true do
43
- IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
44
- IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
45
- IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
46
- cls = IRuby::SessionAdapter.select_adapter_class
47
- assert_equal IRuby::SessionAdapter::FfirzmqAdapter, cls
48
- end
49
- end
50
- end
25
+ assert_rr do
26
+ stub(IRuby::SessionAdapter::FfirzmqAdapter).available? { true }
27
+ stub(IRuby::SessionAdapter::CztopAdapter).available? { false }
28
+ stub(IRuby::SessionAdapter::PyzmqAdapter).available? { false }
29
+
30
+ cls = IRuby::SessionAdapter.select_adapter_class
31
+ assert_equal IRuby::SessionAdapter::FfirzmqAdapter, cls
51
32
  end
52
33
  end
53
34
 
54
35
  def test_select_adapter_class_with_pyzmq
55
- IRuby::SessionAdapter::PyzmqAdapter.stub :available?, true do
56
- IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
57
- IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
58
- IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
59
- cls = IRuby::SessionAdapter.select_adapter_class
60
- assert_equal IRuby::SessionAdapter::PyzmqAdapter, cls
61
- end
62
- end
63
- end
64
- end
65
- end
66
- def test_select_adapter_class_with_env
67
- with_env('IRUBY_SESSION_ADAPTER' => 'rbczmq') do
68
- IRuby::SessionAdapter::RbczmqAdapter.stub :available?, true do
69
- assert_equal IRuby::SessionAdapter::RbczmqAdapter, IRuby::SessionAdapter.select_adapter_class
70
- end
36
+ omit("pyzmq adapter is disabled")
37
+ assert_rr do
38
+ stub(IRuby::SessionAdapter::PyzmqAdapter).available? { true }
39
+ stub(IRuby::SessionAdapter::FfirzmqAdapter).available? { false }
40
+ stub(IRuby::SessionAdapter::CztopAdapter).available? { false }
71
41
 
72
- IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
73
- assert_raises IRuby::SessionAdapterNotFound do
74
- IRuby::SessionAdapter.select_adapter_class
75
- end
76
- end
42
+ cls = IRuby::SessionAdapter.select_adapter_class
43
+ assert_equal IRuby::SessionAdapter::PyzmqAdapter, cls
77
44
  end
45
+ end
78
46
 
47
+ def test_select_adapter_class_with_env
79
48
  with_env('IRUBY_SESSION_ADAPTER' => 'cztop') do
80
- IRuby::SessionAdapter::CztopAdapter.stub :available?, true do
49
+ assert_rr do
50
+ stub(IRuby::SessionAdapter::CztopAdapter).available? { true }
81
51
  assert_equal IRuby::SessionAdapter::CztopAdapter, IRuby::SessionAdapter.select_adapter_class
82
52
  end
83
53
 
84
- IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
54
+ assert_rr do
55
+ stub(IRuby::SessionAdapter::CztopAdapter).available? { false }
85
56
  assert_raises IRuby::SessionAdapterNotFound do
86
57
  IRuby::SessionAdapter.select_adapter_class
87
58
  end
@@ -89,11 +60,13 @@ module IRubyTest
89
60
  end
90
61
 
91
62
  with_env('IRUBY_SESSION_ADAPTER' => 'ffi-rzmq') do
92
- IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, true do
63
+ assert_rr do
64
+ stub(IRuby::SessionAdapter::FfirzmqAdapter).available? { true }
93
65
  assert_equal IRuby::SessionAdapter::FfirzmqAdapter, IRuby::SessionAdapter.select_adapter_class
94
66
  end
95
67
 
96
- IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
68
+ assert_rr do
69
+ stub(IRuby::SessionAdapter::FfirzmqAdapter).available? { false }
97
70
  assert_raises IRuby::SessionAdapterNotFound do
98
71
  IRuby::SessionAdapter.select_adapter_class
99
72
  end
@@ -101,15 +74,17 @@ module IRubyTest
101
74
  end
102
75
 
103
76
  with_env('IRUBY_SESSION_ADAPTER' => 'pyzmq') do
104
- IRuby::SessionAdapter::PyzmqAdapter.stub :available?, true do
105
- assert_equal IRuby::SessionAdapter::PyzmqAdapter, IRuby::SessionAdapter.select_adapter_class
106
- end
107
-
108
- IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
109
- assert_raises IRuby::SessionAdapterNotFound do
110
- IRuby::SessionAdapter.select_adapter_class
111
- end
112
- end
77
+ # pyzmq adapter is disabled
78
+ #
79
+ # IRuby::SessionAdapter::PyzmqAdapter.stub :available?, true do
80
+ # assert_equal IRuby::SessionAdapter::PyzmqAdapter, IRuby::SessionAdapter.select_adapter_class
81
+ # end
82
+ #
83
+ # IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
84
+ # assert_raises IRuby::SessionAdapterNotFound do
85
+ # IRuby::SessionAdapter.select_adapter_class
86
+ # end
87
+ # end
113
88
  end
114
89
  end
115
90
  end