iruby 0.4.0 → 0.7.1

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